Parallel processing 复杂openMP代码竞争条件的识别
这段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)
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];
}