Cuda 是否使用快速数学选项将SP乘法转换为内部函数?

Cuda 是否使用快速数学选项将SP乘法转换为内部函数?,cuda,nvcc,fast-math,Cuda,Nvcc,Fast Math,我快速浏览了CUDA编程指南w.r.t-使用快速数学优化,虽然附录C提到了要转换为内在函数的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法运算。我知道NVCC会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内部函数永远不会合并到FMAD操作中)。但是,如果我的代码是重乘法的,那么如果使用像\uu fmul\u rn这样的舍入SP内在值会有好处吗 因此有两个问题: 是否使用快速数学选项将带“*”运算符的乘法转换为SP指令,如u_fmul_rn 手动编码乘法显式使用_f

我快速浏览了CUDA编程指南w.r.t-使用快速数学优化,虽然附录C提到了要转换为内在函数的除法,但没有提到乘法。我问这个问题的原因是,我的内核有很多乘法运算。我知道NVCC会尝试融合乘法和加法(当使用常规的“*”和“+”运算符时,并且内部函数永远不会合并到FMAD操作中)。但是,如果我的代码是重乘法的,那么如果使用像
\uu fmul\u rn
这样的舍入SP内在值会有好处吗

因此有两个问题:

  • 是否使用快速数学选项将带“*”运算符的乘法转换为SP指令,如u_fmul_rn

  • 手动编码乘法显式使用_fmul_rn是否会有性能优势?举个例子或一些数字可以帮助我理解

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


    您提到的浮点整数(
    \uu fmul{rm,rn,rp,rz,ftz,sat}
    )只提供对IEEE舍入行为的显式控制。我不认为它们在费米或开普勒GPU上的吞吐量存在差异。

    请注意,_fmul_rn()映射到具有特定IEEE舍入模式的PTX指令。这反过来会抑制某些优化,特别是将单精度乘法和单精度加法合并为乘法-加法类型指令(sm_1x上的FMAD、sm_2x和sm_3x上的FFMA)。请参阅PTX手册。当需要为某些代码实现特定的数值属性时,此属性非常有用,并用于CUDA数学库中的各个位置,例如,“为某些代码实现特定的数值属性,并用于CUDA数学库中的各个位置”-你能举个例子吗?谢谢。将math_functions.h改为fmul_rn将产生各种工作示例。请注意,sm_1x FMAD涉及截断乘法。如果这导致不可接受的精度损失,您可以使用uu fmul_rn()在本地禁止FMAD合并。还有一个nvcc标志-fmad=false,但它会禁止整个编译单元的fmad合并,这通常会对性能产生显著的负面影响。