五段流水线 多周期 mips 代码_关于多功能单元流水线的延迟(latency)与启动间隔(Initiation interval)...

本文探讨了MIPS中多功能单元流水线的延迟(latency)与启动间隔(Initiation interval),并结合Intel Intrinsics解释了两者与指令latency、Throughput的关系。文章指出,指令的latency和Throughput与功能单元的流水线设计密切相关,对程序优化至关重要,特别是使用Intel Intrinsics时,需要注意指令流水问题以提高执行效率。
摘要由CSDN通过智能技术生成

关于多功能单元流水线的延迟(latency)与启动间隔(Initiation interval)

前言

因为前段时间在写Intel Intrinsics, 看到latency和Throughput(CPI)一直不太理解。直到今天刚好看到了《计算机体系结构——量化研究方法》中关于MIPS中多功能单元(长延迟)流水线的介绍,才发现两者好像有一定的关系。因此本篇博客主要是我对MIPS中多功能单元(长延迟)流水线中的latency和Initiation interval的理解,以及简单谈一谈它们与指令latency、Throughput的关系。

正文

《计算机体系结构——量化研究方法》中的MIPS多功能单元流水线。

69f899f656b276ace1637ba5708d43a6.png

如上图是含有多个执行单元的多级流水线图。其中每个执行单元内部也拥有多级的流水线。刚好最近我在看Intel的微体系结构,按我的理解,这个执行单元实际上就是对应于Intel 微体系结构中 Back End 各个端口(Port)中的执行单元。

af9b67d1873ce6f7c91d52907b9ccb93.png

因为每个执行单元完成执行任务所需的时钟周期不同,例如浮点运算的时间与整形运算的时间就有一定的差距,因此执行单元中的流水线分级是不同的。

下图是各功能执行单元中的具体流水线分级,以及各功能执行单元的latency和Initiation interval:

6ac80db68d85bce802a19c9dc05607ee.png

318f1c9270ca45d422f011ab4bd34073.png

从书上可以得知,功能单元的latency等于执行流水线深度减去1个时钟周期,也就是比如说浮点加法单元中有四级流水线,因此它的latency为4-1=3。而功能单元的Initiation interval与功能单元流水线中最耗时的阶段有关,且与有多少个功能单元有关。像图中的浮点加法单元使用了4级流水线,每个阶段需要花费1个时钟周期,所以每个时钟周期都可以发射一条浮点加法指令,两者间不会发生结构冒险。而像浮点除法单元,内部没有使用流水线,所以后一条浮点除法指令必须等到前一条浮点除法指令完全执行完,退出浮点出发单元,才可以开始执行,Initiation interval就是25个时钟周期。

这里我再重新引用书上对于latency和Initiation interval的描述。

  • 延迟(latency):生成结果的指令与使用结果的指令之间的周期数。(在没有发生RAW冒险的情况下)。关于latency我的理解是,该指令执行之后,需要等待多久该指令才能产生可以使用的结果,被其他指令所使用。举个例子,浮点加法单元的latency为3,意味着如果有一条浮点加法指令,那么在不发生RAW的情况下,最快也要在3个时钟周期后,其他指令才能使用刚才这条浮点加法指令的运算结果。
  • 启动间隔(Initiation interval):在发出两个给定类型的操作之间必须间隔的周期数。关于Initiation interval我的理解是:它有点像Throughput吞吐量,也就是在发射了一条这样的指令后,需要多少个时钟周期才能够再次发射一条这样的指令。

关于这两个名词,我联想到最近正在使用的Intel Intrinsics文档中提到的avx2向量指令的两个属性latency和Throughput(CPI):

48b080ceb592df8517385300e945a165.png

其中指令的latency可以对应到功能单元的latency,也就是完成一条指令所需要的时钟周期。而指令的Throughput(CPI)意思是发送一条指令所需要的时钟周期数,0.5意味着一个时钟周期可以发射两条这样的指令,这与功能单元的Initiation interval定义是可以对应上的。因此按照我的理解,指令的latency、Throughput和功能单元的latency、Initiation interval的含义应该是相似的。当然因为我还是初学者,这个东西也没有经过验证,所以我的理解可能是错误的。

长延迟流水线可能会导致结构冒险和写后写(WAW)冒险。WAW冒险产生的原因如下:浮点运算指令的latency较长,因此可能会出现后面整形运算指令比前面的浮点运算指令先完成的情况,从而导致后面的写操作被前面的写操作所覆盖,违背了代码的原意。这两种冒险在原来标准的5级流水线中是不可能出现的。因此需要使用特殊的技术来检测这些冒险。

总结

总的来说,指令的latency与Throughput,与对应功能单元的流水线组成是密切相关的。从本文也可以看出,在对程序进行调优时(尤其是使用Intel Intrinsics写avx向量化指令时),就特别需要注意指令流水的问题。如果将相同运算类型的指令排在一起执行,其实是有利于充分发挥功能单元中的流水的,从而提高功能单元的执行效率的。而如果指令的Throughput较大时(比如上面正文所提到的浮点除法指令),两条这种类型的指令之间就必须填充足够多的指令,来掩盖这种指令较大的Throughput,而不是让流水线阻塞在这两条指令之间的等待。当然,填充这部分的工作,现在编译器的指令重排可能就已经实现了。如果指令的Throughput较小,(例如0.5),则应该将两条这种类型的指令放在一起,使得在一个时钟周期内可以同时将他们发射出去执行,提高利用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值