本文介绍openmp parallel for的使用方法,parallel for的作用是将for循环做并行优化。例如原本有如下的for循环处理程序:
1
2
3
4
|
for(int i = 0; i < 10; ++i)
{
std::cout << i << std::endl;
}
|
程序非常简单,正常执行结果应为:
在这基础之上使用openmp做并行优化非常简单,秩序在for循环代码之前添加下面一句处理
1
|
#pragma omp parallel for
|
即
1
2
3
4
5
6
7
8
|
/**
* 方法一:#pragma omp parallel_for后直接跟随循环
*/
#pragma omp parallel for
for(int i = 0; i < 10; ++i)
{
std::cout << i << std::endl;
}
|
或者 parallel与for字段分开声明
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* 方法二: parallel与for字段分开放置
*/
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 10; ++i)
{
std::cout << i << std::endl;
}
}
|
即可完成for循环的并行优化,结果执行可能为:
1
2
3
4
5
6
7
8
|
0
952
8
3
1
6
7
|
paralel for并行优化非常简单,但需要注意以下两点:
1
|
for(size_t i = 0; i < 10; ++i) //i不可使用size_t类型
|
1
2
3
4
5
6
|
std::vector<int> vec(10, 1);
for(int i = 1; i < 10; ++i)
{
//数据处理不互相独立,并行优化会存在隐患
std::cout << vec[i] + [i - 1] << std::endl;
}
|
最后,测试代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#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;
}
|
并行输出的结果不固定,每次的结果可能都不一样。可能的测试结果为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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://blog.mangoeffect.net/parallel-programming/learn-openmp-parallel-for.html