RISC

本文最初完成于几年之前,彼时作者正在 ARM 公司担任执行核心验证工程师职位。作者当时的工作深入或围绕多种处理器核心,而文中提到的观点深受这些经验的影响,换句话说,这些观点存在不同程度的偏见

作者依旧坚持认为 RISC-V 的设计并不完美,但同时也承认,如果现在需要搭建一个 32 或 64 位的 CPU,他在实现构建时也会从现有工具中受益。

本文主要基于 RISC-V ISA 规范 v2.0,部分已更新至 v2.2。

原文前言:一些观点

RISC-V ISA 对极简主义的追求钻了牛角尖,它极力强调减少指令数量,规范编码等等。而这种追求则导致了错误的正交性(分支、调用、返回时重复使用同一指令),以及对赘余指令的需求,这些在程序大小和指令数量上都会影响到代码密度。

以下面的 C 代码为例:

int readidx(int *p, size_t idx){ return p[idx]; }

简单的数组索引,非常常见的操作。将其在 x86_64 中编译:

mov eax, [rdi+rsi*4]ret

或者是 ARM 中:

ldr r0, [r0, r1, lsl #2]bx lr // return

但是在 RISC-V 中需要的代码则是:

# 很抱歉如果有任何语法错误,risc-v 并没有在线编译器slli a1, a1, 2add a0, a1, a1lw a0, a0, 0jalr r0, r1, 0 // return

RISC-V 的极简主义让解码器(CPU 前端)变得更简单,代价则是需要执行更多的指令。然而,相对于拓宽流水线这个难题而言,解码不规则指令的问题很好解决,主要难点在于确定指令的长度是否一致。x86 的众多前缀就是个极佳的反面教材。对指令集的简化不应追求极限。寄存器 + 移位寄存器的内存操作指令是程序中非常常见且简单的操作,对于 CPU 而言也很容易实现。即使无法直接执行,CPU 也可以相对轻松地将其分步执行,其操作复杂程度远逊色于融合简单操作的序列。

CISC CPU 中的“复合”指令,繁复、少有使用且普遍性能低下,而 CISC 和 RISC CPU 通用的“功能”指令则意指结合了少量操作序列并且使用率高、性能高的指令。这二者应当有所区分。

还不错的部分

  • 几乎不受任何限制的可扩展性。虽说这是 RISC-V 的卖点,但它同时也是碎片化、不兼容生态系统的罪魁祸首,在管理时还需加倍小心。

  • 调用、返回和寄存器间接分支使用同一指令(JALR)。分支预测需要额外解码。

  • 调用:Rd = R1

  • 返回:Rd = R0, Rs =R1

  • 间接分支: Rd = R0, Rs≠ R1

  • (奇怪分支:Rd≠ R0, Rd ≠ R1)

  • 可变长度编码无法自我同步。x86 和 Thumb-2 中都存在的常见问题,会导致实现和安全性方面的各种漏洞,例如面向返回的编程攻击。

  • RV64I 规定所有 32 位值的符号扩展。这一点会导致不必要的上半切换,或者需要对寄存器的上半部分进行特殊调整。建议采用零扩展,在减少切换的同时,通常还可以在已知上半部分为零的情况下,通过追踪”为零“位来进行优化。

  • 乘法是可选项。考虑到高速乘法器在微型实现中占用的面积不容忽视,创建占用更小,还可以将现有 ALU 广泛用于多循环乘法的小型乘法器不失为良策。

  • LR/SC 指令对有限使用子集有严格的最终转发要求。尽管这项限制颇为严苛,但对于没有缓存的小型实现而言有可能会带来一些问题。

  • 这一点似乎是 CAS 指令的替代品,具体请参照有关该指令的注释。

  • FP 粘性位和舍入模式处于同一寄存器中。如果想通过执行 RMW 操作改变舍入模式,则需要对 FP 管道进行序列化。

  • FP 指令支持的编码精度有 32 位、64 位和 128 位,唯独没有硬件中更为常见的 16 位。

  • 这点很容易修正:我们有免费的字组编码 2’b10。

  • 更新:v2.2 中添加了十进制 FP 扩展占位符,但仍然没有半精度占位符。迷惑行为。

  • FP 寄存器文件中的 FP 值未指定,但可以通过加载 / 存储观察到。

  • 仿真器作者要恨死你了。

  • VM 迁移会将变为不可能。

  • 更新:v2.2 需要 NaN 装箱更宽的值。

糟糕的部分

  • 没有条件代码,只有比较和分支指令。这一点自身没什么问题,但它意味着:

  • 需要编码一到二个寄存器说明符,导致条件分支中的编码空间减少。

  • 没有条件选择,这一点在高度不可预测的分支中很有用。

  • 加法 / 减法没有加进位或借位。

  • (即使这样,这也比 ISA 将 flag 写入通用寄存器 GPR,然后在结果 flag 上分支要好。)

  • 用户级 ISA 需要高精度计数器。在实践中,将这些计数器暴露给应用程序意味着侧通道攻击的好机会。

  • 乘法和除法同属于一个扩展,无法单独实现其中之一。相比除法,乘法要简单许多,而且在大多的 CPU 上很常见。

  • 基础 ISA 中没有原子指令。多核微型处理器越来越普遍的今天,LL/SC 类型原子指令也越来越廉价:只需要 1 位 CPU 状态即可完成最小 CPU 实现。

  • LR/SC 和更复杂的原子指令同属于一个扩展。直接限制了小型实现的灵活性。

  • 非 LR/SC 的一般原子指令不包含 CAS 原语

  • CAS 的设计是为了避免需要一条指令读取 5 个寄存器的情况,例如:加法器、Cmp:CmpLo,SwapHi:SwapLo。但 LR/SC 用于取代 CAS 的保底进度很可能只会在实现上带来更高的开销。

  • 原子指令仅支持 32 位或 64 位操作,不支持 8 位或 16 位。

  • 对 RV32I 而言,想在整数和浮点寄存器文件之间转换 DP 和 FP,只能通过内存解决。

  • 举例来说:RV32I 的 32 位 ADD 和 RV64I 的 64 位 ADD 共用同一套编码,RV64I 又多加了一套 ADD.W 编码。如此一来,CPU 实现这两种指令时麻烦了许多,不如直接新增一套 64 位编码。

  • 没有 MOV 指令。汇编器对于 MV 的等效指令是:MV rD, rS -> ADD rD, rS, 0。MOV 优化通常由高端处理器,尤其是失序处理器完成。识别 RISC-V 规范的 MV 需要一个 12 位的立即数。

  • 在没有 MOV 指令的情况下,ADD rD, rS, r0 是对 MOV 不错的替代。它更易被解码,而 CPU 通常也会有特殊情况下的逻辑来识别零寄存器。

尤为糟糕的部分

  • JAL 在本该只是 R1(分支时是 R0)的链接寄存器编码上浪费了 5 比特

  • 这意味着 RV32I 有 21 位的分支位移(对于诸如浏览器等大型应用时,不使用多指令序列或者分支 island 时会不够用)

  • 其实是 1.0 版本 ISA 的历史遗留问题

  • 尽管 RISC-V 在统一编码上花了大功夫,但加载 / 存储指令的编码仍然是不同的(寄存器 vs 立即字段互换)。

  • 似乎寄存器编码的最终正交性要比两种高度相关指令的正交性更受欢迎。考虑到地址生成是对时序更为敏感的操作,这种选择有点奇怪。

  • 寄存器偏移量(Rbase +Roffset)或索引(Rbase + Rindex << Scale)没有负载。

  • FENCE.I 意味着指令缓存和前面的存储区必须完全同步,无论是否有 fence。实现时需要在 fence 上刷新 I,或者通过snoop的方式监视D 和存储缓存区。

  • RV32I 中,读取 64 位计数器需读取上半部分两次,并进行比较和分支,以防在读取操作时下半部分和上半部分发生借位。

  • 通常 32 位 ISA 包含了一个“读取一对特殊寄存器”的指令来避免这个问题。

  • 架构上没有定义“提示”编码空间。提示编码是指在当前处理器上作为 NOP 执行,但在之后的变量上有操作的编码。

  • “NOP 提示”的常见例子是自旋锁 yield。

  • 更复杂的提示也有实现。即那些对新处理器有明显副作用的提示,例如 x86 的边界检查指令被编码在提示空间,以便二进制文件保持向后兼容。

原文链接:

https://gist.github.com/erincandescent/8a10eeeea1918ee4f9d9982f7618ef68

(0)

相关推荐

  • RISC-V其实是反潮流,但是……

    来源:内容由半导体行业观察(ID:icbank)编译自「Erik Engheim」,谢谢. 在1980年代,超级计算机的外观如下图所示.而Cray的半圆形则是80年代超级计算机的代名词.那就是一台超级 ...

  • 为什么大家都看好RISC-V

    自RISC和CISC战争在1990年代后期爆发以来,人们就宣称RISC和CISC不再重要.许多人会指出指令集是无关紧要的. 但是指令集其实很重要,因为他们限制了可以轻松添加到微处理器的优化类型. 作者 ...

  • ARM和MIPS架构

    ARM体系 1.历史 1978年12月5日,物理学家赫尔曼·豪泽(Hermann Hauser)和工程师Chris Curry,在英国剑桥创办了CPU公司(Cambridge Processing U ...

  • RISC-V处理器是如何设计指令集的?有何特别之处

    20 世纪 90 年代末,RISC 和 CISC 爆发了一场大战,自那以后,大家却说 RISC 和 CISC 的区别没那么重要了了.许多人表示,指令集也就那么回事,对 CPU 没什么太大的影响.但其实 ...

  • MIPS架构开放了,10天设计一款完全免费的MIPS处理器(附源码)

    来源:EETOP BBS    作者:leishangwen (社区版主) 近日,Wave正式宣布将MIPS指令集(ISA)向全球客户免费授权.为全球的半导体企业.开发人员及高校提供免费的MIPS架构 ...

  • 龙芯的全新自主指令集到底强在何处?

    作者 | beyondma       责编 | 欧阳姝黎 出品 | CSDN博客 近日,龙芯推出自主指令系统架构:LoongArch,本文将从龙芯官方的材料中解读出一些干货内容,供读者们参考. 青出 ...

  • 干货 | 什么是处理器微架构、指令集?

    前言 大家好,我是ZhengN. 近段尝试着写一些科普文. 本次来分享一些芯片相关的小科普文.作为嵌入式开发工程师,我们对芯片都需要有一定的了解. 指令集 1.指令集的体现 指令集,就是CPU中用来计 ...

  • 四大主流芯片架构(X86、ARM、RISC

    文章目录 1.X86架构 2.ARM架构 3.RISC-V架构 4.MIPS架构 没有所谓的"万能芯片架构" 目前市场上主流的芯片架构有 X86.ARM.RISC-V和MIPS四种 ...

  • 冯·诺伊曼结构和哈弗结构,RISC和CISC

    文 / Edward  1  冯诺依曼架构和哈佛架构 如果你学习过X86微机原理和汇编语言,你可能会依稀地记得,我们在用汇编语言开发X86代码时,需要定义数据段,代码段,堆栈段和扩展段,这些段定义好之 ...

  • 深企潜心打造中国第一颗稳定迭代的RISC

    "芯片产业链很长,就像长颈鹿.我们要把'卡脖子'变成 '没脖子',把长颈鹿变成大象." "我要做出一款真正有差异化的高端RISC-V芯片,让每一行处理器代码都由中国人敲出 ...

  • 全球三大芯片架构之一MIPS倒下!转身投入RISC

    全球三大芯片架构之一MIPS,已经成为历史. 据外媒报道,所属公司宣布将放弃继续设计MIPS架构,全身心投入RISC-V阵营. 作为当年站在RISC改革前沿的前浪,MIPS由图灵奖得主.谷歌母公司董事 ...

  • 俄罗斯打造RISC

    俄罗斯打造RISC-V架构自主处理器:12nm工艺.八核心2GHz 快科技 2021/07/15 20:38 据俄媒报道,俄罗斯政府投资的大型科技企业Rostec已经与芯片设计公司Syntacore. ...

  • 终于有人把RISC

    描述 0 RISC-V和其他开放架构有何不同 如果仅从"免费"或"开放"这两点来评判,RISC-V架构并不是第一个做到免费或开放的处理器架构. 在开始之前,我们 ...

  • 用Verilog设计一个16 位 RISC 处理器

    Verilog Code for 16-bit RISC Processor RISC 处理器是基于其指令集和哈佛型数据通路结构设计的.然后,RISC 处理器在Verilog 中实现并使用 Xilin ...

  • X86 / ARM / RISC-V / MIPS四大主流指令集架构有何特点

    造芯片就跟建房子一样,第一步都是要打好基础,建立好框架,才能往上搬砖砌墙装修.而造芯片的第一步,首先要选择合适的架构. 芯片架构的选择大有讲究,不是随随便便就能决定的.芯片架构的出现与CPU息息相关, ...

  • 中国弯道超车有望,首款基于RISC

    中国芯片行业重要突破,中国弯道超车有望了,中国企业的首款甚至RISC-V的AI单板计算机面世! 芯片技术一直是美国卡住中国科技发展的重要手段,美国不愿意让中国研发最先进的芯片技术,也不愿意让中国人拥有 ...

  • 国产全球首款RISC

    2021开年,RISC-V的生态建设又就有了新动态.本周,赛昉科技发布了全球首款基于RISC-V的AI单板计算机星光(BeagleV),具备当今台式机的所有可扩展性功能,面积只有85mm x 70mm ...