也许我在架构上存在误解——但如果一台机器有一条乘法指令——该指令是否没有被翻译成更小的指令或者太复杂以至于它最终与等效的 RISC 指令具有相同的速度?
乘法是一个不好的例子——它在两种架构中都是一条指令。用CISC中更复杂的指令替换上面的“乘法”,RISC没有等效的单指令。
也许我在架构上存在误解——但如果一台机器有一条乘法指令——该指令是否没有被翻译成更小的指令或者太复杂以至于它最终与等效的 RISC 指令具有相同的速度?
乘法是一个不好的例子——它在两种架构中都是一条指令。用CISC中更复杂的指令替换上面的“乘法”,RISC没有等效的单指令。
乘法既是好例子,也是坏例子。首先,乘法是一条昂贵的指令,一些处理器没有一个很好的理由。你可以和x86等有,拿多个时钟或者一个时钟。要获得一个时钟乘法需要(相对)大量的芯片空间(正如 Dani 提到的,可能需要一个专用的逻辑块,仅用于乘法)。绝对没有理由为什么一位设计师会做出与另一位设计师相同的选择,无论是在同一家公司(一个 x86 与另一个相比)还是不同的架构(x86 与 arm 与 mips 等)。每个设计者都知道乘法的结果是操作数的两倍,那么您是选择为程序员提供所有操作数组合的完整答案(结果与操作数的大小不同)还是将结果裁剪为操作数大小?如果你剪辑给他们一个溢出或异常,或者你让他们继续运行而不知道结果是错误的?您是否强制他们在所有 mul 和 div 指令周围添加包装器,以便可以检测到溢出成本性能?
x86 是一个非常糟糕的架构,首先学习或用作其他人的参考。它会导致很多错误的假设。并非所有处理器都是微编码的。并非所有 CISC 处理器都是微码。没有理由不能对 RISC 处理器进行微编码,您可以对 CISC 或 RISC 进行微编码,也可以不对 CISC 或 RISC 进行微编码,这是一种设计选择,而不是规则。
RISC 并不意味着最少的步数,即使是一个简单的寄存器到寄存器移动也是最少两个步骤(获取源,存储结果),这可能需要两个时钟来执行处理器有时实现的方式(寄存器文件的 sram 组是不一定是双端口)。alu 指令是三个步骤,在 RISC 处理器上可以占用三个时钟,RISC 将平均每条指令一个时钟,但 CISC 也可以。您可以使用超标量并超过每条指令一个时钟,至少对于处理器受限时的突发。对于 CISC 和 RISC,超标量的复杂性是相同的。
我建议编写一个指令集模拟器,或者至少启动一个。如果没有别的,那就是反汇编程序。最好让 100 名程序员执行相同的编程任务,但彼此隔离。即使所有人都在同一所学校由同一位老师授课,您也会为该 iss 或反汇编程序获得 3 到 100 种不同的设计。让它成为一个文本编辑器作为一项编程任务,只是编程语言的选择首先会有所不同,然后程序的设计会有所不同。硬件设 与 CISC 与 RISC 的关系较少,而与设计团队及其选择有关。英特尔有不同的设计目标,例如反向兼容,这是一个非常昂贵的选择。
CISC和 RISC都根据处理器的设计将每条指令转换为更小的可消化/可分割的步骤。将乘法替换为加法,然后在 asm 级别比较 CISC 与 RISC,然后更深入。使用 x86,您可以将内存用作操作数,例如,您不能使用 arm。所以
register = memory + register
是
load register from memory
regster = register + register
你有额外的步骤。
但它们都分解成相同的步骤顺序
resolve memory address
start memory cycle,
wait for memory cycle to end,
fetch register from register memory
send operands to alu
take alu output and store in register memory
现在 cisc 实际上稍微快一些,因为要正确执行指令的 risc 需要将从内存读取的值存储在额外的寄存器中(从 asm 的角度来看,cisc 是两个寄存器,risc,三个或两个 on 重用)。
如果从内存中读取的值未对齐,则 cisc 在技术上获胜(如果 risc 通常不允许未对齐传输)。cisc 处理器需要相同数量的内存周期来获取所有保持相等的未对齐数据(两个处理器都需要两个内存周期,cisc 和 risc 都会受到惩罚)。但是要专注于 asm 指令与 asm 指令,如果内存操作数未对齐,则 risc 必须这样做
read memory to register a
read memory to register b
shift a,
shift b,
or/add
cisc在哪里:
read memory to register (takes two memory cycles)
您还具有指令大小,流行的 risc 处理器(如 arm 和 mips)倾向于固定指令长度,其中 x86 是可变的。x86 可以在一个字节内完成另一个需要四个字节才能完成的工作。是的,您的获取和解码更复杂(更多逻辑,更多功能等),但您可以在相同大小的缓存中容纳更多指令。
微编码不仅仅是将一个指令集分解成另一个指令集(另一个可能非常痛苦,你永远不想在本机编程)。假设较低级别的系统可以更快地实现且错误更少,微编码可以帮助您更快地进入市场。假设您可以更快地提高产量,因为您可以在事后修复一些错误,并且可以在现场进行修补。并不总是完美,也不总是成功,但将其与非微码处理器相比,您必须让编译器人员修复错误或召回处理器或将公司视为黑眼圈并希望赢得一些客户, ETC...
所以答案是否定的。 两个都RISC 和 CISC 将单个指令转换为可以微编码或不可微编码的步骤序列。简单地认为它们是您喜欢的状态机中的状态。CISC 可能有一些将更多步骤打包到一条指令中,但这意味着更少的指令获取。并且知道整个 CISC 指令,这些步骤自然可以在芯片中更有效地实现,其中 RISC 处理器可能必须检查一系列指令并动态优化以获得相同数量的步骤。(ldr r0,[r1]; 添加 r0,r0,r2)。如果 CISC 要检查指令组而不是专注于一个指令组,它也可以寻找相同类型的优化。两者都使用管道和并行执行。CISC 通常意味着 x86,而 RISC 则意味着具有更现代和更简洁的架构。更清洁是指人类更容易编程和实施,但这并不意味着更快。完成相同工作的更多步骤。x86 是可变字长,历史可以追溯到单字节指令,与 4 字节固定指令长度相比,x86 有可能将比固定指令长度 risc 更多的指令打包到缓存中,从而使 x86 成为可能性能提升。为什么 risc 不只是将许多指令转换为一条更小的指令,从而更快地通过缓存和流水线?x86 有可能将比固定指令长度 risc 更多的指令打包到缓存中,从而为 x86 提供可能的性能提升。为什么 risc 不只是将许多指令转换为一条更小的指令,从而更快地通过缓存和流水线?x86 有可能将比固定指令长度 risc 更多的指令打包到缓存中,从而为 x86 提供可能的性能提升。为什么 risc 不只是将许多指令转换为一条更小的指令,从而更快地通过缓存和流水线?
它可能会转化为较小的指令,但经常使用的指令(如乘法)通常具有指定的电路。
CISC机器的解码电路很复杂,它们将复杂的CISC指令解码为更简单的指令。例如,理论上可以有一条 CISC 指令来获取两个内存地址的值并将乘法结果设置到另一个内存地址。CISC机器的解码器将这条指令解码为多个类似RISC的操作,例如从内存位置获取一个值到寄存器,向该寄存器添加另一个寄存器等。解码后应该没有区别。这就是当前的 CISC 机器(如 x86)与 RISC 机器竞争的方式。但是您必须为复杂的解码阶段付出代价。
@Pink 把它想象成一个工人用推车搬砖,一次装载 10 个,而 10 个工人排成一排并互相递砖,所以优势是推车的价格较低,除非这 10 个是太阳能机器;)
我只是对老前辈的回答感到惊讶。尽管 RISC 指令也可以分成小步骤,而且它们确实如此,但这些步骤通常是流水线的,每个周期执行一条指令(不是平均数)。用于寄存器文件的 SRAM 几乎总是双端口的(同时读取和写入),因为这几乎可以免费完成,因为它们是 SRAM(只需学习数字系统课程)。因此,如何实现 RISC 处理器确实是一种设计选择,它们可以 7 使用微码实现,选择 RISC 指令集以便它们不需要,而实用的非微码 CISC 几乎是不可能的。CISC 指令在实践中从不直接流水线化,而只有 CISC 微码(实现类似 RISC 的指令)。
RISC 指令集并不容易由人类编程。它们更难由人类编程,但编译器更容易优化它们。
仅当指令具有复杂的微码时,通过更正微码来纠正指令中的错误似乎是合理的。您无法更正添加微码中的错误。因此,您可以通过更改微码来纠正的错误是您在 RISC 处理器中没有的错误,因为这种复杂的指令通常由软件实现。但是,在某些情况下,可以用微编码指令替换简单的类似 RISC 的指令来修复错误(例如在 div 中),但代价是性能损失很大。
CISC 指令可能比 RISC 指令更有效,因为它们可以有专用的硬件。例如,向量移动需要 RISC 中的加载、存储、递增、比较和跳转指令,而它可以是单个 CISC 指令。CISC 处理器可以有一个额外的增量单元,它将与加载和比较并行地增加地址寄存器。但是,这实际上在 RISC 机器(如 ARM)中得到了支持。事实上,RISC 背后的基本思想是拥有代码而不是微码。这导致直接在硬件中实现的指令较少,有点像程序员或编译器直接编写微代码。缺点是代码更大,
最后,RISC 指令不会分解为更小的指令,因为它们已经在单个时钟周期中运行并且在硬件中以非常快的时钟运行。
最后,今天像 x86 这样的高性能 CISC maxinex 也将它们的指令分解为像微码指令一样的 RISC。