为什么此 OpenMP 代码使用 g++ 编译,但使用 nvcc 失败?

Why does this OpenMP code compile with g++, but fail with nvcc?

我正在尝试编译这段使用 OpenMP 的代码。当我用 nvcc 编译它时,它给出了一个错误,似乎是在抱怨一个甚至不存在的标记。

这是我的代码的最小版本:

int main() {

    // this loop somehow prevents the second one from compiling
    for (int foo = 0; foo < 10; foo++) {
        int bar;
        continue;
    }

    #pragma omp parallel for
    for (int baz = 0; baz < 10; baz++) { }

    return 0;
}

这是它产生的错误消息:

exp.cu:10:1: error: for statement expected before ‘}’ token
   10 |     for (int baz = 0; baz < 10; baz++) { }
      | ^

我正在用这个命令编译它:nvcc -Xcompiler -fopenmp exp.cu

没有第一个循环,这个程序编译正确。如果我删除第一个循环中的任何一行,它也会起作用。第一个循环如何阻止第二个循环编译?我是否使用了无效的 OpenMP 语法?

如果我将文件重命名为 exp.cpp 并使用 g++ -fopenmp exp.cpp 编译它,则可以正常工作。这是否有可能是 nvcc 中的错误?不幸的是,我不能只使用 g++,因为我需要能够在其他地方使用 CUDA 内核。

编辑

我正在使用 CUDA 11.2。

就此代码示例而言,CUDA 11.2 中显然存在缺陷。

该问题似乎已在 CUDA 11.4 及更高版本中解决。

解决方案是将 CUDA 安装升级到 CUDA 11.4 或更高版本。