当前位置:  开发笔记 > 编程语言 > 正文

在现代处理器中是否有128位整数的硬件支持?

如何解决《在现代处理器中是否有128位整数的硬件支持?》经验,为你挑选了2个好方法。

我们是否仍然需要在软件中模拟128位整数,或者现在平均桌面处理器中是否有硬件支持?



1> Z boson..:

x86-64指令集可以使用一条指令执行64位*64位到128位(mul对于imul带有一个操作数的带符号的无符号),所以我认为在某种程度上x86指令集确实包含一些支持128位整数.

如果您的指令集没有执行64位*64位到128位的指令,那么您需要几条指令来模拟它.

这就是使用x86-64的少量指令可以完成128位*128位到低位128位操作的原因.例如与GCC

__int128 mul(__int128 a, __int128 b) {
    return a*b;
}

生产这个组件

imulq   %rdx, %rsi
movq    %rdi, %rax
imulq   %rdi, %rcx
mulq    %rdx
addq    %rsi, %rcx
addq    %rcx, %rdx

它使用一个64位*64位到128位指令,两个64位*64位降低64位指令,以及两个64位加法.



2> 小智..:

我将通过将台式机处理器与简单的微控制器进行比较来进行解释,因为算术逻辑单元(ALU)的操作类似,它们是CPU中的计算器,并且Microsoft x64调用约定与System-V调用约定。对于简短的答案,请滚动到最后,但是较长的答案是,通过将x86 / x64与ARM和AVR进行比较,最容易看出差异:

长答案

本机双字整数数学体系结构支持比较

|        CPU        | word x word => dword | dword x dword => dword |
|:-----------------:|:--------------------:|:----------------------:|
|        M0         |           No         |           No           |
|        AVR        |           No         |           No           |
|      M3/M4/A      |           Yes        |           No           |
|      x86/x64      |           Yes        |           No           |
| SSE/SSE2/AVX/AVX2 |           Yes        |           Yes          |

如果您了解此图表,请跳至简答

智能手机,PC和服务器中的CPU具有多个ALU,它们可以对各种宽度的寄存器执行计算。另一方面,微控制器通常只有一个ALU。CPU的字长与ALU的字长不同,尽管它们可能相同,但Cortex-M0就是一个很好的例子。

ARM架构

Cortex-M0是Thumb-2的Von Neuman体系结构处理器,这意味着它主要是16位Thumb16 CPU,但具有32位ALU。在汇编中,您将主要使用16位指令,当您使用32位指令时,会将字加载到32位寄存器中并使用两个16位指令。这与全功能的32位哈佛架构处理器Cortex-M3 / M4形成了鲜明的对比。尽管存在这些差异,但所有ARM CPU都共享相同的集或体系结构寄存器,可以轻松地从M0升级到M3 / M4,并可以通过NEON SIMD扩展功能更快地使用Cortex-A系列智能手机处理器。

ARM体系结构寄存器

当执行二进制运算时,该值通常会溢出寄存器(即,太大而无法容纳在寄存器中)。ALU具有n位输入和n位输出,并带有进位(即溢出)标志。

加法不能在一条指令中执行,但是需要相对较少的指令。但是,要进行乘法运算,您需要将字长加倍以适合结果,并且当您需要2n个输出时,ALU仅具有n个输入和n个输出,因此将不起作用。例如,通过将两个32位整数相乘,您需要一个64位结果,而两个64位整数最多需要一个128位结果(具有4个字长的寄存器)。2不错,但是4变得很复杂,您用完了寄存器。CPU处理此问题的方式将有所不同。对于Cortex-M0,没有指令,因为它是Thumb-2,但是对于Cortex-M3 / M4,有32x32 => 64位寄存器乘法指令,需要3个时钟周期。

AVR架构

AVR微控制器具有131条指令,可在32个8位寄存器上工作,并且按指令计数归类为8位处理器,但同时具有8位和16位ALU。如果没有软件破解,AVR处理器无法通过两个16位寄存器对或64位整数数学运算来执行16x16 => 32位计算。这与寄存器组织和ALU溢出操作中的x86 / x64设计相反。这就是AVR被归类为8/16位CPU的原因。你为什么在乎?它影响性能和中断行为。

