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

4
我写了一个简单的应用程序,检查计算机上是否可用NVIDIA CUDA。如果找到支持CUDA的设备,它只显示true
我将应用程序发送到第二台计算机时,应用程序无法运行 - 出现一个对话框,显示未找到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为正数(GPU与CUDA),则我的应用程序应该返回true

那将是静态链接。为什么不动态链接它们?此外,您可以在链接到它之前检查cudart.dll的存在。 - Dai
我想要一个可执行文件(或一个作为某些框架插件的DLL文件)。我不想发送2个文件。如果我错了,请纠正我,但缺少cudart.dll并不意味着没有CUDA-GPU存在。普通用户的NVIDIA图形驱动程序是否包含CUDA库? - Xlaudius
我有点困惑 - 你是想确保(或检查)CUDA运行时库的可用性,还是CUDA兼容硬件的可用性,还是两者都要?(据我所知,后者取决于前者)。 - Dai
实际上 - 两者都需要,因为没有CUDA运行时,CUDA硬件是无用的。但是运行时的存在并不意味着GPU兼容(允许模拟)。 - Xlaudius
1
@Xlaudius:没有CUDA运行时,CUDA硬件并不是“无用”的。CUDA驱动程序API可以用于在不需要运行时API的情况下运行CUDA代码,并且驱动程序API库随驱动程序一起在所有Windows平台上提供。听起来你在问题中混淆了两个东西 - 如何检测有效的运行时API库的存在,以及如何检测硬件。第一个答案可能是延迟加载运行时API库并处理失败时发生的情况。 - talonmies
显示剩余2条评论
6个回答

6
作为开场白,我认为您所编辑的步骤的顺序和数量是不正确的。应该是:
  1. 程序启动并尝试加载运行时API库
  2. 如果运行时库存在,则尝试使用它来枚举设备。
如果步骤1失败,则没有必要的运行时支持,并且CUDA无法使用。如果第2步失败,则系统中不存在兼容的驱动程序和GPU,因此无法使用CUDA。如果两者都通过,则可以开始。
在步骤1中,您需要类似于Linux上的dlopen这样的东西,并处理返回状态。在Windows上,您可能需要使用DLL延迟加载机制(抱歉,不是Windows程序员,无法告诉您更多信息)。
在这两种情况下,如果库加载成功,则通过适当的主机操作系统API获取cudaGetDeviceCount的地址并调用它。这将告诉您是否存在可枚举的兼容GPU。在找到一个看起来可用的GPU之后,您可以自行决定接下来要做什么。我会检查计算状态并尝试在其上建立上下文。这将确保存在完全功能的运行时/驱动程序组合并且一切正常。

好的,那么我的理解是首先尝试自己加载库以进行检查,然后再调用调用/打开库的CUDA函数,您的意思是这样吗? - Xlaudius
几乎。你需要自己加载库,然后需要自己从库中获取所需的函数,然后设置调用并执行它们。在我回答中给出的链接中有如何做到这一点的示例。 - talonmies
那么如果我需要 cudaMalloc,我必须自己获取它吗?并且还要获取其他20个我需要的函数吗? - Xlaudius
@Xlaudius:你之前询问过一个“简单的应用程序,用于检查计算机上是否可用NVIDIA CUDA。如果找到支持CUDA的设备,则只需显示true。”我不建议将其用于完整的应用程序。只需让这段小代码自动加载库,并尝试枚举设备。如果可以,那么再启动你的真实应用程序,因为你知道它会正常运行,因为你拥有必要的驱动程序和硬件。 - talonmies

2

0

我认为仅使用软件无法可靠地确定GPU是否支持Cuda,特别是考虑到Cuda是基于驱动程序的技术,对于操作系统而言,如果驱动程序表示不存在Cuda,则Cuda不存在。

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


@talonmies,如果用户使用错误的驱动程序......您将永远不会知道 :) 永远不要假设用户知道自己在做什么或自己的电脑应该如何配置,绝对不要。 - user2244984
1
当然你会知道。如果运行时API库存在,但没有硬件或驱动程序不匹配,它将返回一个错误告诉你出了什么问题。如果驱动程序库不存在,就没有驱动程序。用户库加载可用于显式地检查所有这些可能性。我知道,因为我在自部署的HPC集群CUDA应用程序中做过这个操作,在这种情况下,你不知道节点在应用程序被放置到节点之前处于什么状态。 - talonmies

0
创建一个插件,使其动态链接到相关的CUDA库并执行检查。
然后尝试加载插件并运行其检查。
  • 如果插件无法加载,则说明您没有安装CUDA库,因此可以假定为False

  • 如果插件成功加载,则表示您已经安装了CUDA库,并且可以执行检查,以确定硬件是否支持CUDA。


0

作为一个晚来的补充回答:

我也在解决同样的问题(检测CUDA安装而不使用它),我的解决方案是:

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

-1

使用 cudaGetDeviceCount() 函数来判断计算机是否支持 CUDA。

根据这个帖子,你不能静态链接 cudart.dll 库文件。

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

你也可以使用 nvidia-smi 命令来查看计算机上是否安装了 CUDA。


为了使用cudaSomeFunction,我需要确保cudart.dll(否则应用程序会崩溃)存在。那么该怎么做呢? - Xlaudius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接