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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rob*_*lla 7

您正在查看的是在编译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
Run Code Online (Sandbox Code Playgroud)

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

  • 我看到将来几乎没有人会遇到这个问题,无论"这个问题"是什么.此降级功能已从CUDA工具链中删除,用于CUDA 7和所有未来的CUDA版本.默认计算功能[因CUDA工具包版本而异](http://stackoverflow.com/questions/28932864/cuda-compute-capability-requirements)和CUDA 7及更高版本不设置默认值1.0. (2认同)
  • 即使在CUDA 6.5中,`nvcc`的*default*目标架构也是sm_20.如果我没记错的话,使用sm_1x作为默认目标架构的CUDA的最新版本是两年前发布的CUDA 6.0.所以我同意Robert Crovella的说法,双向浮动降级应该是一个非问题,因为在CUDA 7.0中完全删除了所讨论的功能和文件,并且现在大多数sm_1x GPU已经退役/报废. (2认同)