本站使用了 Pjax 等基于 JavaScript 的开发技术,但您的浏览器已禁用 JavaScript,请开启 JavaScript 以保证网站正常显示!

学习opnemp-parallel-for

本文介绍openmp parallel for的使用方法,parallel for的作用是将for循环做并行优化。例如原本有如下的for循环处理程序:

for(int i = 0; i < 10; ++i)
{
    std::cout << i << std::endl;
}

程序非常简单,正常执行结果应为:

0
1
..
9

在这基础之上使用openmp做并行优化非常简单,秩序在for循环代码之前添加下面一句处理

#pragma omp parallel for

    /**
     * 方法一:#pragma omp parallel_for后直接跟随循环
     */
#pragma omp parallel for
    for(int i = 0; i < 10; ++i)
    {
        std::cout << i << std::endl;
    }

或者 parallel与for字段分开声明


    /**
     * 方法二: parallel与for字段分开放置
     */
#pragma omp parallel 
{
#pragma omp for
    for(int i = 0; i < 10; ++i)
    {
    std::cout << i << std::endl;
    }
}

即可完成for循环的并行优化,结果执行可能为:

0
952

8
3
1
6
7

paralel for并行优化非常简单,但需要注意以下两点:

  • 1.for循环索引变量为int类型
for(size_t i = 0; i < 10; ++i) //i不可使用size_t类型
  • 2.循环内数据不能发生依赖关系,必须是互不干扰的
std::vector<int> vec(10, 1);
for(int i = 1; i < 10; ++i)
{
    //数据处理不互相独立,并行优化会存在隐患
    std::cout << vec[i] + [i - 1] << std::endl;
}

最后,测试代码如下:

#include <omp.h>
#include <iostream>

int main(int argc, char** argv)
{
    /**
     * 方法一:#pragma omp parallel_for后直接跟随循环
     */
#pragma omp parallel for
    for(int i = 0; i < 10; ++i)
    {
        std::cout << i << std::endl;
    }

    /**
     * 方法二: parallel与for字段分开放置
     */
#pragma omp parallel 
{
#pragma omp for
    for(int i = 0; i < 10; ++i)
    {
    std::cout << i << std::endl;
    }
}
    /**
     * 要求:
     * 1. for循环索引变量为int类型
     * 2. 循环内数据不能发生依赖关系,必须是互不干扰的
     */
    return 0;
}

并行输出的结果不固定,每次的结果可能都不一样。可能的测试结果为:

0
952

8
3
1
6
7

4
97
0

81
64
52


3

本文练习代码已上传至github:https://github.com/mangosroom/learn-openmp/tree/main/parallel_for


本文由芒果浩明发布,转载请注明出处。
本文链接:https://mangoroom.cn/parallel-programming/learn-openmp-parallel-for.html


 继续浏览关于 c++openmpparallelparallel-forfor 的文章

 本文最后更新于:2021/12/05 14:07:02,可能因经年累月而与现状有所差异

 引用转载请注明:芒果的博客 > 并行编程 > 学习opnemp-parallel-for