首页 文章

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

提问于
浏览
2

我有一个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 回答

  • 3

    recommended approach创建一个即使在没有GPU(因此没有CUDA)的机器上也能正常运行的CUDA程序,包括libcudart提供的cuda运行时 .

    有两种可能的方法:

    • 如果您打算将应用程序动态链接到CUDA运行时库(即针对Linux上的libcudart.so或Windows上的cudart.lib / cudart.dll),那么您应该将适当的库与应用程序捆绑在一起 . (是的,you are permitted重新分发这些库 . )

    • 或者,您可以statically link对抗libcudart,并且不需要单独的捆绑或重新分发 .

    使用上述任一方法,您的应用程序将会query the CUDA runtime library(例如使用 cudaGetDevicePropertiescudaGetDeviceCount ) . 如果对库的第一个查询引发错误,那么此时通常的响应是"there is no proper CUDA installation",因此您的代码将采用非CUDA代码路径 .

相关问题