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

时间:2013-04-07 08:27:05

标签: c++ windows visual-c++ 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为正(带CUDA的GPU)时,我的应用才会返回true

6 个答案:

答案 0 :(得分:6)

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

  1. 程序启动并尝试加载运行时API库
  2. 如果存在运行时库,请尝试使用它来枚举设备。
  3. 如果步骤1失败,则您没有必要的运行时支持,并且无法使用CUDA。如果2失败,则系统中不存在兼容的驱动程序和GPU,并且无法使用CUDA。如果他们都过去了,你就可以去了。

    在步骤1中,您希望在Linux上使用类似dlopen的内容并处理返回状态。在Windows上,您可能想要使用DLL delay loading mechanism(抱歉,不是Windows程序员,不能告诉您更多)。

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

答案 1 :(得分:0)

我认为仅使用软件没有可靠的方法来确保GPU是否具有Cuda能力,特别是如果我们认为Cuda是基于驱动程序的技术而且对于OS而言如果Cuda不存在则司机说Cuda不存在。

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

作为一个迟到的回答:

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

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

答案 5 :(得分:-2)

使用cudaGetDeviceCount()了解计算机是否具备CUDA功能。

According to this thread,您无法静态链接cudart.dll

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

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