在C和两个嵌套循环中使用OpenMP崩溃

时间:2017-04-19 15:29:52

标签: c openmp

我在使用OpenMP的C代码中遇到了一种奇怪的行为。以下代码段经常崩溃:

#define XLEN        (5)
#define YLEN        (5)

int do_something(void)
{
    int c,d;
    double data[YLEN][XLEN];

#pragma omp parallel for

    for(c=0;c<XLEN;c++)
    {
        for(d=0;d<YLEN;d++)
        {

            /*
                In the real code here I calculate a result which is a function of c and d, save it in a temporary variable and then write it in the critical section. However this is not necessary for this minimal example.
            */

#pragma omp critical

            {
                data[d][c]=0.0f;                
            }
        }
    }

    return 0;
}

int main(void)
{
    do_something();
}

我使用的是Mac OS X,我的代码是使用GCC(版本6,来自MacPorts)或Clang(版本3.8,也来自MacPorts)编译的。

1 个答案:

答案 0 :(得分:0)

在发布后一分钟找到解决方案,d变量应在最外层循环内声明,如

int do_something(void)
{
    int c;
    double data[YLEN][XLEN];

#pragma omp parallel for

    for(c=0;c<XLEN;c++)
    {
        int d;

        for(d=0;d<YLEN;d++)
        {

等...