我正在编写一个包含 cuda 代码的共享库,但是 cuda 相关代码只是该库的一小部分,在大多数用例中,用户甚至不需要与 cuda 相关的功能。 对我来说,我不想编译发布两个版本:CPU 版本和 GPU 版本。所以我想检测用户的运行时是否可以使用 cuda/GPU 环境,无论他们是否有显卡,这可能吗?我已经搜索了一些答案,但我仍然不清楚库用户在运行时“检测 cuda”的最低要求是什么?
由于我发布了一个动态链接到 cuda 的共享库,所以我想用户至少需要在他的机器上安装 cuda 工具包,无论他是否有 GPU?否则,我的库在尝试查找 cuda.so 时会在一开始就失败?我的理解是否正确......?发布与 GPU/非 GPU 环境兼容的库并在运行时决定行为的最佳实践是什么?
答案 0 :(得分:2)
对于使用 CUDA runtime library/API 的应用程序:
将您的应用或共享库静态链接到 libcudart.so
。使用 nvcc
编译时,这是自动的,但您可以根据需要指定 -cudart static
。这不会触发针对 libcuda.so
在您的程序/库的早期,执行“无害”的 CUDA 调用,例如 cudaGetDevice()
。如果您收到错误代码,则可以安全地假设 CUDA 在该系统上不起作用,您不应尝试使用它。
此方法不需要在目标机器上安装 CUDA 工具包。假设您只使用 CUDA 运行时库,那么这就是所需要的。如果机器安装了适当的 GPU 和驱动程序,其版本足以用于静态链接到您的库的 libcudart 版本,它就会正常工作。
如果您的应用程序使用其他 CUDA 库,例如 CUBLAS 等,那么这些库也需要静态链接到您的应用程序/库。
This answer 有一个例子,虽然它主要是针对 CUFFT 的。