删除多余的并行语句

时间:2015-11-28 21:25:10

标签: c++ multithreading openmp

我试图在较低代码中找到数据竞争时遇到困难:

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

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

#pragma omp parallel for 

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

在您的内部for循环中,y[i]的值是并行执行中的更改,并用作目标和源。