一、Superscalar技术
Superscalar(超标量)技术,它是一种CPU的微架构设计技术,其核心思想是允许CPU在单个时钟周期内,从程序的指令流中识别出多条互不依赖的指令,并将它们同时发射到多个独立的功能单元上并行执行以提高处理器的吞吐量。
传统的标量处理器是指CPU每个时钟周期只能处理一条指令(取指、译码、执行和写回)。而超标量处理器是指通过硬件逻辑在每个时钟周期内可以同时处理多条指令(前提是这些指令没有依赖限制)。
需要说明的是,Intel提出的超线程(Hyper-Threading)技术很容易和Superscalar技术混淆。超线程是在一个物理核上模拟多个逻辑核,同时运行多个线程,可以理解成物理多线程。
二、原理和分析
所谓超标量,其实就是对标量来说。超,就意味着超出。而名字没有改变,就意味着没有革命性的变化。Superscalar技术原理就是多(硬件逻辑中的多发射逻辑、多端口寄存器堆以及多个功能单元)、乱(乱序执行)、动(CPU在运行时处理指令依赖,提前执行不相关的指令,避免指令阻塞(如 cache miss)引起浪费执行单元)、重(寄存器重命名防止假依赖,重排序缓冲区(ROB)和保留站,支持乱序执行、顺序提交,保证程序语义正确)和测(进行分支预测,提前获取指令流,保证多发射流水不清空)。
举一个简单的例子,假设有一个超标量CPU,每个时钟周期可以发射2条指令。现在有四条指令:
第一条,将寄存器2和寄存器3的和存储到寄存器1中;
第二条,将寄存器5和寄存器6的和存储到寄存器4中;
第三条,将寄存器1和寄存器8的积存储在寄存器7中;
第四条,从内存中加载数据到寄存器9中。
在这种情况下,很有可能在第一个时钟周期内将第一和第二条指令同时发射执行;但由于第三条指令的执行依赖于第一条指令,所以它无法与其同时执行。而为了让流水线充分执行,CPU的乱序执行可能会让第四条指令优先执行。
三、特点
超标量技术能够成为主流,一定是因为其先进性的特点,主要包括:
- 显著的提高指令的执行效率(多指令并行)
由于能够同时支持发射和执行多条指令,可以明显的提高单线程的执行速度 - 提高了硬件资源的利用率
通过多个功能单元的应用,保证了指令流水线中的利用率,从而进一步提高了性能 - 对上层应用(软件)透明
无论是上层如何编写相关软件及进行编译优化,并不影响CPU的超标量流水的操作
不过话又说回来,任何技术都有其局限性,超标量CPU的局限主要有:
- 指令的依赖链局限,它会导致并行有着一个上限
- 指令执行的资源竞争限制,并行发射的指令未必能够并行执行
- 硬件资源的限制,超标量引起硬件复杂性急剧增加;取指/译码带宽的局限
- 功耗与能效的限制,硬件的复杂导致了功能的上升以及边际效应的快速递减
- “时钟墙”问题局限,分支预测和缓存未命中导致惩罚的代价变得更加高昂
针对其上面的特点,在设计和开发时可以有针对性的进行处理:
- 尽量编写对指令友好的代码,如减少链式依赖,使用循环展开,减少循环,使用SIMD以及减少分支和独立执行的功能代码等等。从而减少基础指令的依赖
- 尽量使用一些分支替代技术,避免指令预测导致的不确定性。如函数表、位图等等
- 控制内存字节对齐,减少指令操作的数量,提升加载效率
- 充分利用编译器的优化,让编译器进行寄存器等各种指令的优化,如#pragma unroll
四、应用
在前面的分析中,已经对编译器优化(如循环展开、自动向量化等)、SIMD以及内存的字节对齐等技术进行过分析。正如C++中提到的“零成本抽象”,尽量利用透明的底层技术可以大幅提高性是一种最好的选择。下面分析一下其主要的应用场景:
- 主流的PC和服务器CPU
这一点已经为大家广泛接受,主流的CPU技术基本都是基于Superscalar技术。包括Intel、AMD以及IBM PWOER和ARM系列都采用了Superscalar技术 - 片上SoC及嵌入式硬件应用
在现代的的手机以及高性能计算(如汽车、机床等)都采用了超标量的处理器
五、总结
大家在学习软件技术的同时,一定要对系统底层有清晰的理解。当然,如果想把技术水平掌握到更高的层次,那么对硬件技术,特别是固件技术,一定要深入了解。至于了解到什么程度就看个人的喜好以及工作的实际需求。
需要知道的是,软件不光是成千上万行的代码,更是在硬件上运行的程序。开发者不但要会抽象的设计开发,更要知道如何把它们与硬件结合在一起安全高效的运行起来。“帮人帮到底,送佛送到西”,这句话可以理解成开发者编写代码的目的。

1万+

被折叠的 条评论
为什么被折叠?



