【问题标题】:Linking CUDA with a project added as external project from subdirectory将 CUDA 与从子目录添加为外部项目的项目链接
【发布时间】:2021-02-10 11:37:47
【问题描述】:

我正在开发一个项目 here 的分支。如您所见,主项目和其他依赖项都是通过外部CMakeList.txt 中的 ExternalProject_Add() 添加的。我想将我编写的here 的简单 CUDA 项目添加到我已经分叉的主要 iris-distro 项目中。简单地说,我希望能够在iris_demo.cpp 中调用funcs_cuda.cuh。我想要的目标是实现一些 .cpp 文件(类似于 iris_demo.cpp),如下所示:

#include <iostream>
#include <Eigen/Core>
#include "iris/iris.h"
#include "funcs_cuda.cuh"
int main(int argc, char** argv) {

  int m {900};
  int n {900};
  int k {900};

  ///////////// HERE 

  MatricesClass mat_class(m,n,k);

  ////////////
  iris::IRISProblem problem(2);
  problem.setSeedPoint(Eigen::Vector2d(0.1, 0.1));

  Eigen::MatrixXd obs(2,2);
  // Inflate a region inside a 1x1 box
  obs << 0, 1,
         0, 0;
  problem.addObstacle(obs);
  obs << 1, 1,
         0, 1;
  problem.addObstacle(obs);
  obs << 1, 0,
         1, 1;
  problem.addObstacle(obs);
  obs << 0, 0,
         1, 0;
  problem.addObstacle(obs);

  iris::IRISOptions options;
  iris::IRISRegion region = inflate_region(problem, options);

  std::cout << "C: " << region.ellipsoid.getC() << std::endl;
  std::cout << "d: " << region.ellipsoid.getD() << std::endl;


  /* Some other calculation using matrices in mat_class */ 

  return 0;
}

我尝试了多种方法来查看是否可以简单地将 funcs_cuda.cu/funcs_cuda.cuh 文件添加到项目中,并将 CUDA 添加为 iris 项目的语言,但是,我的努力都没有成功有用。你能帮我找到解决这个问题的方法吗?任何帮助、想法或提示将不胜感激。


我承认我在这个领域还是个新手,但我已经为这个问题苦苦挣扎了好几天。根据我自己对 CMake 的不完整知识,我尝试了几种方法,但所有这些方法都导致了死胡同。例如,首先困扰我的一件事是,我不能简单地将 CUDA 语言添加到 iris 项目here(我试图让其余部分与my simple cuda project 相似)(例如project(iris LANGUAGES CXX CUDA))。

或者,当文件位于子目录之一(例如 iris-distro/src/cxx/)中时,我无法完全构建和链接 CUDA 头文件。我可以在主(外部)目录(例如 iris-distro/)中构建它们,但我不知道如何将其与 iris_demo.cpp 链接。

我的操作系统是 Ubuntu 16.04,我的目标是利用我计算机上的图形处理器来加速 IRIS 项目中的一些矩阵乘法。我已经构建并运行了 cuda-matmul 项目,并且正在使用 CLion 和 gcc-5.4.0。因此,我认为这可能是由于我对 CMake 缺乏了解,因为使用 CUDA 的一切都正常。

【问题讨论】:

    标签: c++ cmake cuda clion


    【解决方案1】:

    你是对的,CMake 没有正确配置。按照问题中提到的步骤进行操作:

    1. 将文件从cuda-matmul 复制到iris-distro/src/cxx 目录中。
    2. 修改iris-distro目录下的CMakeLists.txt文件,并添加CUDA依赖使其工作。

    你需要告诉CMake如何检测CUDA以及如何使用它。以下是一些可帮助您入门的资源:

    1. CUDA and Modern CMake
    2. StackOverflow: add CUDA to CMake
    3. General CMake tutorial

    【讨论】:

      【解决方案2】:

      又花了几个小时,我似乎找到了解决办法。

      1. 我将funcs_cuda.cuhfuncs_cuda.cu 和辅助函数目录cuda-matmul/inc 复制到iris-distro/src/cxx
      2. iris-distro/CMakeLists.txt: 为 CUDA 根设置了 cmake 变量: set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda-8.0")
      • 这个变量也被添加到IRIS_CMAKE_ARGS 中,当使用ExternalProject_Add 添加主项目时将使用该变量。换言之,"-DCUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}" 已添加到 IRIS_CMAKE_ARGS 列表中。
      1. iris-distro/src/cxx/CMakeLists.txt 中,添加了以下命令:
      enable_language(CUDA)
      include_directories(${CUDA_TOOLKIT_ROOT_DIR}/include)
      add_library(funcs_cuda STATIC funcs_cuda.cuh funcs_cuda.cu )
      target_link_libraries(funcs_cuda -lcublas Eigen3::Eigen)
      target_include_directories(funcs_cuda PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc> $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include/inc>)
      set_target_properties(funcs_cuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
      set_target_properties(funcs_cuda PROPERTIES LINKER_LANGUAGE CUDA)
      set_property(TARGET funcs_cuda PROPERTY CUDA_RESOLVE_DEVICE_SYMBOLS ON)
      

      另外,新库应该在install命令中考虑:

      install(TARGETS iris iris_geometry iris_mosek funcs_cuda
        EXPORT iris-targets
        INCLUDES DESTINATION ${IRIS_INCLUDE_DIR}
        LIBRARY DESTINATION ${IRIS_LIBRARY_DIR}
        PUBLIC_HEADER DESTINATION ${IRIS_INCLUDE_DIR}/iris
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
      

      最后,可执行文件将与这个新的funcs_cuda 库链接:

      add_executable(irisDemo iris_demo.cpp)
      target_link_libraries(irisDemo iris funcs_cuda)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-06
        • 2010-09-14
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        相关资源
        最近更新 更多