2017-04-14 17 views
1

我想并行化一个代码来运行尖峰神经元网络上的一些模拟。这涉及到一个双重循环,我在主循环外面放置了一个'#pragma omp parallel for'语句。下面的代码:嵌套循环与编译指示omp并行为,jumbling up

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; 
} 

结果看,一些计数的值[I]超过200,即使仅环从1到200计数[I] -j可以是0, 1或-1,但这些值差别很大,甚至认为每个线程都会对i的一个值起作用,并且count数组仅依赖于i的当前值。如何重写代码以便我可以安全地增加计数?

+0

最终值是什么?你可以在这之后添加一个循环来打印所有的值吗? –

+0

在第二个循环之前放置'#pragma omp parallel'。 – purplepsycho

+0

@purplepsycho这只是错误的,会在'count [i]'上创建竞争条件。 – Zulan

回答

1

您必须声明j私人。你可以这样做明确通过:

#pragma omp parallel for private(j) 

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

但是,我强烈建议总是尽可能在本地声明变量al,特别是在使用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打印输出可以显示完全任意值。它访问可能由其他线程同时写入的数据。