我有一个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也可以运行吗?
非常感谢
答案 0 :(得分:3)
即使在没有GPU的机器上(因此没有CUDA),创建一个能够正确运行的CUDA程序的recommended approach是包含libcudart提供的cuda运行时。 / p>
有两种可能的方法:
如果您打算将您的应用程序动态链接到CUDA运行时库(即针对Linux上的libcudart.so或Windows上的cudart.lib / cudart.dll),那么您应该捆绑并{{3}与您的应用程序相关的库。 (是的,redistribute重新分发这些库。)
或者,你可以针对libcudart you are permitted,并且不需要单独的捆绑或重新分发。
使用上述任一方法,您的应用程序将statically link(例如,使用cudaGetDeviceProperties
或cudaGetDeviceCount
)。如果对库的第一个查询引发错误,那么此时通常的响应是"没有正确的CUDA安装",因此您的代码将采用非CUDA代码路径。