在cuda主机代码中使用openMP?

问题描述 投票:0回答:4

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

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

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

c++ cuda openmp
4个回答
21
投票

我刚刚发现这个

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

第25页说:

  • 使用海湾合作委员会:
    • #include
      omp.h

    • 添加

      -fompenmp
      [原文如此] 标志

      • 对于 nvcc,这应该是
        -Xcompiler -fopenmp
        ,因为这需要直接传递给 gcc
      • -Xcompiler
        将标志直接传递给主机编译器
    • 在链接阶段添加

      -lgomp
      标志。

我还没试过...


2
投票

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

我为 Visual Studio 2010 和 CUDA 4.2 所做的事情:

在项目属性 -> 配置属性 -> CUDA C/C++ -> 命令行 -> 其他选项中: -X编译器“/openmp”

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


0
投票

从nvidia-forum找到的Visual Studio的解决方案:

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


0
投票

使用 CMake 构建

我必须将

-Xcompiler=-fopenmp
作为编译选项添加到我的 CMakeLists.txt 文件中,以使用 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>)
© www.soinside.com 2019 - 2024. All rights reserved.