【问题标题】:Program to check CUDA presence needs CUDA?检查 CUDA 存在的程序需要 CUDA?
【发布时间】:2013-03-29 10:19:57
【问题描述】:

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

我将应用程序发送到第二台 PC,但应用程序没有运行 - 出现一个对话框,显示找不到 cudart.dll。我想检查 CUDA 是否存在,它需要 CUDA 来执行此操作:)

我正在使用 CUDA 5.0、VS2012、VC++11、Windows 7。

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


所以场景是:

  1. 我的应用程序已编译并发送到计算机
  2. 计算机可以:
    1. 正在运行windows、linux(我的应用与系统兼容)
    2. 有没有显卡
    3. 是否有 nvidia gpu
    4. 是否安装了 CUDA
  3. 只有当 2.3 和 2.4 为正(GPU 和 CUDA)时,我的应用才应返回 true

【问题讨论】:

  • 那将是静态链接。为什么不动态链接它们?此外,您可以在链接之前检查 cudart.dll 是否存在。
  • 我想要一个可执行文件(或一个 DLL,它是某个框架的插件)。我不想发送 2 个文件。如果我错了,请纠正我,但缺少 cudart.dll 并不意味着不存在 CUDA-GPU。NVIDIA 图形驱动程序(对于普通用户)是否包含 CUDA 库?
  • 我很困惑 - 您是要确保(或检查)CUDA 运行时库的可用性,还是支持 CUDA 的硬件的可用性,或两者兼而有之? (据我所知,后者依赖于前者)。
  • 实际上 - 两者都有,因为 CUDA 硬件在没有 CUDA 运行时是无用的。但是运行时的存在并不意味着 GPU 是兼容的(允许仿真)
  • @Xlaudius:没有 CUDA 运行时,CUDA 硬件不是“无用”。 CUDA 驱动程序 API 可用于运行 CUDA 代码,而无需运行时 API,并且驱动程序 API 库随所有 Windows 平台上的驱动程序一起提供。听起来您在问题中将两件事与一件事混为一谈-如何检测有效的运行时 API 库的存在,然后如何检测硬件。第一个答案可能是延迟加载运行时 API 库并处理失败时发生的情况。

标签: c++ windows visual-c++ cuda


【解决方案1】:

作为一个迟到的答案:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      在第 1 步中,您想在 Linux 上使用 dlopen 之类的东西并处理返回状态。在 Windows 上,您可能想使用 DLL delay loading mechanism(抱歉,不是 Windows 程序员,无法告诉您更多信息)。

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

      【讨论】:

      • 好的,所以首先尝试自己加载库作为健全性检查,然后才调用自己调用/打开库的 CUDA 函数?我理解正确吗?
      • 差不多。您自己加载库,然后您需要自己从库中获取所需的函数,然后设置调用并执行它们。我在回答中为您提供的链接中提供了如何执行此操作的示例。
      • 所以如果我需要cudaMalloc 我必须自己去获取它?并获取我需要的所有 20 个其他功能?
      • @Xlaudius:您问的是“检查计算机上是否有 NVIDIA CUDA 的简单应用程序。如果找到支持 CUDA 的设备,它只会显示 true。”我不建议将其用于完整的应用程序。只需让这个小代码自行加载库,然后尝试枚举设备。如果可以,请 fork 真正的应用程序,因为您知道它会运行良好,因为您拥有必要的驱动程序和硬件。
      【解决方案4】:

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

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

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

      • 如果插件加载成功,说明你已经安装了CUDA-libs,可以检查硬件是否也支持CUDA。

      【讨论】:

        【解决方案5】:

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

        According to this thread,不能静态链接cudart.dll。

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

        您也可以使用nvidia-smi查看机器上是否安装了CUDA。

        【讨论】:

        • 为了使用cudaSomeFunction,我需要确保cudart.dll(否则-应用程序崩溃)存在。以及如何做到这一点?
        【解决方案6】:

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

        我认为最好的方法是老式方法,请考虑查看simple web page,您会得到更可靠的答案。

        【讨论】:

        • @talonmies 如果用户使用了错误的驱动程序......你永远不会知道 :) 永远不要假设用户知道他在做什么或应该如何配置他自己的电脑,永远不要.
        • 你当然知道。 如果运行时 API 库存在,但没有硬件或驱动程序不匹配,它将返回一个错误,告诉您出了什么问题,如果驱动程序库不存在,则没有驱动程序。用户库加载可用于明确检查所有这些可能性。我知道是因为我在为 HPC 集群自行部署 CUDA 应用程序时已经这样做了,在这种情况下,您事先不知道集群中的节点在您的应用程序被放到节点上之前处于什么状态。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多