与pragma omp并行的嵌套循环,混淆

时间:2017-04-14 12:02:36

标签: 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的一个值上工作,并且count数组仅取决于i的当前值。如何重写代码以便我可以安全地增加计数?

1 个答案:

答案 0 :(得分:1)

您必须将j声明为私人。您可以通过以下方式明确地执行此操作:

#pragma omp parallel for private(j)

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

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

int count[200];

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

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