我正在研究CUDA头文件cuda/6.5.14/RHEL6.x/include/math_functions_dbl_ptx1.h
并看到每个带有double
参数的算术函数都将其转换为float
:
static __forceinline__ double fabs(double a)
{
return (double)fabsf((float)a);
}
...
static __forceinline__ double floor(double a)
{
return (double)floorf((float)a);
}
由于我在双精度浮点上依赖于必要的方法(代码中有很多潜在的灾难性取消)我在相信自己的眼睛时遇到了一些麻烦。
你能解释一下这里发生了什么吗?
答案 0 :(得分:7)
您正在查看的是在编译cc1.1或cc1.2设备(在CUDA 6.5上)时使用的文件,该文件没有对double
算术的本机支持,并且是CUDA会安静地#34; "降级" double
到float
。 (发生这种情况时,编译器会发出警告。)
此行为并未在计算能力1.3及更高版本的设备上体现出来,所有这些设备都支持double
算术。
CUDA 7和7.5不再支持计算能力低于2.0的设备,因此这种特殊行为无法再显现出来,而且它只会对较新的CUDA工具包产生历史意义。 (并且有问题的文件已从这些较新的CUDA工具包中删除。)
供参考,当这个"降级"正在发生,编译器将发出以下形式的警告:
ptxas /tmp/tmpxft_00000949_00000000-2_samplefilename.ptx, line 65; warning : Double is not supported. Demoting to float
如果您在编译输出中没有看到该警告,则降级不会发生。