CUDA __fsqrt 轮内在函数中四舍五入的术语是什么?
What term is rounded in the CUDA __fsqrt round intrinsics?
我需要在 CUDA 设备代码中计算浮点数的平方根。很难说在我的用例中速度是否比准确性更重要。
__sqrtf CUDA intrinsic is the natural choice
但后来我看到了 various __fsqrt with rounding CUDA intrinsics;
这些内在函数中的四舍五入;参数“x”或 return 值?还是我理解错了这里四舍五入的意思?
我的测试表明两者都不是四舍五入的!我写了一个评估的内核:
__fsqrt_rn(42 * 42 + 0.1)
并且 return 值始终为 42.0011902,等于 42 * 42 + 0.1 的平方根。那么四舍五入是什么?
这是结果的舍入模式。输入参数在被注入算术流之前没有被“舍入”。
“rn”舍入“方向”是“舍入到最近”
这意味着无论中间结果的计算精度如何,该结果都将舍入到最接近的可用表示形式。在 float
最终结果的情况下,它将四舍五入到最接近的可用 float
表示。
让我们重新审视一下您的示例。当我将你的问题放入 windows 10 计算器时,我得到的结果是 42.001190459319126303634970957554 我们从“任意精度的正确结果”到 32 位浮点“rn”结果的方法是取两个32 位浮点数,一个最接近但数值较高,一个最接近但数值较低,在这 2 个中,select 是最接近的一个。那显然是 42.0011902.
我需要在 CUDA 设备代码中计算浮点数的平方根。很难说在我的用例中速度是否比准确性更重要。
__sqrtf CUDA intrinsic is the natural choice
但后来我看到了 various __fsqrt with rounding CUDA intrinsics;
这些内在函数中的四舍五入;参数“x”或 return 值?还是我理解错了这里四舍五入的意思?
我的测试表明两者都不是四舍五入的!我写了一个评估的内核:
__fsqrt_rn(42 * 42 + 0.1)
并且 return 值始终为 42.0011902,等于 42 * 42 + 0.1 的平方根。那么四舍五入是什么?
这是结果的舍入模式。输入参数在被注入算术流之前没有被“舍入”。
“rn”舍入“方向”是“舍入到最近”
这意味着无论中间结果的计算精度如何,该结果都将舍入到最接近的可用表示形式。在 float
最终结果的情况下,它将四舍五入到最接近的可用 float
表示。
让我们重新审视一下您的示例。当我将你的问题放入 windows 10 计算器时,我得到的结果是 42.001190459319126303634970957554 我们从“任意精度的正确结果”到 32 位浮点“rn”结果的方法是取两个32 位浮点数,一个最接近但数值较高,一个最接近但数值较低,在这 2 个中,select 是最接近的一个。那显然是 42.0011902.