c - 带有 pragma omp parallel for 的嵌套循环,困惑起来

标签 c parallel-processing openmp

我正在尝试并行化代码以在尖峰神经元网络上运行一些模拟。这涉及一个双循环,我在主循环外放置了一条语句“#pragma omp parallel for”。这是代码:

int main(void){

    int i,j,count[200];

    #pragma omp parallel for
    for(i=0;i<200;i++){
        count[i] = 0;
        for (j=0;j<200;j++){
            if (j!=i){
                count[i]++;
                printf("i: %d j: %d count[i]:%d, count[i]-j:%d\n",i,j,count[i], count[i]-j);
            }
        }

    }

    return 0;
}

看结果,count[i] 的一些值超过了 200,即使循环只从 1 到 200。count[i]-j 可以是 0,1 或 -1,但是值差异很大,甚至认为每个线程都会处理 i 的一个值,而计数数组仅取决于 i 的当前值。如何重写代码以便我可以安全地递增计数?

最佳答案

您必须将j 声明为private。您可以通过以下方式明确地这样做:

#pragma omp parallel for private(j)

i 是隐式的 private 作为工作共享循环的循环变量。 count 是隐式共享 因为它是在循环之外定义的。这两者在这里都是可取的。

但是,我强烈建议始终尽可能在本地声明变量,尤其是在使用 OpenMP 时。这样隐式的 private/shared 几乎总是正确的,并且它避免了许多微妙的未定义值读取。这通常是好的做法

int count[200];

#pragma omp parallel for
for(int i=0;i<200;i++){
    count[i] = 0;
    for (int j=0;j<200;j++){

顺便说一句:count[i]-j 的打印输出可以显示完全任意的值。它访问可能由其他线程同时写入的数据。

关于c - 带有 pragma omp parallel for 的嵌套循环,困惑起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411142/

相关文章:

parallel-processing - 与网格或群集相反,什么是服务器场?

java - 如何仍然使用 Future.get 管理并行化?

c - 如何使用指针通过被调用函数在 main 中编辑数组

c - 简单的字节码转换器

c - 如何通过 gatt 从 esp32 的 hid ble 键盘发送扫描代码 >255?

c - C 中的枚举类型变量声明

java - GWT 并行编译与顺序编译

c - OpenMP 中每个线程的私有(private) 'for' 循环

c++ - OpenMP 初学者 - 圈内问题

c++ - 使 Eigen 在多线程中运行