Mic*_*ael 3 c++ floating-point cuda
我正在研究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);
}
由于我依赖于双精度浮点的基本方法(代码中有很多潜在的灾难性取消)我在相信自己的眼睛时遇到了一些麻烦.
你能解释一下这里发生了什么吗?
您正在查看的是在编译cc1.1或cc1.2设备(在CUDA 6.5上)时使用的文件,该文件没有对double算术的本机支持,是的,CUDA将"安静地""降级" 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
如果在编译输出中没有看到该警告,则降级不会发生.