【问题标题】:Way to get floating-point special values in CUDA?在 CUDA 中获取浮点特殊值的方法?
【发布时间】:2013-03-09 00:01:06
【问题描述】:

CUDA 中是否有任何设备函数可以获取 IEEE 754 特殊值,例如 inf、NaN?我的意思是稳定的方式,而不是一些可以被编译器优化的数学运算。

我只找到了一个名为 nan() 的设备函数,它必须接受一些未知的字符串参数。

【问题讨论】:

    标签: cuda floating-point nvidia nan


    【解决方案1】:

    CUDART_NAN (double) 和 CUDART_NAN_F (float) 在 /usr/local/cuda/include/math_constants.h 中定义如何:

    #define CUDART_NAN_F            __int_as_float(0x7fffffff)
    #define CUDART_NAN              __longlong_as_double(0xfff8000000000000ULL)
    

    和:

    #define CUDART_INF_F            __int_as_float(0x7f800000)
    #define CUDART_INF              __longlong_as_double(0x7ff0000000000000ULL)
    

    【讨论】:

    • 您在 CUDA 中找到的 nan() 函数是 ISO C99 标准指定的 nan() 函数。我相信相同的功能现在是 C++11 的一部分。请注意,此标准数学函数的双精度版本将比使用 Robert 指出的解决方案慢很多,因为它需要解析字符串参数来构造 NaN 的数值。单精度版本 nanf() 非常快,因为 NVIDIA GPU 只支持一个规范的单精度 NaN,所以这就是函数返回的内容。
    【解决方案2】:

    CUDA 现在在数学库中有 nanf 指令。

    设备 float nanf( const char *tagp )

    Returns "NaN"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2016-09-25
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多