【问题标题】:How do I use compiler intrinsic __fmul_?如何使用编译器内在 __fmul_?
【发布时间】:2012-06-19 11:47:35
【问题描述】:

我正在使用 CUDA 编写一个大规模并行 GPU 应用程序。我一直在手动优化它。我通过__fdividef_(x, y) 获得了 20% 的性能提升,并且根据 Cuda C 编程指南(第 C.2.1 节),使用类似的函数进行乘法和加法也是有益的。

函数声明如下:__fmul_[rn,rz,ru,rd](x,y)。

__fdividef(x,y) 没有用括号中的参数说明。我想知道,这些括号是什么?

如果我运行简单的代码:

int t = __fmul_(5,4);

我收到关于 __fmul_ 未定义的编译器错误。我包含了 CUDA 运行时,所以我不认为这是一个设置问题;相反,它与那些方括号有关。如何正确使用此功能?谢谢。

编辑:我应该澄清一下,编译器是 CUDA 编译器 NVCC。

【问题讨论】:

    标签: c compiler-construction cuda intrinsics


    【解决方案1】:

    您应该使用ru(向上舍入)或rd(向下舍入)指定舍入模式。没有函数__fmul_,但可用的函数签名是__fmul_rd 或__fmul_ru。

    【讨论】:

    • 如果我用它来替换通常的'*'(星号语法),并且我想保留所有精度(单精度浮点数),我应该指定什么?
    • 此函数符合 IEEE 标准。
    • 方括号表示必须从中选择一项的列表。实际的内在函数称为 __fmul_rn()、__fmul_rz()、__fmul_ru() 和 __fmul_rd()。要替换单精度计算的普通乘法运算符,您可能需要使用 __fmul_rn()。这是一个四舍五入到“最接近偶数”的乘法,这是乘法运算符映射到的。要替换双精度乘法运算符,您需要改用 __dmul_rn()。其他 IEEE 舍入模式支持特殊用途,例如区间算术。
    【解决方案2】:

    CUDA Programming Guide 解释后缀:

    • _rd:向下取整。
    • _rn:四舍五入到最接近的偶数。
    • _ru:围捕。
    • _rz:向零舍入。

    有关这些功能的详细信息,请参阅CUDA's Single Precision Intrinsics documentation。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多