AVR建筑事务所

x86体系结构

在x86上,可以使用MUL指令将两个32位整数相乘以创建64位整数,从而在EDX:EAX中产生无符号的64位,或者在RDX:RAX对中产生128位的结果。但是,将x86上的两个64位整数相乘或将x64上的两个128位整数相乘就不一样了。在x86上添加64位整数需要很少的指令,因为从寄存器到寄存器的进位标志仅处理LSB或MSB,但是64位乘法需要很多指令。这是x86的32x64 => 64位x86有符号乘法程序集的示例:

 movl 16(%ebp), %esi    ; get y_l
 movl 12(%ebp), %eax    ; get x_l
 movl %eax, %edx
 sarl $31, %edx         ; get x_h, (x >>a 31), higher 32 bits of sign-extension of x
 movl 20(%ebp), %ecx    ; get y_h
 imull %eax, %ecx       ; compute s: x_l*y_h
 movl %edx, %ebx
 imull %esi, %ebx       ; compute t: x_h*y_l
 addl %ebx, %ecx        ; compute s + t
 mull %esi              ; compute u: x_l*y_l
 leal (%ecx,%edx), %edx ; u_h += (s + t), result is u
 movl 8(%ebp), %ecx
 movl %eax, (%ecx)
 movl %edx, 4(%ecx)

x86支持将两个寄存器配对以存储完整的乘法结果(包括高半部分),但是您不能使用这两个寄存器来执行64位ALU的任务。这是x64软件比x86软件运行速度更快的主要原因:您可以在一条指令中完成工作!您可以想象x86模式下的128位乘法在计算上非常昂贵,它是。x64与x86非常相似,只是位数增加了一倍。

x86建筑寄存器

x64建筑寄存器

当CPU配对2个字大小的寄存器以创建单个双字大小的值时,在堆栈上,所得的双字值将与RAM中的字边界对齐。除了两个寄存器对之外,四字数学是一种软件黑客。这意味着对于x64,可以将两个64位寄存器组合在一起以创建一个128位寄存器对溢出,该溢出对与RAM中的64位字边界对齐,但是128x128 => 128位数学运算是软件黑客。

但是,x86 / x64是超标量CPU,您知道的寄存器只是体系结构寄存器。在幕后,还有许多寄存器可以帮助优化CPU管道,以使用多个ALU执行乱序指令。尽管x64可能不是128位CPU,但SSE / SSE2引入了本机128位数学运算,AVX引入了256位本机整数数学运算,而AVX2引入了512位整数数学运算。从函数返回时,将在128位XMM0 SSE / SSE2寄存器中返回值,256位AVX导致YMM0,而512位AVX2导致ZMM0;但是,这些是x86 / x64的附加组件,而不是主要的体系结构,其支持完全取决于编译器和发行平台(例如Python)。

简短答案

C ++应用程序处理128位整数的方式因操作系统或调用约定的裸机而异。Microsoft有他们自己的约定,令我非常沮丧的是,所得的128位返回值不能从函数作为单个值返回。在微软64位调用约定决定了返回值时,你可能会返回一个64位的整数或两个32位整数。例如,您可以这样做word * word = dword,但是在Visual C ++中,无论RDX:RAX对如何,都必须使用_umul128返回HighProduct。我哭了,很难过。:-( 但是,System-V调用约定确实允许在RAX:RDX中返回128位返回类型。但是,CPU体系结构寄存器完全支持128位整数数学,这是从SSE / SSE2开始的SIMD矢量处理扩展。

至于是否应该依靠128位整数支持,遇到使用32位x86 CPU的用户非常罕见,因为它们太慢了,因此设计在32位x86 CPU上运行的软件不是最佳实践因为这会增加开发成本,并可能导致用户体验下降;期望Athlon 64或Core 2 Duo达到最低规格。您可以期望该代码在Microsoft上的性能不如Unix OS。

英特尔架构寄存器是固定的,但是英特尔和AMD一直在不断推出新的架构扩展,但是编译器和应用程序需要很长时间才能更新,因此您不能指望它可以用于跨平台。您将要阅读《英特尔64和IA-32架构软件开发人员手册》和《AMD64程序员手册》。

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有