如何检测机器上是否安装有CUDA

先谢谢版主。

cuda程序写好之后生成了exe,但是这个exe文件在别的机器上面(相同版本的操作系统)不能运行,提示是说缺失runtime环境之类的信息。
问题1:cuda程序的exe文件需要的最低环境是啥呀?只需有cuda驱动就行了吗?
问题2:在上问的基础上,我怎么写程序判断一台电脑上是否安装了cuda可以运行的环境呢?因为如果cuda不能使用的话,那程序至少还可以转为cpu执行,不至于使程序产生运行时错误。
问题3:我一直搞不清楚一点,cuda的驱动和N卡的驱动是同一个东西吗?

LZ您好:

1:需要有主流N卡,需要有合适的驱动(较新版本),需要您的可执行文件,需要和您的可执行文件同目录下的CUDARUNTIME的DLL文件。
以及,如果您的代码编译的时候compute编译参数不合适,可能也会有一些问题。比如您按照compute_30编译,目标机器上只有1.x计算能力的GPU,此时也不行。

2:您可以参考一下cuda samples中的deviceQuery这个例子,以识别目标机器上的显卡的情况,驱动版本等。

3:N卡的显卡驱动中含有CUDA支持,所以您可以认为CUDA 驱动实际上内嵌于N卡驱动之内。

大致如此,祝您好运~

我补充下ICE的说法,

(1)您需要将cuda runtime的dll们(cudart*.dll)和您的exe一起发布(以及,VC redistributable)。或者从CUDA 5.5起,您可以将cuda runtime静态连接到您的exe中(请用cudart_static.lib替换cudart.lib链接)

(2)及时如此,您的项目将需要安装了显卡驱动后才能执行(请注意,AMD的驱动不行)(需要nvcuda.dll), 否则将无法成功在没有显卡驱动的N卡,以及即使安装了驱动的A卡上执行。
以及,您可以简单的用int n=0; cudaGetDeviceCount(&n)来检测n是否是0来判断您当前是否存在可用的N卡。

感谢来访。

关于在无CUDA环境的机器上,让kernel自动转换为CPU执行,
这个抱歉,CUDA目前尚无自动转换在CPU执行的能力。

但是考虑到PGI已经被收购,cuda-x86极有可能在下个版本被集成在cuda里,这样,您的exe中可能将同时存在for cpu和for gpu的code(也可能以ptx的形式存在,runtime集成现场转换代码,转换成cpu版本),届时将自动在无卡的机器上运行。

敬请期待。

以及稍微补充一下:

如果LZ自身在代码中准备好一个CPU版本的实现和一个GPU版本的实现,然后根据检测结果决定使用哪个,这个是可以的,直接就能实现。

太感谢您们两位了,试了一下,可以解决我的问题了。如果操作系统们在装机的时候就带上这些动态库就好了。前段时间论坛进不来,所以回复的有点晚了,不好意思哈。

感谢来访,论坛每天的上午和上半夜都是好的,建议您这2个时间段来访。