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