识别复杂的openMP代码的竞争条件

时间:2011-12-16 01:07:41

标签: parallel-processing openmp race-condition

这个openMP Code块正常运行,但我需要确保没有竞争条件。因此,我将j变量设为私有。

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

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

1 个答案:

答案 0 :(得分:2)

嗯,现在的一个问题是你的“外循环”不是外循环,因为你没有{}在正确的地方。

所以从这个意义上说,没有你没有竞争条件,因为pragma只适用于此:

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

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


除此之外,如果您希望您的代码是这样的:

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

#pragma omp parallel for private(i,j,k) shared (result_buffer,trans_a,element_b)
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];
}               

然后是的,你有竞争条件。

您的内部循环修改整个result_buffer数组。外循环的所有迭代也将在同一数据集上发生冲突。 所以会有竞争条件。

就目前而言,可并行化的唯一循环是最内层循环。