将CUDA与从子目录

问题描述

我正在研究项目here的分支。如您所见,主项目和其他依赖项全部通过外部CMakeList.txt中的ExternalProject_Add()添加。我想将我编写的here一个简单CUDA项目添加到我创建的主要虹膜发行项目中。简而言之,我希望能够在funcs_cuda.cuh内部调用iris_demo.cpp。我想要的目标是实现一些.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;
  problem.addobstacle(obs);
  obs << 1,1;
  problem.addobstacle(obs);
  obs << 1,1;
  problem.addobstacle(obs);
  obs << 0,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项目的语言,但是,我的努力都没有有用。您能帮我找到解决这个问题的方法吗?任何帮助,想法或提示将不胜感激。


我承认我是该领域的新手,但是在DAYS中,我一直在努力解决这个问题。我已经根据自己对CMake的 incomplete 知识尝试了几种方法,但是所有方法都导致了失败。例如,首先困扰我的一件事是我不能简单地将CUDA语言添加到虹膜项目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的所有功能都可以正常工作。

解决方法

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

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

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

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

花了几个小时后,看来我找到了解决它的方法。

  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)