-5

我研究了以下三种类型的 CPU 组织::-

  1. 单蓄能器组织
  2. 一般登记机构
  3. 堆栈组织

我也知道大多数计算机属于三种类型的组织之一,有些具有组合功能。

我想知道,我们现代和普通的电脑[如笔记本电脑、手机]是否使用组合功能?

那些普通的和现代的计算机是通过什么组织的算术运算来执行的?

请帮助我真的很想知道它。

4

1 回答 1

0

几乎每个主流 ISA 都是注册机。Assembly:我们为什么要打扰寄存器?

堆栈和累加器机器可以有更小的指令(更隐式,更少的显式操作数),但这不值得额外数据加载/存储指令的成本。即使使用缓存,访问由指针寄存器选择的内存地址的加载和存储转发延迟也比简单地读取寄存器号直接编码到指令中的寄存器的延迟要高得多(如 4 到 5 个周期)。

拥有多个正交寄存器还使软件可以轻松地将指令级并行性暴露给硬件(不需要 x87 之类的东西fxch将堆栈寄存器交换到堆栈顶部)。这可以让独立操作的延迟在流水线尤其是乱序执行 CPU 中重叠。

另请参阅https://www.realworldtech.com/architecture-basics/2/,了解从堆栈和累加器机器转向加载存储架构的历史,以及每个的超级基本图。(一些像 x86这样的 CISC允许将 reg,mem 用于 ALU 指令,而不仅仅是用于加载和存储。)


一些旧的 8 位微控制器(如 6502 或 8080)可能被认为是累加器机器,但它们确实有一些其他寄存器,例如保存指针。这些 ISA 的指令只有一个显式操作数,另一个根据操作码隐含。LikeORA src是一个 ORA 进入 A 寄存器(累加器)。但这些 ISA并不现代。

如果说笔记本电脑之类的“普通电脑”,是指主流的x86,请看x86 cpu有什么样的地址指令?. 有关其完整的指令集,请参阅https://www.felixcloutier.com/x86/以获取英特尔手册的摘录,其中列出了它支持的所有指令。它有 16 个通用整数寄存器(64 位模式)和 16 个 FP/SIMD 向量寄存器。(还有一个有趣的使用寄存器堆栈的传统 x87 FPU)。


我想我在写这个答案时误读了这个问题;我以为这是在询问 CPU 直接支持哪些算术运算。这就是这个答案的其余部分正在回答的问题。我将把它留给任何对一些 CPU 可以在一个硬件操作中完成的简洁概述感兴趣的人。

但实际上我认为它只是询问指令操作数,在这种情况下它很简单:几乎所有东西都是 2 或 3 操作数的寄存器机器,除了 x86 的传统 x87 FPU,它是一个寄存器堆栈架构。


现代 ISA 通常具有所有基本整数按位移位(有时是旋转)和整数 + - * / (以及除法余数)的指令。也通常是某种硬件位扫描,通常是popcount。有些具有位反转和/或字节反转,例如 x86 bswap 或 ARM rbit / rev。大多数 ISA 有效地支持扩展精度算术,使用 add-with-carry 和 sub-with-borrow 指令,并且通常像 64x64 位输入 => 128 位乘积一样扩大乘法。

随着晶体管预算的增加,拥有大部分时间空闲的专用执行单元是可以的。当前的晶体管密度在任何给定时刻都需要很大一部分裸片区域为“暗硅”才能不熔化。

有时在单个指令中可以找到更高级的移位/旋转/屏蔽组合,例如某些 ISA 中的位域插入/提取指令。PowerPC 在这里特别出色,其指令rlwinm将寄存器向左旋转一个立即数,并将其屏蔽以清除位,除了由 2 个其他立即数指定的两个位置之间。或者另一个变体可以将该位域插入到另一个寄存器的任意位置,而不是提取到零寄存器中的任意位置。

Rust 内置的大多数原始整数类型(如i32)都得到了至少一些 ISA 相当直接的支持,尽管 AFAIK 不是整数pow。(Rust 就像这样很好,不像 C 和 C++ 等一些拒绝可移植地公开现代 CPU 特性的语言。)整数绝对值很少见,尽管它可以在大多数 ISA 上只用几条指令无分支地完成(这大概就是为什么它们不要费心为其提供说明)。在 DSP 之外,对饱和整数运算的支持也很少见。在 x86 上,它仅适用于某些 SIMD 整数大小。
在大多数 ISA 上,add/sub/mul 只需将结果截断为寄存器的固定宽度即可。(如果有一个标志位,则进位(可选)进入一个标志位)。大多数 ISA 都有在事后检查签名溢出的方法。

具有 BMI2 的 x86 甚至具有根据掩码进行位打包/解包的 pext/pdep。 https://www.felixcloutier.com/x86/PDEP.html,看看AVX2 什么是最有效的基于面具的左侧打包方式?对于一个用例。

x86 也有一个内置的真实(非伪)RNG,通过rdrand/ rdseed

x86 with AVX (for vmaskmov) 尤其是 AVX512 (masking for anything) 支持屏蔽加载甚至存储,根据另一个向量寄存器中的掩码,它们有条件地实际上不存储。如果谓词(标志条件)为假,ARM 可以使用像 NOP 一样执行的谓词指令对标量执行类似的操作。通常,如果您需要可能不存储,则需要分支。

具有从另一个向量获取控制操作数的 SIMD shuffle 的 ISA 可以使用这些操作从 16 字节向量并行执行 16x 4 位 LUT 查找。这可以用于向量化popcount,或者做其他事情,比如向量化伽罗瓦域乘法。或者将 0..15 整数转换为其适当的十六进制 ASCII 数字:如何将二进制整数转换为十六进制字符串?展示了如何使用 x86 SIMD 有效地做到这一点。

其他 SIMD 操作包括 SAD(绝对差之和),在视频编解码器中被运动搜索大量使用。或针对无符号字节的水平总和的全零向量。

一些像 x86 这样的 ISA 支持无进位乘法。(类似于常规乘法,但使用 XOR 而不是+“添加”移位的部分乘积。)


当然,大多数现代 ISA 都有一个 FPU,它可以执行所有 IEEE 基本操作,所需的误差 <= 0.5ulp:+ - * / 和 sqrt。并且经常是 FMA。

我确定我已经遗漏了一些整数的东西,如果我试图列出 x86 和 AVX512 可以做的所有算术运算,我们会整天在这里。有很多非常具体的说明。

于 2020-03-25T09:21:59.893 回答