为什么此 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 或更高版本。
我正在尝试编译这段使用 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 或更高版本。