Compilation 边界的增量或减量
我将用Python做一些例子,因为我使用Python,但问题不在于Python。 假设我想通过特定的值来增加一个变量,使它保持在给定的边界内 对于增量和减量,我有两个函数:Compilation 边界的增量或减量,compilation,cpu-architecture,intrinsics,Compilation,Cpu Architecture,Intrinsics,我将用Python做一些例子,因为我使用Python,但问题不在于Python。 假设我想通过特定的值来增加一个变量,使它保持在给定的边界内 对于增量和减量,我有两个函数: def up (a, s, Bmax): r = a + s if r > Bmax : return Bmax else : return r def down (a, s, Bmin): r = a - s if r < Bmin : return Bmin
def up (a, s, Bmax):
r = a + s
if r > Bmax : return Bmax
else : return r
def down (a, s, Bmin):
r = a - s
if r < Bmin : return Bmin
else : return r
我知道后者在Python中没有任何意义,所以将其视为我天真的尝试,想象低级别代码,以适当的方式添加值。有一些细微差别,例如有符号、无符号,但我只对无符号整数感兴趣,因为我经常遇到它。它被称为,它在DSP和GPU上有本机支持(不是随机对:两者都处理信号)
例如,让程序员选择加法是否饱和
.sat
将操作大小的结果限制为MININT..MAXINT(无溢出)
政府支持
双16位饱和算术运算
以及类似于sadd
的指令,用于执行饱和加法,甚至是整个寄存器(饱和状态寄存器),专用于在执行一系列指令时收集有关饱和的精确信息
即使是主流x86也支持类似和类似指令(包括转换)的饱和
另一个示例是,用于确保颜色值不在范围[0,1]之外
一般来说,如果必须针对信号/媒体处理优化体系结构,则该体系结构支持饱和算法
更为罕见的是支持具有任意边界的饱和,例如不对称边界、两个边界的非幂次、非字大小的边界
然而,饱和可以很容易地实现为min(max(v,b),b)
,其中v是不饱和(且不溢出)操作的结果,b是下限,b是上限。因此,任何支持在没有分支的情况下查找最小值和最大值的体系结构都可以有效地实现任何形式的饱和 有关如何实现饱和加法的更真实示例,请参见
作为旁注,默认行为为环绕:对于8位量,255+1之和等于0(即运算为28模)。它被称为DSP和GPU上的本机支持(不是随机对:两者都处理信号) 例如,让程序员选择加法是否饱和
.sat
将操作大小的结果限制为MININT..MAXINT(无溢出)
政府支持
双16位饱和算术运算
以及类似于sadd
的指令,用于执行饱和加法,甚至是整个寄存器(饱和状态寄存器),专用于在执行一系列指令时收集有关饱和的精确信息
即使是主流x86也支持类似和类似指令(包括转换)的饱和
另一个示例是,用于确保颜色值不在范围[0,1]之外
一般来说,如果必须针对信号/媒体处理优化体系结构,则该体系结构支持饱和算法
更为罕见的是支持具有任意边界的饱和,例如不对称边界、两个边界的非幂次、非字大小的边界
然而,饱和可以很容易地实现为min(max(v,b),b)
,其中v是不饱和(且不溢出)操作的结果,b是下限,b是上限。因此,任何支持在没有分支的情况下查找最小值和最大值的体系结构都可以有效地实现任何形式的饱和 有关如何实现饱和加法的更真实示例,请参见
作为旁注,默认行为是环绕式的:对于8位量,255+1的和等于0(即运算是模28)。有趣的问题,让我挖苦了,仍然找不到确切的答案。在中,第170页向内讨论了如何检测溢出,以及IA-32指令(jc和inc)。有了GCC,您可以使用-ftrapv发出SIGABRT并注册一个处理程序并整理溢出。我明白您的问题,但只是想澄清一下,您无法检测加法的结果是否大于您编写up函数的方式所能表示的最大值。考虑一个带符号的int,如果当前值是0x7FFFFFFE,它比最大值小一个,并且要加2,它将溢出并导致-2147483648,它比它可以表示的最大值小一个。所以你永远不会看到你的UP函数返回一个有趣的问题,让我挖苦,仍然找不到确切的答案。在中,第170页向内讨论了如何检测溢出,以及IA-32指令(jc和inc)。有了GCC,您可以使用-ftrapv发出SIGABRT并注册一个处理程序并整理溢出。我明白您的问题,但只是想澄清一下,您无法检测加法的结果是否大于您编写up函数的方式所能表示的最大值。考虑一个带符号的int,如果当前值是0x7FFFFFFE,它比最大值小一个,并且要加2,它将溢出并导致-2147483648,它比它可以表示的最大值小一个。所以你永远不会看到你的UP函数返回maxThank,是的,我在寻找任意的边界。现在我知道了谷歌的正确术语。谢谢,是的,我在寻找任意的界限。现在我知道了谷歌的正确术语。
def up (a, s, Bmax):
counter = 0
while True:
if counter == s : break
if a == Bmax : break
if a == 255 : break
a += 1
counter += 1
add.type d, a, b;
add{.sat}.s32 d, a, b; // .sat applies only to .s32