一个关于设备函数的问题

在设备函数里不能使用类似puts,printf等输出函数,那么在设备函数里可以使用什么样子的输出语句呢?

请检查你的卡的计算能力,和编译时的计算能力,如果都大于等于2.0的话,应该可以用printf

LZ您好,正如2# 风辰大 所言,如果您的GPU的计算能力大于等于2.0,那么可以在kernel里面使用printf,来显示输出结果。

此外,您还可以将结果copy回host端显示。

以及如果您在kernel里面使用的printf还没有输出结果,程序就结束了的话,您可以在host端的代码中结束之前加上cudaDeviceSynchronize();和cudaDeviceReset();来确保您printf的结果能够输出出来。
printf其他未尽细节请参阅 CUDA C programming guide
以及如果您的GPU是计算能力2.0及以上的,但是编译的时候仍然报错,那么请检查编译选项,GPU Architecture 那里拿掉SM 1.x的项。

祝您编码顺利~

LZ,个人感觉printf()不是很好用,建议使用parallel Nsight调试,查看变量。

LS所言极是,调试推荐使用nsight。

“卡的计算能力和编译时的计算能力”,是同一个东西吗?

您好,两者是相关的不同概念。

GPU的计算能力,指的是GPU支持的一些特性(如合并访问要求高低,原子操作,printf等等),这个是GPU硬件架构决定的。

编译时选择的计算能力/GPU Architecture指的是为某个特定的GPU计算能力/架构编译相应的二进制代码。(编译的时候可以选择为多个架构都生成二进制代码)

所以,如果两者是一致的,那么没问题;如果编译的时候选择的计算能力版本低,那么一些高版本计算能力硬件才提供的功能(如printf)将不能被使用,如果代码中使用了,会报错。

如果编译的二进制代码和实际的GPU架构不同,那么:
1:如果该二进制代码不能直接运行在实际的GPU上,而同时exe中有PTX代码的话,可以通过即时编译(JIT)的方法重新将PTX编译为可以在实际GPU上跑的二进制代码,并予以执行。
2:编译好的二进制代码的架构相容性(即为a计算能力编译的二进制代码,能否直接运行在b架构的GPU上)我不清楚详情,请NV原厂人员或其他熟悉此问题的朋友补充说明。

大致如上,供您参考。

回答2,关于二进制的兼容性是这样的:向后兼容且不越计算能力的主号兼容,举个例子如下:
如果为计算能力x.y编译的二进制文件,只有在计算能力x.z的硬件上运行,其中z>=y,通常可执行文件都带有一份二进制文件和一份或多份ptx文件,因此兼容性应当不成为问题.

也就是说3.1的bin需在至少3.3的卡上运行,3.2就不行了,对吧?

您好,我觉得8#可能笔误了,应该是为x.y编译的二进制文件,只能在计算能力x.z的硬件上运行,其中z>=y。

或者我们把主版本按照ABC划分,子版本按照xyz划分(ABC,xyz均表示从低到高顺序),那么风辰大的文字叙述部分的意思是说:
对A.x编译的二进制文件,可以在A.x,A.y,A.z上运行;但不能在B和C为主版本的硬件上运行。

以上为转述8#风辰大的说法,如有因我理解造成的错误,由我负责。

大致如上,供您参考。

谢谢ICE指正了我的输入错误.

抱歉给你误解了,你的例子中,3.1,3.2,3.3的卡上都可以运行

谢谢ICE和风辰

不客气的,欢迎您常来论坛,祝您编码顺利~