5

我快速浏览了 CUDA 编程指南 wrt -use-fast-math optimizations,虽然附录 C 提到了要转换为内在函数的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法。我知道 NVCC 会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内在函数永远不会合并到 FMAD 操作中)。但是,如果我的代码是乘法繁重的,那么如果使用舍入 SP 内在函数会有好处__fmul_rn吗?

所以有两个问题:

  1. -use-fast-math 选项是否将使用“*”运算符的乘法转换为像 __fmul_rn 这样的 SP 内在函数?

  2. 手动编码乘法以显式使用 __fmul_rn 是否会带来性能优势?一个例子或一些数字可以帮助我理解。

4

1 回答 1

3

“独立”单精度乘法始终编译为硬件指令(“内在”)。没有其他类型的浮点乘法指令。nvcc 中的 -use_fast_math 选项对为计算能力 1.x 目标发出的浮点乘法指令没有影响。在计算 2.x 和 3.x 目标上,它将编译器置于兼容模式,所有单精度乘法指令将mul.ftz.f32(刷新为零)。

您提到的浮点内在函数 ( __fmul_{rm,rn,rp,rz,ftz,sat}) 仅提供对 IEEE 舍入行为的显式控制。我不相信它们在 Fermi 或 Kepler GPU 上的吞吐量差异。

于 2012-07-16T17:07:15.390 回答