在CUDA主机代码中如何使用OpenMP?

19

在CUDA文件中(而不是内核代码中),可以使用openMP编译指令吗?

我将结合GPU和CPU计算,但是如果我将程序与openMP选项链接(在Linux下),则nvvc编译器会失败并显示“无法找到未知选项'openmp'”。

一个解决方法是仅在C/C++文件中使用openMP语句。

4个回答

21

我刚刚发现这个链接:

http://www.cse.buffalo.edu/faculty/miller/Courses/CSE710/heavner.pdf

第25页说:

使用gcc编译器: -#include omp.h

添加 -fopenmp 标志。

使用nvcc编译器,应该使用 -Xcompiler -fopenmp,因为这需要直接传递给gcc。 -Xcompiler 将标志直接传递给主机编译器。

在链接阶段添加 -lgomp 标志。

我还没有尝试过...


小心复制和粘贴参数。如果你仔细看,-Xcompiler -fopenmp 上的破折号与命令行破折号不同。 - Tristan
破折号现在已经修复。 - Doug Lipinski

2

我尝试将参数写在“附加编译器选项”中,但没有成功。

以下是我在Visual Studio 2010和CUDA 4.2中的操作:

在项目属性->配置属性->CUDA C/C++->命令行->附加选项中添加:-Xcompiler "/openmp"

这会导致生成的构建命令中有两个-Xcompiler参数,但不会引起任何问题,并且成功地工作。


0

使用CMake构建

我不得不在我的CMakeLists.txt文件中添加-Xcompiler=-fopenmp作为编译选项,以便使用OpenMP指令构建CUDA主机代码:

# your CMakeLists.txt should contain something like this already
project(<project> Languages CXX CUDA)
find_package(CUDA REQUIRED)
find_package(OpenMP)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")

# the following line was also necessary
target_compile_options(<target> PRIVATE $<$<COMPILE_LANGUAGE:CUDA>: -Xcompiler=-fopenmp>)

0

从nvidia论坛找到的Visual Studio解决方案:

在cuda构建规则的额外C++选项中添加“/openmp”标志。我稍后会尝试Linux解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接