多流出流水线在一个时钟周期内可以完成多条指令。多发射处理器主要有超标量和超长指令字两类。
基于静态调度的超标量技术的核心思想是执行时动态按序发射,编译时进行代码调度。发射段IS检测并处理冒险,组织无冒险的若干条连续指令作为发射包。一旦遇到冒险,就将当前指令及其后续指令阻塞在IS段。由于寄存器、存储器的访问冲突以及数据控制冒险带来的损失都成倍提高,静态超标量的性能提升并不显著。
基于动态调度的超标量技术在执行时动态地乱序发射指令。其通过增设IS和保留站RS来实现动态调度。IS段阻塞那些存在结构冒险的指令,RS段阻塞那些存在RAW冒险的指令,发射包由无冒险的若干条指令组成,最后按序完成。整个过程与硬件推测执行高度类似,其性能相比静态超标量有大幅度提高。
超长指令字,顾名思义,将若干条指令捆绑在一起作为一个整体进行硬件层面上的调度。每个时钟周期发射的指令数是固定的,冲突由软件检测,采用静态调度。因此,不需要设置冲突检测硬件,对冲突采用锁步机制。编译程序在生成代码时,所有冒险已经消除。
循环展开也是重要的软件调度技术,通过对循环体进行展开,进行等价的语义交换,开发不同迭代之间的并行性,减少RAW和控制冒险。其开销在于代码长度增加,使用的寄存器数量增多。
由于不同线程的指令大都相互独立,开发线程级并行是提高并行度的重要手段。多线程技术中,多个线程以重叠方式共享单处理器的功能部件,以隐藏流水线冲突、访存等时延。为保存线程私有状态而共享运算部件,多线程处理器中设置一套功能部件和多套状态部件。细粒度多线程每个时钟周期都切换线程,其虽然隐藏了停顿提高了吞吐率,但单个线程的周转时间增加;粗粒度多线程在由较长停顿时切换线程,此时单个线程的速度相对可保证,但吞吐率提高又较为有限;一种更好的方案是采用同时多线程(超线程)技术,它在细粒度多线程的基础上,允许同时执行不同线程的指令,而不仅限于每个时钟周期进行切换,此时吞吐率得到大幅提高。