CISC机器 - 他们不是只是将复杂的指令转换为RISC吗?

时间:2012-06-25 15:47:55

标签: architecture assembly x86 system

也许我对架构有误解 - 但是如果一台机器有一个乘法指令 - 该指令不能转换为较小的指令或者是如此复杂,以至于它最终与等效的RISC指令速度相同?

Multiply是一个糟糕的例子 - 它在两种架构中都是一条指令。将上面的“乘法”替换为CISC中更复杂的指令,RISC没有等效的单指令。

5 个答案:

答案 0 :(得分:3)

乘法是一个好的和坏的例子。首先,乘法是一个昂贵的指令,一些处理器没有一个有充分理由。您可以和x86和其他人一起使用许多时钟或一个时钟。要获得一个时钟乘以一个(相对)大量的芯片空间(因为Dani提到可能是一个专用的逻辑块,仅用于乘法)。绝对没有理由为什么一个设计师会做出与另一个设计师相同的选择,无论是在同一家公司内(一个x86与另一个相比)还是不同的架构(x86与arm vs mips等)。每个设计者都知道乘法的结果是操作数的两倍,所以你选择给程序员所有操作数组合的完整答案(结果与操作数的大小不同)或者你是否剪辑结果在操作数大小?如果你剪辑给你一个溢出或异常,或者你让他们继续运行而不知道结果是错的?您是否强制他们在所有mul和div指令周围添加包装器,以便检测溢出是否会降低性能?

x86是一个非常糟糕的架构,可以先学习或用作别人的参考。它导致了很多糟糕的假设。并非所有处理器都是微编码的。并非所有CISC处理器都是微码。没有理由为什么RISC处理器不能进行微编码,你可以微调CISC或RISC或不微码CISC或RISC,这是一个设计选择,而不是规则。

RISC并不意味着最小的步数,即使是一个简单的寄存器移位寄存器也是最少两步(获取源,存储结果),这可能需要两个时钟来执行处理器有时实现的方式(使用sram bank进行寄存器文件不一定是双端口的)。 alu指令有三个步骤,可以在RISC处理器上占用三个时钟,RISC将每个指令平均一个时钟,但CISC也可以。你可以去超标量并且每条指令超过一个时钟,至少在处理器绑定时突发。对于CISC与RISC,超标量的复杂性是相同的。

我建议编写一个指令集模拟器,或至少启动一个。如果没有别的,那么一个反汇编。更好的是让100个程序员让他们执行相同的编程任务,但彼此隔离。即使所有教师都在同一所学校教授,你也要为这个版本或反汇编者设计3到100种不同的设计。将它作为一个编程任务的文本编辑器,只是编程语言选择将有点先不同,然后程序的设计会有所不同。硬件设计非常类似于软件设计,您使用编程语言并具有编译器,以及类似链接器等的东西。在一个充满硬件设计师的房间里为他们提供相同的任务并获得不同的设计。与CISC和RISC关系不大,与设计团队及其选择有很多关系。英特尔有不同的设计目标,例如反向兼容性,这是一个非常昂贵的选择。

BOTH CISC和RISC 根据处理器的设计将每条指令转换为更小的可消化/可分割步骤。用add替换乘法,然后在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需要将从内存中读取的值存储在额外的寄存器中(cisc两个寄存器来自asm透视图,risc,三个或两个,重复使用)。

如果从内存中读取的值未对齐,则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可以在一个字节中完成另一个字节中的四个。是的,您的提取和解码更复杂(更多逻辑,更多功率等),但您可以在相同大小的缓存中容纳更多指令。

微编码不仅可以将一个指令集分解为另一个指令集(另一个指令可能非常痛苦,您永远不会想要本地编程)。微码可以帮助您更快地进入市场,假设较低级别的系统可以更快地实现并减少错误。假设您可以更快地提高产量,因为您可以在事后修复一些错误,并且可以在现场修补。并不总是完美,并不总是成功,但将其与非微处理器处理器进行比较,您必须让编译器人员修复错误或召回处理器或对公司采取黑眼圈并希望赢回一些客户等等......

