首页 文章

C OpenMP代码意外地在cygwin上运行,但正如Linux上预期的那样

提问于
浏览
2
int a = 0;
#pragma omp parallel private(a)
{
    a++;
    printf("%d", a);
}

有了4个内核,人们可以期待这段代码打印1111,它可以在我的Linux机器上打印 .

但是,在我的Windows机器上运行cygwin中的相同代码(相同的标志等)会产生11117(不确定1的数量) .

7总是在那里,尝试相同的朋友也有7,任何想法如何发生这种情况?

我在两台机器上用“gcc source.c -fopenmp -O2”编译了代码 .

1 回答

  • 5

    我确实很难重现您的错误,因为正如我在评论中提到的,从OpenMP标准的角度来看,您的代码具有未定义的行为 . 实际上,在输入 parallel 区域时声明为 private 的变量不会进行任何初始化,除非它们被声明为 firstprivate .

    在您的情况下,您递增一个值可以是任何值的变量,然后打印它 . 所以印刷的 Value 也可以是任何东西,包括你期望看到的那个 .

    我发现对我来说,为了重现1和7系列,我必须编译代码,禁止编译器进行任何优化 . 一旦代码用 firstprivate 修复,所有结果都是1 .

    在修复之前:

    $ gcc -O0 -fopenmp foo.c
    $ OMP_NUM_THREADS=5 ./a.exe
    71111
    $ OMP_NUM_THREADS=5 ./a.exe
    17111
    

    代码修正:

    #include <stdio.h>
    int main () {
        int a = 0;
        #pragma omp parallel firstprivate(a)
        {
            a++;
            printf("%d", a);
        }
        return 0;
    }
    

    然后

    $ gcc -O0 -fopenmp foo.c
    $ OMP_NUM_THREADS=5 ./a.exe
    11111
    

相关问题