在CUDA文件中(而不是内核代码中),可以使用openMP编译指令吗?
我将结合GPU和CPU计算,但是如果我将程序与openMP选项链接(在Linux下),则nvvc编译器会失败并显示“无法找到未知选项'openmp'”。
一个解决方法是仅在C/C++文件中使用openMP语句。
我刚刚发现这个链接:
http://www.cse.buffalo.edu/faculty/miller/Courses/CSE710/heavner.pdf
第25页说:
使用gcc编译器: -#include omp.h
添加 -fopenmp
标志。
使用nvcc编译器,应该使用 -Xcompiler -fopenmp
,因为这需要直接传递给gcc。
-Xcompiler 将标志直接传递给主机编译器。
在链接阶段添加 -lgomp
标志。
我还没有尝试过...
我尝试将参数写在“附加编译器选项”中,但没有成功。
以下是我在Visual Studio 2010和CUDA 4.2中的操作:
在项目属性->配置属性->CUDA C/C++->命令行->附加选项中添加:-Xcompiler "/openmp"
这会导致生成的构建命令中有两个-Xcompiler参数,但不会引起任何问题,并且成功地工作。
我不得不在我的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>)
从nvidia论坛找到的Visual Studio解决方案:
在cuda构建规则的额外C++选项中添加“/openmp”标志。我稍后会尝试Linux解决方案。