我快速浏览了一下CUDA编程指南w.r.t -use-fast-math optimizations,虽然附录C提到要转换为内在的除法但是没有提及乘法。我问这个问题的原因是,我的内核有很多乘法。我知道NVCC会尝试融合乘法和加法(当使用常规'*'和'+'运算符时,内在函数永远不会合并到FMAD运算中)。但是,如果我的代码是繁重的,那么如果使用像__fmul_rn
这样的SP内在函数,会有一个好处吗?
所以有两个问题:
-use-fast-math选项是否将带有'*'运算符的乘法转换为像__fmul_rn这样的SP instrinsics?
手动编码乘法是否有明显使用__fmul_rn的性能优势?一个例子或一些数字可以帮助我理解。
答案 0 :(得分: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之间的吞吐量存在差异。