将 CUDA 与从子目录添加为外部项目的项目链接
Linking CUDA with a project added as external project from subdirectory
我正在开发一个项目的分支 here. As you can see the main project and other dependencies are all added with ExternalProject_Add() in the outer CMakeList.txt. I want to add a simple CUDA project that I had written here, to the main iris-distro project that I have forked. Simply put, I want to be able to call funcs_cuda.cuh inside 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, 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 项目的语言,但是,我的 none 努力结果是有用的。你能帮我找到解决这个问题的方法吗?任何帮助、想法或提示将不胜感激。
我承认我在这个领域是个新手,但我已经为这个问题苦苦挣扎了 DAYS 天。我根据自己对 CMake 的 不完整 知识尝试了几种方法,但所有方法都进入了死胡同。例如,首先困扰我的一件事是我不能简单地将 CUDA 语言添加到 iris 项目 here (I tried to keep the rest similar to my simple cuda project)(例如 project(iris LANGUAGES CXX CUDA)
)。
或者当文件位于子目录之一(例如 iris-distro/src/cxx/)时,我无法完全构建和 link CUDA 头文件。我可以在主(外部)目录(例如 iris-distro/)中构建它们,但我还是不知道如何使用 iris_demo.cpp.
link 它
我的操作系统是 Ubuntu 16.04,我的目标是利用计算机上的图形处理器来加速 IRIS 项目中的一些矩阵乘法。我已经构建 运行 cuda-matmul 项目,并且我正在使用 CLion 和 gcc-5.4.0。因此,我认为这可能是由于我对 CMake 缺乏了解,因为 CUDA 的一切都可以正常工作。
你说得对,CMake 没有正确配置。按照问题中提到的步骤进行操作:
- 将
cuda-matmul
中的文件复制到 iris-distro/src/cxx
目录中。
- 修改
iris-distro
目录下的CMakeLists.txt
文件,添加CUDA
依赖使其生效。
你需要告诉CMake
如何检测CUDA
以及如何使用它。以下是一些可帮助您入门的资源:
- CUDA and Modern CMake
- Whosebug: add CUDA to CMake
- General CMake tutorial
又花了几个小时,看来我找到了一些修复它的方法。
- 我将
funcs_cuda.cuh
、funcs_cuda.cu
和辅助函数目录 cuda-matmul/inc
复制到 iris-distro/src/cxx
。
- 在
iris-distro/CMakeLists.txt
中:为 CUDA root 设置了 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
列表中。
- 在
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)
我正在开发一个项目的分支 here. As you can see the main project and other dependencies are all added with ExternalProject_Add() in the outer CMakeList.txt. I want to add a simple CUDA project that I had written here, to the main iris-distro project that I have forked. Simply put, I want to be able to call funcs_cuda.cuh inside 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, 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 项目的语言,但是,我的 none 努力结果是有用的。你能帮我找到解决这个问题的方法吗?任何帮助、想法或提示将不胜感激。
我承认我在这个领域是个新手,但我已经为这个问题苦苦挣扎了 DAYS 天。我根据自己对 CMake 的 不完整 知识尝试了几种方法,但所有方法都进入了死胡同。例如,首先困扰我的一件事是我不能简单地将 CUDA 语言添加到 iris 项目 here (I tried to keep the rest similar to my simple cuda project)(例如 project(iris LANGUAGES CXX CUDA)
)。
或者当文件位于子目录之一(例如 iris-distro/src/cxx/)时,我无法完全构建和 link CUDA 头文件。我可以在主(外部)目录(例如 iris-distro/)中构建它们,但我还是不知道如何使用 iris_demo.cpp.
link 它我的操作系统是 Ubuntu 16.04,我的目标是利用计算机上的图形处理器来加速 IRIS 项目中的一些矩阵乘法。我已经构建 运行 cuda-matmul 项目,并且我正在使用 CLion 和 gcc-5.4.0。因此,我认为这可能是由于我对 CMake 缺乏了解,因为 CUDA 的一切都可以正常工作。
你说得对,CMake 没有正确配置。按照问题中提到的步骤进行操作:
- 将
cuda-matmul
中的文件复制到iris-distro/src/cxx
目录中。 - 修改
iris-distro
目录下的CMakeLists.txt
文件,添加CUDA
依赖使其生效。
你需要告诉CMake
如何检测CUDA
以及如何使用它。以下是一些可帮助您入门的资源:
- CUDA and Modern CMake
- Whosebug: add CUDA to CMake
- General CMake tutorial
又花了几个小时,看来我找到了一些修复它的方法。
- 我将
funcs_cuda.cuh
、funcs_cuda.cu
和辅助函数目录cuda-matmul/inc
复制到iris-distro/src/cxx
。 - 在
iris-distro/CMakeLists.txt
中:为 CUDA root 设置了 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
列表中。
- 在
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)