如果我要编写用于大整数计算的汇编代码(例如,素因子分解,模数计算等),重点关注速度,哪种架构最适合这种:x86(-64),ARM,PowerPC, MIPS还是其他?
答案 0 :(得分: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可能对您有用
答案 1 :(得分:1)
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位数字,标量代码可能会带来更好的结果
当前没有其他体系结构的SIMD寄存器长于128位,因此即使您可以在它们上使用SIMD,计算进位的成本也将远远超过并行加法的成本。再次,这就是x86击败所有人的原因