与this question类似,在CUDA Math API中使用内在函数(单,双或半)是否有任何优势。我知道有些版本的版本速度较快(不太准确),例如__fdivdef
,但这些版本总是可以与-use_fast_math
一起使用,但其他函数呢。例如,为什么会使用__fadd_rd(A,B)
而不是A+B
或__fmaf_rd(A,B,C)
而不是A+B+C
?我能想到的一个原因是人们可以更方便地选择舍入方法 - 很好。
某些函数,例如__fmul_rd
"永远不会合并为单个乘加指令" (根据CUDA Math API文档)。为什么这会有利?
答案 0 :(得分:3)
真正简短的回答是,使用类似__fmul_rd
之类的内容永远不会有利于&#34;,但有时使用具有明确定义且完全可预测(或标准化)舍入和编译行为的浮点指令< em> required 使计算正常工作。例如This。
一般规则是,如果你不理解为什么存在这些浮点内在函数,你就不应该使用它们。
答案 1 :(得分:3)
Intrinsics让您可以更精确地控制内循环将要执行的操作。如果我调用__fmaf_rd
,我几乎可以肯定发出的PTX将会有一条fma.rd
指令,而不必求助于编写内联汇编代码。
因此,我不必担心编译器可能会以不同于我想要 * 的方式优化循环,或者我可能会忽略一些需要编译器实现的标准的细微之处比我想象的要复杂得多。
当然,如果我真的知道我在这方面做了什么,这只是一个很好的动机,但如果我这样做,那就是我可以使用的。并且作为内在函数优于内联汇编,因为编译器实际上理解指令。
*:当你知道实现循环的最佳方式时,你无法理解它是多么令人沮丧,但编译器会“优化”效率低下的东西