所以答案是否定的。 两者 RISC和CISC将单个指令转换为可以进行微编码的步骤序列。简单地认为它们是你喜欢的状态机中的状态。 CISC可能有一些将更多步骤包含在一条指令中,但这意味着更少的指令提取。并且知道整个CISC指令,这些步骤可以自然地在芯片中更有效地实现,其中RISC处理器可能必须检查一系列指令并在运行中进行优化以获得相同数量的步骤。 (ldr r0,[r1];添加r0,r0,r2)。如果要检查指令组而不是关注指令组,CISC也可以寻找相同类型的优化。两者都使用管道和并行执行。 CISC通常暗示x86和RISC意味着具有更现代和更清洁的架构。更清洁的意思是人类更容易编程和实现,并不会自动意味着更快。完成同样工作的更多步骤。 x86是可变字长,历史可以追溯到单字节指令,与4字节固定指令长度相比,x86有可能将更多指令打包到缓存而不是固定指令长度risc,从而使x86成为可能性能提升。为什么还没有把许多指令转换成一个更小的指令,它更快地通过缓存和流水线?

答案 1 :(得分:2)

它可能转换为较小的指令,但经常使用的指令通常会有一个指定的电路。

答案 2 :(得分:2)

CISC机器的解码电路很复杂,它们将复杂的CISC指令解码为更简单的指令。例如,理论上可以有单个CISC指令来获取两个存储器地址的值并将乘法的结果设置为另一个存储器地址。 CISC机器的解码器将这条指令解码为多个类似RISC的操作,比如从存储器位置取值到寄存器,向该寄存器添加另一个寄存器等。解码后应该没有区别。这就是当前CISC机器(如x86)与RISC机器竞争的方式。但是你必须付出复杂解码阶段的代价。

答案 3 :(得分:1)

@Pink 可以把它想象成一个工人用推车搬砖头,一次装10个 与10名工人排成一列并互相交砖,因此优势较低 支付购物车的价格,除非那些10是太阳能机器;)

答案 4 :(得分:0)

我对旧计时器带来的惊讶感到惊讶。尽管RISC指令也可以分为几个小步骤,但实际上,这些步骤通常是每个周期在一条指令中进行流水线化处理,而不是在AVERAGE上。用于寄存器堆的SRAM几乎总是双端口的(具有同时读取和写入的功能),因为由于它们是SRAM(几乎在数字系统中学习),因此几乎可以免费进行。因此,RISC处理器的实现方式确实是一个设计选择,可以使用微代码实现它们,选择RISC指令集使其不需要,而实用的非微码CISC几乎是不可能的。在实践中,从不直接对CISC指令进行流水线处理,而仅对CISC微码(实现类似RISC的指令)进行流水处理。

RISC指令集不容易被人编程。人们很难对它们进行编程,但是编译器更容易对其进行优化。

仅当您的指令具有复杂的微码时,才可以通过纠正微码来纠正指令中的错误。您无法使用微码纠正添加中的错误。因此,通过更改微码可以纠正的错误是RISC处理器中没有的错误,因为此复杂的指令通常由软件实现。但是,在某些情况下,有可能用微代码指令代替简单的RISC指令来修复错误(例如div中的错误),但这是以牺牲性能为代价的。

CISC指令可能具有比RISC指令更高的效率,因为它们可以具有专用的硬件。例如,矢量移动需要RISC中的加载,存储,递增,比较和跳转指令,而它可以是单个CISC指令。 CISC处理器可以具有一个附加的递增单元,该单元将与负载和比较并行地递增地址寄存器。但是,实际上这在RISC机器(如ARM)中得到了支持。实际上,RISC的基本思想是拥有代码而不是微代码。这会导致很少的指令直接在硬件中实现,就像编程器或编译器将直接编写微代码一样。缺点是更大的代码,

最后,RISC指令不会分解为较小的指令,因为它们已经在单个时钟时钟中以硬件中的非常快的时钟频率运行。

最后,今天,像x86这样的高性能CISC maxinex也像微代码指令一样将它们分解为RISC。