【问题标题】:Does CUDA quietly downcasts double to float?CUDA 是否悄悄地向下翻倍浮动?
【发布时间】:2015-10-06 23:29:06
【问题描述】:

我正在查看 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);
}

由于我在本质上依赖于双精度浮点(代码中有很多潜在的灾难性取消),我很难相信自己的眼睛。

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

【问题讨论】:

    标签: c++ cuda floating-point


    【解决方案1】:

    您正在查看的是在编译 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
    

    如果您在编译输出中没有看到该警告,则说明没有降级。

    【讨论】:

    • 当您在 Visual Studio 中创建 .cu 文件时,我认为它默认将计算能力设置为 1.0。我看到很多其他人将来会遇到这个问题。
    • 我看到未来几乎没有人会遇到这个问题,无论“这个问题”是什么。此降级功能已从 CUDA 7 和所有未来 CUDA 版本的 CUDA 工具链中删除。默认计算能力varies by CUDA toolkit version 和 CUDA 7 及更高版本不设置默认值 1.0。
    • 即使在 CUDA 6.5 中,nvcc 的 默认 目标架构也是 sm_20。如果我没记错的话,使用 sm_1x 作为默认目标架构的 CUDA 的最后一个版本是两年前发布的 CUDA 6.0。因此,我同意 Robert Crovella 的观点,即双浮点降级在未来应该不是问题,因为相关功能和文件在 CUDA 7.0 中已完全删除,并且大多数 sm_1x GPU 现在已经退役/报废。跨度>
    猜你喜欢
    • 2015-02-14
    • 2012-01-23
    • 2019-02-17
    • 2018-03-26
    • 2019-11-22
    • 2015-11-26
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多