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

您所在的位置:网站首页 计算机里的cpi 关于多功能单元流水线的延迟(latency)与启动间隔(Initiation interval)

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

2024-01-18 20:07| 来源: 网络整理| 查看: 265

前言

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

正文

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

从书上可以得知,功能单元的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):

在这里插入图片描述

其中指令的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),则应该将两条这种类型的指令放在一起,使得在一个时钟周期内可以同时将他们发射出去执行,提高利用率。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3