我正在尝试执行OpenMP代码,并且已成功完成此操作。但是我对声明#pragma omp parallel
有疑问。
考虑以下两个代码段:
#pragma omp parallel firstprivate(my_amax)
{
for (i=0; i<MATRIX_DIM; i++) {
#pragma omp for
for (j=0; j<MATRIX_DIM; j++) {
my_amax = abs_max(my_amax, A[i][j], B[i][j]);
#pragma omp critical
{
if(fabs(amax)<fabs(my_amax))
amax=my_amax;
}
}
}
}
和
for (i=0; i<MATRIX_DIM; i++) {
#pragma omp parallel firstprivate(my_amax)
{
#pragma omp for
for (j=0; j<MATRIX_DIM; j++) {
my_amax = abs_max(my_amax, A[i][j], B[i][j]);
#pragma omp critical
{
if (fabs(amax)<fabs(my_amax))
amax=my_amax;
}
}
}
}
代码中唯一的区别是并行部分的位置。第一个代码总是给我分段错误,而第二个代码执行完美。为什么会这样?
我知道#pragam omp parallel
会生成所需的线程,但由于下一个i
for循环未被声明为并行,因此它不应该是一个问题,即i
部分应该被执行实际并行化的j
次迭代将并行执行。在i
次迭代的第一种情况下,究竟发生了什么?
答案 0 :(得分:2)
对于我所看到的内容,您忘记在第一种情况下声明i
私有。因此,i
由执行相应循环的各个线程非常随机地更新,导致对数组A
和B
的绑定访问。
只需尝试将private(i)
添加到您的#pragma omp parallel firstprivate(my_amax)
指令中,看看会发生什么。