c++ - 我如何在我的代码中使用 openMP?

标签 c++ c multithreading parallel-processing openmp

我开始使用 openMP,我想并行化这部分代码

int A[n][m+1];
int B[k][m];
for (h=0;h<100;h++){
    for (i=0;i<n;i++){p=0;
        for (j=0;j<k;j++){s=0;
            for (l=0;l<m;l++){
                 s+=(A[i][l]-B[j][l]);
             }
          s=sqrt(s);    
          if (j==0) min =s;
           else
            if (min > s){min =s;p=j;}              
       }
    A[i][m]=p;
    }
}

这是我使用 openMP 进行并行化的尝试

#pragma omp parallel for private(s)
 for (h=0;h<100;h++){
    for (i=0;i<n;i++){p=0;
        for (j=0;j<k;j++){s=0;
            for (l=0;l<m;l++){
                 s+=(A[i][l]-B[j][l]);
             }
          s=sqrt(s);    
          if (j==0) min =s;
           else
            if (min > s){min =s;p=j;}              
       }
    A[i][m]=p;
    }
}

我怎样才能正确地做到这一点?我需要你的帮助。

最佳答案

您现在缺少几个方面:

私有(private)变量与共享变量:您不能让多个线程使用相同的变量作为循环计数器或任何其他类型的辅助变量。如果一个线程修改了另一个线程的循环计数器,就会发生困惑。解决方案:指定哪些变量是共享的,哪些是私有(private)的:

#pragma omp parallel for private(s, min, h, i, j, l) shared(n, k, m)

归约:您正在对变量“min”执行归约运算。从 OpenMP 3.1 和 gcc 4.7 开始,您可以让 OpenMP 为您处理这种减少 (*):

#pragma omp parallel for reduction(min : min) private(s, h, i, j, l) shared(n, k, m)
// here the rest of your code

由于操作 min(最小值)的名称和您的 min 变量的名称相同,这段特定的语法变得模糊。现在我不确定您是否真的需要更改变量的名称 - 我认为您不需要 - 但无论如何这是一个好主意。另外,正如评论中已经告诉您的那样,请尽量避免使用字母“l”作为变量名,因为它看起来像数字 1。

(*) 在 OpenMP C 语言的早期版本中,您没有最小/最大缩减,因此您必须在每个线程的私有(private)变量中存储 min 的临时值,然后在循环后、关键部分内或使用原子操作查找全局最小值。

关于c++ - 我如何在我的代码中使用 openMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28029163/

相关文章:

c++ - 并行骑士之旅算法

java - Java流在完成上一个 map 之前开始下一个 map

c++ - 内联函数指针以避免 if 语句

c - 如何在 Mac OS X 上构建包含入口点的 C 程序?

c++ - 字符解码转换函数实现

operating-system - 什么是上下文切换时间?

c++ - Qt错误iso c++禁止比较指针和整数-fpermissive

c++ - 使用 Eclipse 调试 LLVM

c++ - 在 c 中对宏 SQR 求平方感到困惑

有人可以向我解释这有效吗?