【问题标题】:Cmake + CUDA + OpenCVCmake + CUDA + OpenCV
【发布时间】:2015-10-31 02:32:58
【问题描述】:

我有一个使用 OpenCV 的 C++ 项目。我正在创建一个 CMakeLists.txt 文件来帮助人们编译它,一切正常。

简而言之:如何使用 CMake 创建一个 makefile 以使用 NVCC 将“.cu”文件编译为“.o”并将其与其余“.o”文件链接?

长版: 我想添加一个必须用 NVCC 编译的 CUDA 文件。 我设法手动编译它,但我不知道如何使用 CMake 来创建一个 makefile:

  • 如果在 CMake 中安装了 CUDA 工具包,则让 NVCC 将我的 .cu 文件编译为 .o 文件
  • 将此 .o 文件与 g++ 创建的文件一起使用
  • 不使用 NVCC 编译所有项目(如果没有 CUDA 支持我的项目仍然可以编译)

现在,我有这样的事情:

IF(CUDA_FOUND)
    MESSAGE( STATUS "I found CUDA !" )
    SET(HAVE_CUDA ${CUDA_FOUND} CACHE BOOL "Set to TRUE if CUDA is found, FALSE otherwise")
    cuda_compile(CudaKernel CudaKernels.cu)
ENDIF(CUDA_FOUND)

这会创建一个 .o 文件,但我不知道在哪里/如何使用它。

然后我计划添加一个标志,例如:

if(HAVE_CUDA)
    set (CMAKE_CXX_FLAGS "-DGPU_OPENCV_ENABLE=1")
endif(HAVE_CUDA)

并在我的 C++ 代码中的 MACRO 中测试该标志以调用好的函数。

有什么想法吗?

【问题讨论】:

  • 您的实际问题/问题是什么?你的方法有效吗?如果没有,会发生哪些错误?
  • 我列出了我不能做的步骤。我想创建 cmake 文件来自动创建一个好的 makefile。
  • 一种解决方案可能是创建一个库并将其链接到我的可执行文件(如下所示:eattardo.com/cmake-and-cuda-library),但我没有找到问题的答案。

标签: c++ opencv cuda cmake


【解决方案1】:

好吧,我想通了:

我们可以使用 Cmake 为 cuda 部分创建一个目标文件,并在编译结束时将其链接到 cpp 可执行文件。

cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
IF(CUDA_FOUND)
    SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-O3 -gencode arch=compute_20,code=sm_20)
    cuda_compile(CudaKernel CudaKernels.cu)
    cuda_add_library(CudaKernels CudaKernels.cu)
    add_definitions(-DGPU_OPENCV_ENABLE)
ENDIF()

在 CMake 的 Cpp 部分:

target_link_libraries(Executablename
                      CudaKernels
                      libraries...)

希望对某人有所帮助!

【讨论】:

  • 我认为 cuda_compile 行是没有必要的。同样的事情应该在 cuda_add_library 内部完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2018-09-20
  • 1970-01-01
  • 2011-02-06
  • 2018-11-01
  • 2013-12-15
相关资源
最近更新 更多