为什么这个 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 由执行相应循环的各种线程随机更新,导致对数组 AB.

的越界访问

只需尝试将 private(i) 添加到您的 #pragma omp parallel firstprivate(my_amax) 指令中,看看会发生什么。