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

Parallel processing 复杂openMP代码竞争条件的识别,parallel-processing,openmp,race-condition,Parallel Processing,Openmp,Race Condition,这段openMP代码运行正常,但我需要确保没有竞争条件。因此,我将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)

这段openMP代码运行正常,但我需要确保没有竞争条件。因此,我将
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];
    }               
 } 
#专用(i,j,k)共享(结果缓冲区、事务a、元素b)的pragma omp并行

对于(i=0;i那么,现在的一个问题是你的“外循环”不是外循环,因为你没有把
{}
放在正确的位置

因此,从这个意义上说,不,您没有竞争条件,因为
pragma
将只适用于以下情况:

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

for(i=0;iUm…)是假定在
结果缓冲区[i]之前的第一个
{
=0;
?否。它位于最外层的“For”循环内。如果第一个For循环是一个外循环,请编辑问题以显示这一点。现在,第一个循环本身就是,并且是唯一被并行化的对象。神秘的是:我知道只有第一个外循环被并行化,因为在最外层的“For”上放置了“pragma”循环。我想知道这段代码在索引为“k”的最内层“For”循环中执行的“赋值操作”期间是否会导致竞争条件。result\u buffer[k]=result\u buffer[k]+trans\u a[j*N+k]*element\u b[j];嘿,神秘..你刚刚搞定了。
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];
}