Cuda 支持内在函数。有些映射到设备指令,例如融合乘法加法,无法用正常语法表示。其他函数是近似值,应该比“标准”函数更快(尽管可能不太准确)。
似乎后一种类型的内在函数不支持双精度参数,而仅支持单精度浮点数。这是有道理的:如果您使用双打,那么根据定义,您对准确性而不是速度感兴趣。
然而,令我惊讶的是,__saturatef()将其参数限制在 0 和 1 之间的内在函数没有双精度版本。
__saturatef()如果我在简单的实现中使用内在函数,是否会有任何潜在的数据丢失?如果是这样,有人知道这个内在是如何工作的吗?如果不是,为什么 nvidia 会忽略双精度版本?
CUDA 的设备函数内在函数的目的是公开无法以其他方式访问的特定硬件功能,例如对某些代数和超越函数的快速逼近,或者在 的情况下钳位到区间 [0,1],__saturatef()这映射到 GPU 的机器指令F2F{.FTZ}.F32.F32.SAT对于 5.0 之前的计算能力(sm_50)以及FADD.SAT大于或等于计算能力 5.0 的架构)
查看PTX 文档.f16可知,半精度 ( ) 和单精度 ( ) 运算支持浮点饱和.f32,但双精度 ( ) 不支持浮点饱和。.f64 ) 运算不支持浮点饱和。因此,所提供的内在函数的非正交性是由 GPU 硬件中的非正交性引起的。由于相关用例(包括通常不使用双精度的图形),为较低精度提供了饱和度。
快速详尽的测试表明其__saturatef (float)行为与 相同fminf (fmaxf (float, 0.0f), 1.0f)。查看反汇编代码,CUDA 编译器似乎也会将这个 min / max 习惯用法与__saturatef(), 的使用相同地视为一种优化。因此,可以轻松创建双精度等价物,如下所示
double my_saturate (double a)
{
return fmin (fmax (a, 0.0), 1.0);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |