CUDA内在功能优势
Posted
技术标签:
【中文标题】CUDA内在功能优势【英文标题】:CUDA intrinsic function advantage 【发布时间】:2015-11-19 06:12:49 【问题描述】:类似于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 文档)。为什么会有好处?
【问题讨论】:
【参考方案1】:真正简短的回答是,使用像 __fmul_rd
这样的东西从来都不是“有利的”,但有时使用具有明确定义和完全可预测(或标准化)舍入和编译行为的浮点指令需要使计算正常工作。以This 为例。
一般规则是,如果您不明白为什么存在这些浮点内在函数,则不应使用它们。
【讨论】:
不使用内部函数时,CUDA 的默认舍入模式是否与 GCC 一样舍入到最近?【参考方案2】:Intrinsics 让您可以更好地控制内部循环将要执行的操作。如果我调用 __fmaf_rd
,我几乎可以肯定发出的 PTX 将有一个 fma.rd
指令,而不必求助于编写内联汇编代码。
因此,我不必担心编译器可能会以不同于我想要的方式优化循环*,或者我忽略的标准中可能存在一些需要编译器实现某些东西的微妙之处比我想象的要复杂。
当然,如果我真的知道我在这方面做什么,这只是一个很好的动力,但如果我知道,它就在那里供我使用。并且作为内在函数优于内联汇编,因为编译器实际上理解指令。
*:当您知道实现循环的最佳方法时,您无法理解这是多么令人沮丧,但是编译器不断“优化”到效率较低的东西
【讨论】:
通常情况正好相反。您需要使用内部函数来防止编译器执行优化,例如将乘法和加法运算融合到 FMAD 中以及更改给定浮点计算的舍入行为。以上是关于CUDA内在功能优势的主要内容,如果未能解决你的问题,请参考以下文章
Python 扩大领先优势,PyTorch 仅占 6.4%:2018 年数据科学语言&工具排名