2

I wrote a simple application that checks if NVIDIA CUDA is available on the computer. It simply displays true if a CUDA-capable device is found.

I send the app to a second PC, and the application didn't run - a dialog box showed up that cudart.dll was not found. I want to check if CUDA is present and it requires CUDA to do that :)

I am using CUDA 5.0, VS2012, VC++11, Windows 7.

Can I compile the application in a way, that all CUDA libraries are inside the executable?


So the scenario is:

  1. My app is compiled & sent to a computer
  2. The computer can:
    1. be running windows, linux (my app is compatible with the system)
    2. have a gpu or not
    3. have an nvidia gpu or not
    4. have CUDA installed or not
  3. My app should return true only if 2.3 and 2.4 are positive (GPU with CUDA)
4

6 回答 6

6

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

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

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

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

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

于 2013-04-07T09:04:13.610 回答
2

链接到 stackoverflow 上的另一篇文章:detecting-nvidia-gpus-without-cuda 这显示了检查 cuda api 是否可用和可访问的整个序列。

于 2015-03-22T07:03:52.247 回答
0

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

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

于 2013-04-07T08:36:42.067 回答
0

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

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

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

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

于 2013-04-07T08:49:19.343 回答
0

作为一个迟到的答案:

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

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

Use cudaGetDeviceCount() to know if the computer is CUDA-capable.

According to this thread, you cannot statically link cudart.dll.

There are workarounds: embed the CUDA runtime as a resource in your executable, then extract it when your program runs, then dynamically link.

You can also use nvidia-smi to see if CUDA is installed on a machine.

于 2013-04-07T08:39:10.917 回答