- #parama omp parallel 是并行化区域开始的部分
- #parama omp for 后面只能接for循环, 用来自动并行化for循环
- 不检查依赖性. 当存在依赖条件时不会报错, 但可能造成结果错误
- 只支持for循环, 且不能有break
- #parama omp parallel reduction(+:sum) 归约操作, 将相同的归约操作符重复的应用到操作序列上, 自动解决数据依赖的问题
- 并非所有的数据依赖都可以解决, 下面例子中的factor变量就需要手动解决数据依赖
- 支持归约运算的操作符及处值
- + 0; - 0; * 0;
- (位与)& ~0; (位或)| 0; (位异或)^ 0;
- (逻辑与)& 1; (逻辑或)| 0
- # private(list) / shared(list) 多个变量之间用逗号隔开
- 括号里的变量必须提前声明
- 没有显示private或者shared的变量默认是全局变量
- 私有变量也可以直接在共享区域中声明
double factor (int n) { double sum = 0; #pragma omp parallel num_threads(4) reduction(+:sum) { double factor = 1.0; #pragma omp for for (int i = 0; i < n; i++) { factor = (i % 2 == 0)?1:-1; sum += factor/(2 * i + 1); } } return sum*4; }
- 并行区域更改factor 并不会影响外部的全局变量. 相当于是在并行区域又创建了一个同名变量
double factor (int n) { double sum = 0.0; double factor; #pragma omp parallel for num_threads(4) reduction(+:sum) private(factor) for (int i = 0; i < n; i++) { factor = (i % 2 == 0)?1:-1; sum += factor/(2 * i + 1); } return sum*4; }
double factor (int n) { double sum = 0.0; double factor; #pragma omp parallel for num_threads(4) reduction(+:sum) private(factor) for (int i = 0; i < n; i++) { if (i == 10) { printf("%f\n", factor); cout<<omp_get_thread_num()<<endl; cout<<omp_get_num_threads()<<endl; } factor += 1; sum += factor/(2 * i + 1); } cout<<factor<<endl; return sum*4; }
[并行与分布式程序设计] #parama omp parallel for num_threads(4) reduction(+:sum) private(factor)
猜你喜欢
转载自blog.csdn.net/weixin_40996518/article/details/106120274
今日推荐
周排行