【问题标题】:How to prevent cmake from linking to libcudart.so?如何防止 cmake 链接到 libcudart.so?
【发布时间】:2015-01-15 13:06:23
【问题描述】:

我有一个 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 也能运行我的程序?

非常感谢

【问题讨论】:

    标签: cuda cmake


    【解决方案1】:

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

    有两种可能的方法:

      1234563适合您的应用程序的库。 (是的,you are permitted 重新分发这些库。)
    1. 或者,您可以 statically link 对抗 libcudart,并且不需要单独捆绑或重新分发。

    使用上述任一方法,您的应用程序将随后 query the CUDA runtime library(例如使用 cudaGetDevicePropertiescudaGetDeviceCount)。如果对库的第一次查询引发错误,那么此时通常的响应是“没有正确安装 CUDA”,因此您的代码将采用非 CUDA 代码路径。

    【讨论】:

    • 谢谢。使用 CUDA 运行时库重新分发我的应用程序似乎是我的最佳选择。
    猜你喜欢
    • 2022-08-24
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2023-02-14
    • 2012-08-05
    相关资源
    最近更新 更多