【问题标题】:Which processor architecture is best suited for biginteger arithmetic?哪种处理器架构最适合大整数运算?
【发布时间】:2011-09-09 16:03:26
【问题描述】:

如果我要为大整数计算(例如素数分解、模数计算等)编写汇编代码,重点是速度,哪种架构最适合:x86(-64)、ARM、PowerPC、 MIPS 还是其他?

【问题讨论】:

  • 你打算用什么语言来做这个?
  • 抱歉,这个问题以目前的形式无法回答:您正在混合的架构目前甚至没有针对相同的细分市场(移动、桌面和服务器 - 所以,最适合哪种类型的计算机?)。您可以将问题重申为每赫兹或每瓦特的最佳整数性能,这可能是可以回答的......

标签: assembly architecture x86 biginteger


【解决方案1】:

如果您使用少量可变大小的数字,我认为 POWER 6 最适合您的需求(尽管我没有使用此架构),因为它提供高 IPC 和非常高的频率(高达 5GHz) .

如果您使用大量固定大小的数字,x86-64 将是最佳选择,因为它具有适用于 64 位数字的 SIMD 操作,您可以使用这些操作来加速多个号码。您可能需要支持 SSE 4.2 的 CPU(Intel Nehalem/Westmere/Sandy Bridge,或即将推出的 AMD Bulldozer),因为 64 位比较指令 PCMPGTQ 仅在 SSE 4.2 中添加

另外,these GMP benchmark results 可能对你很感兴趣

【讨论】:

  • Power6、Power7也有SIMD(AltiVec/VMX/VSX)
  • 是的,但它们不支持 64 位 SIMD 操作,并且使用 32 位 SIMD 操作是不值得的 - 简单(非 SIMD)64 位 ALU 操作将提供更好的性能跨度>
【解决方案2】:

IMO 没有什么能比得上 x86-64,因为没有人关心更高精度的算术

许多 RISC 架构(如 MIPS、DEC Alpha 或 RISC-V)没有标志寄存器,因此您需要单独的指令来获取进位。因此,它们是错误的选择并立即被淘汰。例如在 MIPS 中做 a += b 你需要

addu aLow, aLow, bLow     # aLow += bLow
sltu tmp, aLow, bLow      # carry: tmp = (aLow < bLow)
addu aHigh, aHigh, bHigh  # aHigh += bHigh
addu aHigh, aHigh, tmp    # aHigh += carry

使用进位标志,您只需要 2 条指令:add aLow, bLow; adc aHigh, bHigh

MIPS 设计者could have done it better,但他们没有

更高的时钟有助于Marco van de Voort said,但这些架构没有比同等 x86 快 50%-100% 的时钟。他说的其余的事情是相当不正确的。需要注意的是,任意精度的数学并不是简单地并行化的,因此

简而言之:你真的想并行计算进位,这非常困难


在 x86 世界中,您从一开始就已经有了进位标志。但后来英特尔推出了 ADX instruction set 以及新指令 ADOX, ADCX 和 MULX,以进一步加速大整数运算。英特尔的论文 New Instructions Supporting Large Integer Arithmetic on Intel Architecture Processors

中解释了它们如何提供帮助

但是,让 x86 变得更快的不仅仅是 ADX。正如我之前提到的 () SIMD 并没有真正的帮助,但现在在 x86 上情况可能有所不同。我们在 x86 中有 非常长的向量(AVX2 为 256 位,AVX512 为 512 位,未来可能会更长)所以如果您使用各种技巧,例如使用部分字算法来延迟进位传播,或以奇怪的方式排列单词(如llhhllhhllhhllhh)而不是像普通大整数算术(llllllllhhhhhhhh)那样线性排列,那么SIMD可能比标量运算更快。有关更多信息,您应该阅读

当然,AVX512 仅在您拥有非常大的数字时才会有所帮助。否则对于 512 位数字,使用标量代码可能会得到更好的结果

目前没有其他架构具有超过 128 位的 SIMD 寄存器,因此即使您可以在它们上使用 SIMD,计算进位的成本也将远远超过并行加法的成本。这也是 x86 击败所有这些的原因

【讨论】:

  • 我认为一些带有 SVE(可扩展向量扩展)的 AArch64 CPU 具有 256 位向量。 (SVE 简介:community.arm.com/developer/tools-software/hpc/b/hpc-blog/posts/…)。我不确定这有多相关,因为 IDK 如果 SVE 有必要的洗牌来做除了纯垂直操作之外的任何事情。
  • PowerPC 有多个 FLAGS 寄存器,我认为它们可以解决与 ADCX/ADOX 相同的问题。 PowerPC64 在指令计数的基础上对于 BigInteger 的东西应该是相当合理的,类似于 x86-64,除非有任何我不知道的重大差距。 ARM64 aka AArch64 也可以;它有 64x64 => 高或低半乘法。 (32 位 ARM 有一些 32x32 => 64 位 2 输出指令,但 AArch64 只有 32x32=>64 加宽或 64x64 -> 高半部分)。但与 x86 不同,它具有整数 MAC(乘法累加)。 __int128 * __int128 比 x86-64 上的指令更少:godbolt.org/z/K1M_ZA
  • 但是是的,没有 FLAGS 的 ISA 对 BigInteger 来说绝对是不利的:MIPS、RISC-V 和过时的 Alpha。但这在 RISC ISA 中远非普遍;许多 RISC 更关心现实世界而不是 RISC 纯度,例如POWER 和 ARM 是存在现代高性能实现的架构的最明显示例。当然,我认为 x86-64 可能仍然是最好的选择,但 AFAIK 从根本上说它并不比 POWER 好,除非 x86 mulx r64(2 微秒)比 POWER64 mulld(64x64=>64)+ @ 便宜得多987654343@(64x64=>高64)。
  • 来自 ARM 的 pmull - Polynomial Multiply Long instructions (PMULL/PMULL2) 听起来很有趣 en.wikichip.org/wiki/arm/armv8。我今天刚刚用 pmull 获得了一个 ARM Cavium ThunderX2 服务器,所以我开始研究 ARM 技术。
  • @Zboson 是的,输出与 PPC 非常相似。我知道他们有标志,但我不知道他们也有整数乘加
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
相关资源
最近更新 更多