【问题标题】:Increment or decrement in boundaries增加或减少边界
【发布时间】:2017-06-03 14:22:55
【问题描述】:

我会用 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
    else : return r

注意:假设变量“a”的初始值已经在边界内(min

问题是:

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

我问的原因纯属好奇,当然我无法用 Python 优化它,而且我对 CPU 架构知之甚少。

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

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

我知道后者在 Python 中没有任何意义,所以把它当作我天真的尝试想象低级代码增加了价值。有一些细微差别,例如有符号、无符号,但我只对无符号整数感兴趣,因为我经常遇到它。

【问题讨论】:

  • 有趣的问题,让我深挖,仍然找不到确切的答案。在 ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/… 中,第 170 页向内讨论了如何使用 IA-32 指令(jc 和 inc)检测溢出。使用 GCC,您可以使用 -ftrapv 发出 SIGABRT 并注册处理程序并解决溢出问题。
  • 我明白你的问题,但为了清楚起见,你无法检测加法的结果是否大于它可以用你编写 UP 函数的方式表示的最大值。考虑一个有符号整数,如果您的当前值为 0x7FFFFFFE,比 MAX 小 1,并且您想加 2,它将溢出并导致 -2,147,483,648 小于它可以表示的最大值。所以你永远不会看到你的 UP 函数返回 MAX

标签: compilation cpu-architecture intrinsics


【解决方案1】:

它被称为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(即运算是模 28)。

【讨论】:

  • 谢谢,是的,我一直在寻找任意界限。现在我知道谷歌的正确术语了。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2020-07-06
  • 2012-11-28
相关资源
最近更新 更多