CUDA是否会悄悄地贬低双倍浮动?

时间:2015-10-06 23:29:06

标签: c++ cuda floating-point

我正在研究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);
}

由于我在双精度浮点上依赖于必要的方法(代码中有很多潜在的灾难性取消)我在相信自己的眼睛时遇到了一些麻烦。

你能解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:7)

您正在查看的是在编译cc1.1或cc1.2设备(在CUDA 6.5上)时使用的文件,该文件没有对double算术的本机支持,并且是CUDA会安静地#34; "降级" 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

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