2011-12-16 65 views
1

这个openMP代码块运行良好,但我需要确保没有竞争条件。因此,我已将j变量设为私有。复杂的openMP代码竞争条件的识别

通过这样做,我认为任何竞争条件都不应该存在于最内层循环中的赋值操作。如果我错了,请纠正我。

#pragma omp parallel for private(i,j,k) shared (result_buffer,trans_a,element_b) 
for (i=0; i<N; i++) 
result_buffer[i]=0; 
{ 
    for (j = 0; j<(N/comm_size); j++) 
    {    
      for(k=0; k<N; k++) 
      result_buffer[k]=result_buffer[k]+trans_a[j*N+k]*element_b[j]; 
    }    
} 
+0

嗯...是在result_buffer [i] = 0之前的第一个`{`应该*';'? – Mysticial 2011-12-16 01:10:28

+0

没有..它在最外面的'For'循环里面。 – 2011-12-16 01:17:20

回答

2

那么,有一个问题,现在是你的“外循环”不是一个外循环,因为你没有在正确的地点做{}

所以在这个意义上说,不,你没有竞争条件,因为pragma将仅适用于这一点:

for (i=0; i<N; i++) 
    result_buffer[i]=0; 

,而不是代码的其余部分。你的其他两个循环是不是并行化,因此没有竞争条件。


这且不说,如果你打算你的代码是这样的:

​​

然后是的,你有竞争状态。您的内循环修改整个result_buffer数组。外循环的所有迭代也将冲突在相同的数据集上。 所以会有比赛条件。

就像现在这样,可并行化的唯一循环就是最内层循环。