[并行与分布式程序设计] #parama omp parallel for num_threads(4) reduction(+:sum) private(factor)

  • #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;
    }
    
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40996518/article/details/106120274