|
1
16
您可能需要在这里使用可移植的C代码,编译器会将其转换为适当的ARM程序集。ARM有条件移动,这些移动可以以溢出为条件。然后,该算法变为加法,如果检测到溢出,则有条件地将目标设置为无符号(-1)。
请注意,这与其他算法不同,因为它更正溢出,而不是依赖其他计算来检测溢出。 x86-64 clang 3.7 -O3 output for adds32 :明显优于其他答案:
ARMv7:
16位:仍然不使用ARM的无符号饱和加法指令(
|
|
2
25
普通C:
它几乎是宏观化的,直接传达了意义。 |
|
|
3
18
在没有条件跳转的ia32中:
|
|
|
4
11
在ARM中,您可能已经内置了饱和算术。ARMv5DSP扩展可以将寄存器饱和到任何位长度。另外,手臂饱和通常是便宜的,因为你可以执行大多数有条件的指令。 ARMV6甚至还有饱和加法、减法和所有其他32位和压缩数的东西。 在x86上,您可以通过mmx或sse获得饱和算术。 所有这些都需要装配工,所以这不是你要的。 还有一些C-技巧可以做饱和算术。这个小代码对一个双字的四个字节进行饱和加法。它基于并行计算32个半加法器的思想,例如不带进位溢出的加法。 这是先完成的。然后计算进位,如果进位溢出,则添加并替换为掩码。
您可以通过更改signmask常量和底部的移位来获得16位(或任何类型的位字段)的相同值,如下所示:
上述代码对16位和32位值的作用相同。 如果您不需要函数添加的特性,并且并行地饱和多个值,只需屏蔽您需要的位。在ARM上,您还希望更改signmask常量,因为ARM不能在单个循环中加载所有可能的32位常量。 编辑: 并行版本最有可能比直进方法慢,但如果一次必须饱和多个值,则速度更快。 |
|
|
5
10
如果你关心表演,你 真的? 想在simd中做这类事情,在simd中x86有本地的饱和算法。 由于在标量数学中缺乏饱和算法,我们可以得到在4变量宽的SIMD上进行运算的情况。 更多 比等效C快4倍以上(对于8变量宽度的SIMD,也相应地正确):
|
|
|
6
9
零分支解决方案:
一个好的编译器会对此进行优化,以避免执行任何实际的64位算术。(
在x86 ASM(AT&T语法中,
8位和16位版本应该很明显。签名版本可能需要更多的工作。 |
|
|
7
7
编辑: 既然你已经发布了你的版本,我不确定我的版本是否更干净/更好/更高效/更勤奋。 |
|
|
8
3
我不确定这是否比skizz的解决方案更快(总是概要),但这里有一个替代的无分支组装解决方案。请注意,这需要条件移动(cmov)指令,我不确定它是否适用于您的目标。
|
|
|
9
2
我们使用的当前实现是:
|
|
|
10
2
我想,x86最好的方法是在添加后使用内联汇编程序检查溢出标志。类似:
它不是很轻便,但我觉得是最有效的方法。 |
|
|
11
2
最好的性能通常包括内联装配(正如一些人已经说过的那样)。 但是对于便携式C,这些功能只涉及一个比较,不涉及类型转换(因此我认为是最佳的):
作为宏,它们变成:
我把“无符号长整型”和“无符号长整型”的版本留给读者作为练习。;-) |
|
|
12
2
以防有人想知道一个不使用2的补码32位整数进行分支的实现。 警告!此代码使用未定义的操作:“右移-1”,因此利用 Intel Pentium SAL instruction 将计数操作数屏蔽为5位。
这是我所知道的最好的实现 |
|
|
13
0
使用C++可以编写更灵活的变体 雷莫 解决方案:
这可以很容易地转换为C-使用中定义的限制
|
|
|
14
0
无分支x86 ASM解决方案的另一种选择是(AT&T语法,EAX和EBX中的A和B,导致EAX):
|
|
|
15
0
我做了一个快速的测试,似乎有效,但还没有广泛抨击它!这适用于有符号的32位。 op:网页上使用的编辑器不允许我发布宏,即它不理解非缩进语法等! |
|
|
16
0
这个实现不使用控制流,campare操作符(
|
|
|
17
0
饱和算法不是C语言的标准,但通常是通过编译器内部实现的,所以最有效的方法是不干净的。必须添加ifdef块以选择正确的方式。msalters的答案对于x86体系结构来说是最快的。对于ARM,您需要在16位版本中使用ARM QAD16(Microsoft Visual Studio)的uuqadd16函数(ARM编译器),在32位版本中使用uuqadd16函数。 它将自动转换为单臂指令。 链接: QADAD16 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CJAICDDF.html 阿姆斯加德16 https://msdn.microsoft.com/en-US/library/hh875058.aspx 阿加德 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472m/chr1359125002575.html |
|
Sweepy Dodo · JSON lite的格式化 1 年前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
Zegarek · Postgresql递归查询未提供预期结果 1 年前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 2 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 2 年前 |