Cuda支持intrinsic functions。有些映射到设备指令,如融合乘法 - 加法,无法用普通语法表示。其他的近似值应该比“标准”函数更快(尽管可能不太准确)。
似乎后一种类型的内在函数不支持双精度参数,并且仅适用于单精度浮点数。有道理:如果你使用双打,那么你的定义就是对速度的准确性感兴趣。
令我惊讶的是,__saturatef()
内在函数将其参数限制在0和1之间,它没有双精度版本。
如果我在一个天真的实现中使用__saturatef()
内在函数,是否有任何潜在的数据丢失?如果是这样,有人知道这种内在的运作方式吗?如果没有,为什么nvidia会遗漏双精度版本?
答案 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);
}