边界的增加或减少

时间:2017-01-19 01:45:50

标签: compilation cpu-architecture intrinsics

我将在Python中创建示例,因为我使用的是Python,但问题不在于Python。 假设我想通过特定值递增变量,以使其保持在给定的边界内。

因此,对于递增和递减,我有以下两个函数:

Personinfo

注意:假设变量" a"的初始值。已经在边界(min< = a< = max),因此额外的初始检查不属于此功能。是什么让我很好奇,几乎我制作的每一个程序都需要这些功能。

问题是:

  • 是那些归类为一些典型操作并具有特定名称的人吗?
  • 如果是,是否与内在处理器功能有一些对应关系,因此在某些编译器中进行了优化?

我之所以要求是纯粹的好奇,我当然无法在Python中对其进行优化,而且我对CPU架构知之甚少。

更具体地说,在无符号8位整数的较低级别上,增量看起来像我想的那样:

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中没有任何意义,所以把它视为我天真的尝试想象低级代码,它增加了价值。有一些细微差别,例如签名,无符号,但我只对无符号整数感兴趣,因为我经常遇到它。

1 个答案:

答案 0 :(得分:2)

它被称为saturation arithmetic,它在DSP和GPU上具有原生支持(不是随机对:都处理信号)。

例如the NVIDIA PTX ISA让程序员选择添加是否饱和

add.type       d, a, b;
add{.sat}.s32  d, a, b;     // .sat applies only to .s32
     

.sat   对于操作的大小,将结果限制为MININT..MAXINT(无溢出)。

TI TMS320C64x/C64x+ DSP支持

  

双16位饱和算术运算

和像sadd这样的指令执行饱和加法甚至整个寄存器(饱和状态寄存器),专门用于在执行指令序列时收集有关饱和度的精确信息。

即使是主流x86也支持使用vpaddsb等类似指令(包括转换)的饱和度。

另一个例子是GLSL clamp function,用于确保颜色值不在[0,1]范围之外。

通常,如果必须针对信号/媒体处理优化架构,则它支持饱和算法。

更为罕见的是支持任意边界的饱和度,例如:不对称边界,两个边界的非幂,非字大小的边界。

然而,饱和度可以轻松实现为min(max(v, b), B),其中 v 是不饱和(而非溢出)操作的结果, b 是下限和 B 上限 因此,任何支持在没有分支的情况下找到最小值和最大值的架构都可以有效地实现任何形式的饱和。

另请参阅this question以获取有关如何实施饱和加法的更实际示例。

作为旁注,默认行为是环绕式:对于8位量,总和255 + 1等于0(即操作模2 8 )。