为什么这个openmp代码会给出分段错误?

时间:2015-09-19 09:05:46

标签: multithreading parallel-processing openmp

我正在尝试执行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次迭代的第一种情况下,究竟发生了什么?

1 个答案:

答案 0 :(得分:2)

对于我所看到的内容,您忘记在第一种情况下声明i私有。因此,i由执行相应循环的各个线程非常随机地更新,导致对数组AB的绑定访问。

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