在运行时检测cuda/GPU

  • 本文关键字:GPU cuda 运行时 cuda
  • 更新时间 :
  • 英文 :


我正在编写一个包含cuda代码的共享库,但是cuda相关代码只是该库中很小的一部分,并且在大多数用例中用户甚至不需要cuda相关功能。对于我来说,我不想编译和发布两个版本:CPU版本和GPU版本。所以我想检测如果cuda/GPU环境是可用的在用户的运行时,不管他们是否有图形卡,这是可能的吗?我已经搜索了一些答案,但我仍然不清楚图书馆用户"检测cuda"的最低要求是什么。在运行时?

因为我发布了一个共享库,它动态链接到cuda,所以我想用户至少需要在他的机器上安装cuda工具包,不管他有没有GPU ?否则,我的图书馆在一开始找cuda的时候就会失败。我的理解对吗....?发布与GPU/非GPU环境兼容的库并在运行时决定其行为的最佳实践是什么?

对于使用CUDA运行库/API的应用程序:

  1. 静态链接您的应用程序或共享库对libcudart_static.a(而不是libcudart.so)。当使用nvcc编译时,这是自动的,但是如果您愿意,也可以指定-cudart static。这不会触发对libcuda.so的隐式动态链接,如果不使用nvcc,则-lcudart_static是链接请求(例如ld)。

  2. 在你的程序/库的早期,做一个"无害的"CUDA调用,如cudaGetDevice()。如果您得到一个错误代码,可以放心地假设CUDA在该系统上不起作用,并且您不应该尝试使用它。

此方法不需要在目标机器上安装CUDA工具包。假设您只使用CUDA运行时库,那么这就是所需要的。如果机器安装了合适的GPU和驱动程序,并且其版本足以支持静态链接到库的libudart版本,则它将正常工作。

如果你的应用程序使用其他CUDA库,如CUBLAS等,那么这些也需要静态链接到你的应用程序/库。

这个答案有一个例子,尽管它主要考虑了CUFFT。

最新更新