删除多余的并行语句时的不同程序行为

Different program behavior when removing superfluous parallel statement

本文关键字:程序 多余 并行 语句 删除      更新时间:2023-10-16

我只是在尝试在较低的代码中查找数据竞赛时被卡住了:

#pragma omp parallel 
{
    #pragma omp for 
    for(i=0; i<m; i++) {
        y[i]=0;
        for(j=0; j<n; j++){
            y[i]=y[i]+A[i][j]*x[j];
        }
    }
}

我对y得到了不同的结果。奇怪的是,当在for:前面添加parallel时,一切似乎都很好

#pragma omp parallel for 

我认为这个关键字在这里是多余的,因为已经有一个并行块了。为什么程序在删除关键字时表现不同?

如果您使并行块嵌套在并行块中,则如果您不激活"嵌套并行性",则它将被忽略omp_set_nested(1);所以使用#pragma omp parallel for,您的代码将使用所有线程执行,并且所有线程执行相同的计算。

如果在并行块中生成#pragma omp for,则不会忽略它。

在内部for循环中,y[i]的值在并行执行中发生变化,同时用作目标和源。