CUDA是否会悄悄降下双浮

Does CUDA quietly downcasts double to float?

本文关键字:悄悄 是否 CUDA      更新时间:2023-10-16

我正在查看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会"悄悄地"降级"doublefloat。(当发生这种情况时,编译器会发出警告。)

此行为在计算能力为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

如果在编译输出中没有看到该警告,则表示降级没有发生。