程序检查CUDA存在需要CUDA

Program to check CUDA presence needs CUDA?

本文关键字:CUDA 存在 程序 检查      更新时间:2023-10-16

我写了一个简单的应用程序来检查NVIDIA CUDA是否在计算机上可用。如果找到支持cuda的设备,它只显示true

我将应用程序发送到第二台PC,应用程序没有运行-出现一个对话框,提示cudart.dll未找到。我想检查CUDA是否存在,它需要CUDA这样做:)

我使用CUDA 5.0, VS2012, vc++ 11, Windows 7。

我可以用一种方式编译应用程序,所有CUDA库都在可执行文件中吗?


所以情况是:

  1. 我的应用程序已编译&发送到计算机
  2. 计算机可以:
    1. 运行windows, linux(我的应用程序与系统兼容)
    2. 是否有gpu
    3. 是否有nvidia gpu
    4. 是否安装CUDA
  3. 我的应用程序应该返回true只有当2.3和2.4是积极的(GPU与CUDA)

作为开场白,我认为你编辑的步骤顺序和数量是不正确的。应该是:

  1. 程序启动并尝试加载运行时API库
  2. 如果运行库存在,尝试使用它枚举设备。

如果步骤1失败,您没有必要的运行时支持,CUDA不能使用。如果2失败,系统中没有兼容的驱动程序和GPU, CUDA无法使用。如果他们都通过了,你就可以走了。

在步骤1中,您希望在Linux上使用类似dlopen的东西并处理返回状态。在Windows上,你可能想使用DLL延迟加载机制(对不起,不是Windows程序员,不能告诉你更多)。

在这两种情况下,如果库加载,然后通过适当的主机操作系统API获取cudaGetDeviceCount的地址并调用它。它告诉你是否有兼容的gpu可以枚举。在你找到一个明显可用的GPU后,你要做什么取决于你。我会检查计算状态并尝试在其上建立上下文。这将确保一个功能齐全的运行时/驱动程序组合存在,一切都工作。

链接到stackoverflow: detecting-nvidia-gpu -without-cuda的其他帖子这显示了检查cuda api是否可用和可访问的整个序列。

我认为仅使用软件没有可靠的方法来确保GPU是否支持Cuda,特别是如果我们考虑到Cuda是基于驱动程序的技术,如果驱动程序说Cuda不存在,那么对于操作系统来说Cuda不存在。

我认为最好的方法是老式的方式,考虑一下这个简单的网页,你会得到一个更可靠的答案。

为您的应用程序创建一个插件,动态链接到相关cuda库并执行检查。

然后尝试加载插件并运行它的检查。

  • 如果插件加载失败,那么你没有安装cuda库,所以你可以假设False

  • 如果插件加载成功,那么你已经安装了CUDA-lib并可以执行检查,硬件是否支持CUDA。

作为一个迟来的附加回答:

我正在努力解决同样的问题(检测cuda安装而不使用它),到目前为止我的解决方案是

  • 确保LoadLibraryA("nvcuda.dll") != nullptr(告诉你几乎只有当有一个nvidia卡安装,虽然)
  • 检查环境变量CUDA_PATH(或在我的情况下,CUDA_PATH_V8_0),因为这似乎是由cuda安装设置的:const char * szCuda8Path = std::getenv("CUDA_PATH_V8_0");(必须是!= nullptr)

使用cudaGetDeviceCount()来了解计算机是否支持cuda。

根据这个线程,你不能静态链接cudart.dll

有一些解决方法:将CUDA运行时作为资源嵌入到可执行文件中,然后在程序运行时提取它,然后动态链接。

您还可以使用nvidia-smi查看计算机上是否安装了CUDA