我快速浏览了 CUDA 编程指南 w.r.t -use-fast-math optimizations,虽然附录 C 提到了要转换为内在的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法。我知道 NVCC 会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内在函数永远不会合并到 FMAD 操作中)。但是,如果我的代码是大量的乘法,那么如果舍入像 __fmul_rn
这样的 SP 内在函数,会有好处吗?用来?
所以有两个问题:
最佳答案
“独立”单精度乘法始终编译为硬件指令(“内部指令”)。没有其他类型的浮点乘法指令。 nvcc 中的 -use_fast_math 选项对为计算能力 1.x 目标发出的浮点乘法指令没有影响。在计算 2.x 和 3.x 目标上,它将编译器置于兼容模式并且所有单精度乘法指令将为 mul.ftz.f32
(清零)。
您提到的浮点内部函数( __fmul_{rm,rn,rp,rz,ftz,sat}
)仅提供对 IEEE 舍入行为的显式控制。我不相信它们在 Fermi 或 Kepler GPU 上的吞吐量存在差异。
关于cuda - -use-fast-math 选项是否将 SP 乘法转换为内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11507440/