Cuda __saturatef()内在函数没有双精度等效项

Cuda __saturatef()内在函数没有双精度等效项,cuda,Cuda,Cuda支持。有些映射到设备指令,如fused multiply adds,无法用正常语法表示。另一些是比“标准”函数更快(尽管可能精度更低)的近似值 似乎后一种类型的内在函数不支持双精度参数,而只支持单精度浮点。有道理:如果你使用双打,根据定义,你对速度的准确性感兴趣 然而,令我惊讶的是,将参数限制在0和1之间的\uu saturatef()内在函数没有双精度版本 如果我在一个简单的实现上使用\uuu saturatef()内在函数,是否会有任何潜在的数据丢失?如果是这样的话,有人知道这个内在

Cuda支持。有些映射到设备指令,如fused multiply adds,无法用正常语法表示。另一些是比“标准”函数更快(尽管可能精度更低)的近似值

似乎后一种类型的内在函数不支持双精度参数,而只支持单精度浮点。有道理:如果你使用双打,根据定义,你对速度的准确性感兴趣

然而,令我惊讶的是,将参数限制在0和1之间的
\uu saturatef()
内在函数没有双精度版本


如果我在一个简单的实现上使用
\uuu saturatef()
内在函数,是否会有任何潜在的数据丢失?如果是这样的话,有人知道这个内在机制是如何工作的吗?如果不是,为什么nvidia会省略双精度版本?

CUDA设备功能内部函数的目的是公开无法访问的特定硬件功能,例如,对某些代数和超越函数的快速近似,或者在
\uu saturatef()
的情况下限制到间隔[0,1],对于5.0之前的计算能力(
sm_50)
和大于或等于计算能力5.0的体系结构,它映射到GPU的机器指令
F2F{.FTZ}.F32.F32.SAT

查看显示,半精度(
.f16
)和单精度(
.f32
)操作支持浮点饱和,但双精度(
.f64
)操作不支持浮点饱和。因此,所提供的本质的非正交性是由GPU硬件中的非正交性引起的。由于相关用例(包括通常不使用双精度的图形),饱和度用于较低精度

快速穷举测试表明,
\u saturatef(float)
的行为与
fmaxf(fminf(float,1.0f),0.0f)
相同。看看反汇编的代码,CUDA编译器似乎也会将此min/max习惯用法与使用
\uu saturatef()
视为一种优化。因此,可以根据需要轻松创建双精度等效值

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

CUDA的设备功能内部函数的目的是公开以其他方式无法访问的特定硬件功能,例如对某些代数和超越函数的快速近似,或在
uu saturatef()
的情况下对区间[0,1]进行钳制,该区间映射到GPU的机器指令
F2F{.FTZ}.F32.F32.SAT
用于5.0之前的计算能力(
sm_50)
FADD.SAT
用于大于或等于计算能力5.0的体系结构

查看显示,半精度(
.f16
)和单精度(
.f32
)操作支持浮点饱和,但双精度(
.f64
)操作不支持浮点饱和。因此,所提供的本质的非正交性是由GPU硬件中的非正交性引起的。由于相关用例(包括通常不使用双精度的图形),饱和度用于较低精度

快速穷举测试表明,
\u saturatef(float)
的行为与
fmaxf(fminf(float,1.0f),0.0f)
相同。看看反汇编的代码,CUDA编译器似乎也会将此min/max习惯用法与使用
\uu saturatef()
视为一种优化。因此,可以根据需要轻松创建双精度等效值

double my_saturate (double a)
{
    return fmax (fmin (a, 1.0), 0.0);
}
你所说的“潜在数据丢失”是什么意思?你能举个例子吗?CUDA的设备内部功能的主要目的是公开一些其他方式无法访问的硬件功能。由于相关的用例,硬件为单精度算法提供饱和,而不为双精度算法提供饱和。现在这个问题几乎离题了。我建议重新表述这个问题,让它清楚地与编程有关。例如:假设没有双精度固有的
\uuu饱和(double)
,模拟此操作的最快方法是什么?您所说的“潜在数据丢失”是什么意思?你能举个例子吗?CUDA的设备内部功能的主要目的是公开一些其他方式无法访问的硬件功能。由于相关的用例,硬件为单精度算法提供饱和,而不为双精度算法提供饱和。现在这个问题几乎离题了。我建议重新表述这个问题,让它清楚地与编程有关。例如:假设没有双精度固有的
\uuu饱和(double)
,那么模拟此操作的最快方法是什么?