繁体   English   中英

检查CUDA存在需要CUDA的程序?

[英]Program to check CUDA presence needs CUDA?

我写了一个简单的应用程序来检查计算机上是否有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. 只有当2.3和2.4为正时,我的应用才会返回true (带CUDA的GPU)

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

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

如果步骤1失败,则您没有必要的运行时支持,并且无法使用CUDA。 如果2失败,则系统中不存在兼容的驱动程序和GPU,并且无法使用CUDA。 如果他们都过去了,你很高兴。

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

在这两种情况下,如果库加载,则通过适当的主机OS API获取cudaGetDeviceCount的地址并调用它。 这告诉您是否有可以枚举的兼容GPU。 在找到明显可用的GPU后,您所做的就由您决定。 我会检查计算状态并尝试在其上建立一个上下文。 这将确保存在功能齐全的运行时/驱动程序组合并且一切正常。

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

我认为最好的方法是采用旧时尚的方式,考虑检查这个简单的网页 ,你会得到一个更可靠的答案。

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

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

  • 如果插件无法加载,那么您没有安装CUDA库,因此您可以假设为False

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

链接到stackoverflow上的不同帖子: detection-nvidia-gpus-without-cuda这显示了检查cuda api是否可用且可访问的整个序列。

作为一个迟到的回答:

我正在努力解决同样的问题(检测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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM