为什么这个 openmp 代码会出现分段错误?
Why does this openmp code gives segmentation fault?
我正在尝试执行 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
次迭代的第一种情况下究竟发生了什么?
据我所知,您忘记在第一种情况下声明 i
私有。因此,i
由执行相应循环的各种线程随机更新,导致对数组 A
和 B
.
的越界访问
只需尝试将 private(i)
添加到您的 #pragma omp parallel firstprivate(my_amax)
指令中,看看会发生什么。
我正在尝试执行 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
次迭代的第一种情况下究竟发生了什么?
据我所知,您忘记在第一种情况下声明 i
私有。因此,i
由执行相应循环的各种线程随机更新,导致对数组 A
和 B
.
只需尝试将 private(i)
添加到您的 #pragma omp parallel firstprivate(my_amax)
指令中,看看会发生什么。