【问题标题】:detect cuda/GPU during runtime在运行时检测 cuda/GPU
【发布时间】:2021-07-30 08:22:16
【问题描述】:

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

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

    对于使用CUDA runtime library/API的应用程序:

    1. 将您的应用或共享库静态链接到libcudart.so。使用nvcc 编译时,这是自动的,但您可以根据需要指定-cudart static。这不会触发针对libcuda.so的隐式动态链接

    2. 在您的程序/库的早期,执行“无害”的 CUDA 调用,例如 cudaGetDevice()。如果您收到错误代码,可以安全地假设 CUDA 在该系统上不起作用,您不应尝试使用它。

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

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

    This answer 有一个例子,尽管它主要考虑的是 CUFFT。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2011-09-19
      • 2021-04-21
      • 1970-01-01
      • 2015-05-12
      • 2012-10-01
      相关资源
      最近更新 更多