这个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];
}
}
答案 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
数组。外循环的所有迭代也将在同一数据集上发生冲突。
所以会有竞争条件。
就目前而言,可并行化的唯一循环是最内层循环。