__saturatef()内在函数没有双精度等价物

时间:2017-10-14 15:43:40

标签: cuda

Cuda支持intrinsic functions。有些映射到设备指令,如融合乘法 - 加法,无法用普通语法表示。其他的近似值应该比“标准”函数更快(尽管可能不太准确)。

似乎后一种类型的内在函数不支持双精度参数,并且仅适用于单精度浮点数。有道理:如果你使用双打,那么你的定义就是对速度的准确性感兴趣。

令我惊讶的是,__saturatef()内在函数将其参数限制在0和1之间,它没有双精度版本。

如果我在一个天真的实现中使用__saturatef()内在函数,是否有任何潜在的数据丢失?如果是这样,有人知道这种内在的运作方式吗?如果没有,为什么nvidia会遗漏双精度版本?

1 个答案:

答案 0 :(得分:4)

CUDA设备功能内在函数的目的是揭示其他方式无法访问的特定硬件功能,例如:一些代数和超越函数的快速近似,或者在__saturatef()的情况下钳位到区间[0,1],它映射到GPU的机器指令F2F{.FTZ}.F32.F32.SAT以获得5.0之前的计算能力(sm_50)FADD.SAT用于大于或等于计算能力5.0的体系结构。

查看PTX documentation表明半精度(.f16)和单精度(.f32)运算支持浮点饱和,但不支持双精度(.f64)运作。因此,所提供的内在函数的非正交性是由GPU硬件中的非正交性引起的。由于相关用例(包括通常不使用双精度的图形),因此提供了较低精度的饱和度。

快速详尽的测试表明,__saturatef (float)的行为与fmaxf (fminf (float, 1.0f), 0.0f)相同。查看反汇编代码,CUDA编译器似乎也会将此最小/最大惯用语与__saturatef()的使用相同,作为优化。因此,可以轻松创建双精度等效项

double my_saturate (double a)
{
    return fmax (fmin (a, 1.0), 0.0);
}