如何防止cmake链接到libcudart.so?

时间:2014-11-18 11:01:40

标签: cuda cmake

我有一个CUDA程序(cuda_test.cc),我想在没有CUDA设备的机器上运行(在这种情况下,它将在cpu而不是在gpu上执行算法)。 从命令行来看,它非常简单:

machine-with-cuda$ nvcc -ccbin g++ -o cuda_test cuda_test.cc
machine-without-cuda$ ./cuda_test 
You don't have a CUDA device

但是,我需要使用cmake,因为我的程序将包含在使用cmake的现有库中。 Cmake总是使用-rdynamic /usr/local/cuda/lib64/libcudart.so调用c ++,所以我最终得到一个链接到libcudart.so的可执行文件,这是

machine-with-cuda$ cat CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
FIND_PACKAGE(CUDA)
SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -ccbin g++")
CUDA_ADD_EXECUTABLE(cuda_test cuda_test.cc)

machine-with-cuda$ make
...
/usr/bin/c++       CMakeFiles/cuda_test.dir/cuda_test.cc.o  -o cuda_test -rdynamic /usr/local/cuda/lib64/libcudart.so -Wl,-rpath,/usr/local/cuda/lib64 
...

machine-without-cuda$ ./cuda_test
error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file or directory

(请注意,即使在编译.cu文件而不是.cc文件时,我仍然会得到一个链接到libcudart.so的可执行文件。)

如何防止cmake链接到libcudart.so?或者还有另一种方法可以确保我的程序即使没有安装cuda也可以运行吗?

非常感谢

1 个答案:

答案 0 :(得分:3)

即使在没有GPU的机器上(因此没有CUDA),创建一个能够正确运行的CUDA程序的recommended approach包含libcudart提供的cuda运行时。 / p>

有两种可能的方法:

  1. 如果您打算将您的应用程序动态链接到CUDA运行时库(即针对Linux上的libcudart.so或Windows上的cudart.lib / cudart.dll),那么您应该捆绑并{{3}与您的应用程序相关的库。 (是的,redistribute重新分发这些库。)

  2. 或者,你可以针对libcudart you are permitted,并且不需要单独的捆绑或重新分发。

  3. 使用上述任一方法,您的应用程序将statically link(例如,使用cudaGetDevicePropertiescudaGetDeviceCount)。如果对库的第一个查询引发错误,那么此时通常的响应是"没有正确的CUDA安装",因此您的代码将采用非CUDA代码路径。