我写了一个简单的应用程序来检查计算机上是否有NVIDIA CUDA。如果找到支持CUDA的设备,它只会显示 true 。
我将应用程序发送到第二台PC,并且应用程序没有运行 - 出现一个对话框,显示找不到 cudart.dll 。我想检查CUDA是否存在,并且需要CUDA来执行此操作:)
我使用的是CUDA 5.0,VS2012,VC ++ 11,Windows 7。
我能否以某种方式编译应用程序,所有CUDA库都在可执行文件中?
所以场景是:
true
答案 0 :(得分:6)
作为开场评论,我认为您的修改步骤的顺序和数量不正确。它应该是:
如果步骤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卡的情况下告诉你)const char * szCuda8Path = std::getenv("CUDA_PATH_V8_0");
(必须是!= nullptr)答案 5 :(得分:-2)
使用cudaGetDeviceCount()
了解计算机是否具备CUDA功能。
According to this thread,您无法静态链接cudart.dll
。
有一些解决方法:将CUDA运行时作为资源嵌入可执行文件中,然后在程序运行时将其解压缩,然后动态链接。
您还可以使用nvidia-smi
查看计算机上是否安装了CUDA。