我试图在较低代码中找到数据竞争时遇到困难:
#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
我认为这个关键字在这里是多余的,因为已经存在并行块。为什么删除关键字时程序的行为会有所不同?
答案 0 :(得分:0)
如果将并行块嵌套在并行块中,如果不激活“嵌套并行”,则会忽略它。同
omp_set_nested(1);
因此,使用#pragma omp parallel for
,您的代码将在所有线程中执行,所有线程都执行相同的计算。
如果在并行块中创建#pragma omp for
,则不会忽略它。
答案 1 :(得分:-1)
在您的内部for
循环中,y[i]
的值是并行执行中的更改,并用作目标和源。