在有些超标量处理机中,操作部件的个数要多于每个周期发射的指令条数。例如,在许多每个时钟周期发射两条指令的超标量处理机中,通常都有4个或4个以上独立的操作部件,在有的超标量处理机中有16个独立的操作部件。与单发射处理机相同,多发射处理机的操作部件可以采用流水线结构,也可以不采用流水线结构,每个操作部件的时间延迟可以多于一个时钟周期。
在一个时钟周期内发射多条指令的实现方法可以有多种,使用最多的是在一个存储字中安排两条指令。目前,先进微处理机的字长多数是64位,而一条指令的长度一般只有32位或更短,因此,在一个存储字中可以安排两条指令或两条以上指令。即使在32位处理机中,虽然主存储器的字长是32位,但处理机芯片内的指令Cache的字长可以是64位,或者更长。
超标量处理机每个时钟周期可以平均执行完成多条指令,因此,它的指令级并行度ILP一般都大于1。如果一台超标量处理机每个时钟周期发射m条指令,则它的指令级并行度ILP的期望值就为m。但是,由于数据相关、条件转移和资源冲突等原因,实际的ILP不可能达到m,只会小于m。通常有:1<ILP<m。
在超标量处理机中,不仅需要设置多套取指令部件和指令译码部件,而且要判断指令之间有无功能部件冲突,有无数据相关和由于条件转移引起的控制相关等。另外,还要通过一套交叉开关把几个指令译码器的输出送到多个操作部件中去执行,因此,超标量处理机的控制逻辑比较复杂。
当出现数据相关、控制相关或功能部件冲突时,本次没有能够发射出去的指令,必须保存下来,以便在下一个时钟周期再发射。为了提高功能部件的利用率,通常要设置一个先行指令窗口,在这个先行指令窗口中保存由于功能部件冲突、数据相关或控制相关等原因暂时还不能送到操作部件中去执行的指令。一个有先行指令窗口的超标量处理机的典型结构如图5.50所示。
有了先行指令窗口,就可以从指令Cache中读入更多的指令,可以通过硬件判断哪些指令可以先发射到操作部件中去执行。通过先行指令窗口可以把没有功能部件冲突、没有数据相关和控制相关的指令超越它前面的指令先发射到操作部件中去,从而提高功能部件的利用率。如果再加上编译器的支持,根据先行指令窗口的大小,把没有数据相关、控制相关和功能部件冲突,或者相关和冲突比较少的指令调度到同一个先行指令窗口中,这样,就能够进一步提高超标量处理机的性能。
先行指令窗口的大小对超标量处理机的性能影响很大。窗口太小,调度的效果不好,窗口太大,调度所需要的硬件太复杂。目前,多数超标量处理机的指令窗口大小为2至8条指令。
在超标量处理机中,有多条指令流水线在同时工作,设置有多个能够独立工作的操作部件,因此,必须解决多流水线的调度问题和操作部件的资源冲突问题。以下两节分别介绍这两个问题。
图5.50 有先行指令窗口的多发射流水线处理机结构