一种减少GPU二级缓存能耗的控制方法及装置与流程

文档序号:17760958发布日期:2019-05-24 21:40阅读:291来源:国知局
一种减少GPU二级缓存能耗的控制方法及装置与流程

本发明涉及计算机领域,特别涉及一种减少gpu二级缓存能耗的控制方法及装置。



背景技术:

现代gpu(graphicsprocessingunit,图形处理器)的架构由多个sm(streamingmultiproeessor,流式多处理器)组成。gpu可通过sm并行运行多个线程,这多个线程执行的是同一段代码中的程序指令。

线程执行过程中,需要访问存储介质。gpu使用的存储介质包含内存和cache(高速缓存)。cache是分层组织的,可进一步包括l1cache(一级高速缓存)和l2cache(二级高速缓存)。其中,l1cache只能由来自同一sm的线程访问,而l2cache可由所有线程访问。l2cache保存的内容是内存内容的一个子集,且l2cache与主存的数据交换是以块或缓存行(cacheline)为单位的。

发明人发现:l2cache在使用过程中,存在低效利用的问题。l2cache的低效主要是因为:一般每隔一段时间,会使用内存中的数据刷新l2cache的缓存行,即使有些缓存行已不再被线程访问,也需要消耗能耗来存储无用的数据。这样,就产生了“死时间”,所谓的“死时间”即指存储无用数据的时间。l2cache的低效利用却显著增加了整体的gpu能耗。



技术实现要素:

有鉴于此,本发明提供一种减少gpu二级缓存能耗的控制方法及装置,以减少l2cache的能耗。

为了实现上述发明目的,本发明提供以下技术方案:

一种减少gpu二级缓存能耗的控制方法,所述gpu包括多个流处理器sm,包括:程序启动后进入预测阶段;

在所述预测阶段执行的操作包括:对所述二级缓存中缓存行在正常运行阶段的访问次数进行预测;预测出的访问次数为预测访问次数;

所述预测阶段结束后,进入所述正常运行阶段;

在所述正常运行阶段执行的操作包括:在所述缓存行的实际访问次数等于预测访问次数后,对所述缓存行中存储的数据进行无效关闭处理。

可选的,在所述程序启动后,在所述预测阶段至所述正常运行阶段中,每一sm运行至少一个线程块,不同sm所运行的线程块中的线程执行同一段代码中的程序指令,所述sm每次从线程块中取一个线程簇执行操作,所取出的线程簇在同一时刻执行同一条程序指令;每一条程序指令对应一个程序计数器pc值;在所有线程块中的线程对所述同一段代码中的程序指令均执行完毕后,所述正常运行阶段结束;任一所述sm以sme表示,所述对所述二级缓存中缓存行在正常运行阶段的访问次数进行预测包括:从所述sme运行的至少一个线程块中,随机选择出一个线程块构建针对所述sme的预测器,并创建针对所述sme的空预测表;所述预测器中的线程相较于其他线程块中的线程有更高的执行优先级;所述预测表用于存储块地址、pc值和预测访问次数;在获取到来自所述预测器的程序指令时,将目标pc值和目标块地址插入所述sme的预测表;其中,所述目标pc值为来自所述预测器的程序指令所对应的程序指令的pc值,所述目标块地址为来自所述预测器的程序指令所访问数据对应的缓存行的块地址;在满足预设条件时,使用所述二级缓存中的缓存行的实际访问次数,对所述sme的预测表中的预测访问次数进行更新;其中,所述二级缓存中的缓存行被任一线程簇访问时,被访问缓存行的实际访问次数将会被更新;在各sm的预测表均更新完毕后,将所述二级缓存中的缓存行的实际访问次数置为0。

可选的,所述预测表包括至少一个条目,每一条目包括pc值字段、块地址字段和访问次数字段;其中,每一条目中的pc值字段用于存储pc值,所述块地址字段用于存储与所述pc值相关联的块地址,所述访问次数字段用于存储所述块地址的预测访问次数;一个pc值对应一个条目;在满足所述预设条件之前,访问次数字段为空;所述将目标pc值和目标块地址插入所述预测表包括:将所述目标pc值与所述预测表中的pc值进行比较;在所述预测表中的pc值与所述目标pc值均不相同时,向所述预测表中插入所述目标pc值和所述目标块地址。

可选的,所述二级缓存中的每一缓存行包括:数据字段,用于存储数据块;标记字段,用于存储所述数据块在内存中的位置;访问次数字段,用于存储各线程簇对所述数据块进行访问的实际访问次数;所述更新被访问缓存行的实际访问次数包括:将被访问缓存行的访问次数字段中的实际访问次数加1。

可选的,使用所述二级缓存中的缓存行的实际访问次数,对所述sme的预测表中的预测访问次数进行更新包括:针对任一条目,使用所述任一条目中的块地址定位所述二级缓存中的缓存行;被定位的缓存行为目标缓存行;计算所述目标缓存行的实际访问次数与预设误差阈值的和值;在所述和值大于1时,将所述和值填入所述任一条目中的访问次数字段;在所述和值等于1时,删除所述任一条目。

可选的,在所述正常运行阶段执行的操作还包括:获取来自所述sme的程序指令;使用所述程序指令所对应pc值,在所述sme的预测表中查找相应的条目;若查找到,根据查找到的条目中的块地址,对所述二级缓存中的相应缓存行进行访问;将所述相应缓存行的访问次数字段中的实际访问次数加1;比较更新后的实际访问次数与查找到的条目中的预测访问次数;所述在所述缓存行的实际访问次数等于预测访问次数后,对所述缓存行中存储的数据进行关闭处理包括:在更新后的实际访问次数等于查找到的条目中的预测访问次数后,对相应缓存行中的数据字段进行关闭;其中,所述二级缓存中的所有缓存行中的数据字段在程序启动时处于关闭状态,并在首次访问时被唤醒。

可选的,在所述正常运行阶段执行的操作还包括:若访问相应缓存行失败,更新所述预设误差阈值;使用所述相应缓存行的标记字段中的位置访问内存。

可选的,所述预设条件包括:所有预测器中的线程均执行完毕,或者,所述二级缓存的累计访问次数到达预设次数阈值。

一种减少gpu二级缓存能耗的控制装置,所述gpu包括多个流处理器sm;所述控制装置包括与各sm一一对应的控制单元;各sm在程序启动后进入预测阶段,并在所述预测阶段结束后,进入正常运行阶段;

其中,在所述预测阶段,所述控制单元用于:对所述二级缓存中的缓存行在所述正常运行阶段的访问次数进行预测;预测出的访问次数为预测访问次数;

在所述正常预测阶段,所述控制单元用于:在所述缓存行的实际访问次数等于预测访问次数后,对所述缓存行中存储的数据进行关闭处理。

可选的,在所述程序启动后,在所述预测阶段至所述正常运行阶段中,每一sm运行至少一个线程块,不同sm所运行的线程块中的线程执行同一段代码中的程序指令,所述sm每次从线程块中取一个线程簇执行操作,所取出的线程簇在同一时刻执行同一条程序指令;每一条程序指令对应一个程序计数器pc值;在所有线程块中的线程对所述同一段代码中的程序指令均执行完毕后,所述正常运行阶段结束;任一所述sm以sme表示,在所述对所述二级缓存中缓存行在正常运行阶段的访问次数进行预测的方面,所述sme所对应的控制单元具体用于:从所述sme分配的至少一个线程块中,随机选择出一个线程块构建针对所述sme的预测器,并创建针对所述sme的空预测表;所述预测器中的线程相较于其他线程块中的线程有更高的执行优先级;所述预测表用于存储块地址、pc值和预测访问次数;在获取到来自所述预测器的程序指令时,将目标pc值和目标块地址插入所述sme的预测表;其中,来自所述预测器的程序指令所对应的程序指令的pc值,所述目标块地址为来自所述预测器的程序指令所访问数据对应的缓存行的块地址;在满足预设条件时,使用所述二级缓存中的缓存行的实际访问次数,对所述sme的预测表中的预测访问次数进行更新;其中,所述二级缓存中的缓存行被任一线程簇访问时,被访问缓存行的实际访问次数将会被更新;所述控制装置还包括清零单元,用于在各sm的预测表均更新完毕后,将所述二级缓存中的缓存行的实际访问次数置为0。

可见,在本发明实施例中,在程序启动后分为两个阶段——预测阶段和正常运行阶段,在预测阶段会对l2cache中缓存行在正常运行阶段的访问次数进行预测,得到预测访问次数。在正常运行阶段,若某缓存行的实际访问次数等于预测访问次数后,会对该缓存行中的数据进行关闭处理。这样,在后续的程序运行过程中,就不消耗能量对该缓存行中的数据进行更新和保存,从而可减少存储无用数据的时间,进而降低了能耗。

附图说明

图1a为本发明实施例提供的gpu架构示意图;

图1b为本发明实施例提供的内存与l2cache的映射示意图;

图2a为本发明实施例提供的控制装置示例性结构图;

图2b为本发明实施例提供的预测表示意图;

图2c为本发明实施例提供的内存与l2cache行的结构示意图;

图3为本发明实施例提供的控制方法的一种示例性流程;

图4为本发明实施例提供的内存与l2cache行的另一结构示意图;

图5a为本发明实施例提供的预测阶段中控制单元的操作示意图;

图5b为本发明实施例提供的正常运行阶段中控制单元的操作示意图;

图6为本发明实施例提供的控制方法的另一种示例性流程。

具体实施方式

本发明实施例公开了一种减少gpu二级缓存能耗的控制方法及装置,以减少l2缓存的能耗。这种控制方法可称为loscache(los:leveragelocalsimilarity)。

gpu使用simt(单指令多线程)编程模型,即同一个程序内核中的所有线程使用不同的操作数执行相同的程序指令。

gpu的架构可参见图1a:gpu包括多个sm,gpu可通过sm并行运行多个cta(线程块),每个cta由数百个线程组成。

cta进一步被划分为多个线程簇(warp),线程簇的大小是固定的,例如,包括32个线程或16个线程。在sm流水线中,每次从cta中取一个准备好的warp执行操作。

上述多个sm所运行的各线程块执行的是同一代码段中的程序指令(也即使用不同的操作数执行相同的程序指令)。代码段中包括许多程序指令,例如,第一条程序指令是两个数相加,第二条程序指令是两个数相乘,等等。在同一时刻,不同的sm可能正在执行不同的程序指令。另外,在同一sm中,不同的线程簇也可能在同一时刻执行不同的指令。

至于同一warp中的线程,是以simd(单指令多数据)模式执行,也即,同一warp中的线程在同一时刻执行同一程序指令。

举例来讲,在t0时刻,一个线程簇中的线程均会执行a+b赋值给c的程序指令,所不同的是,不同线程选择的a和b的值不同,进一步的,赋值给c的值也不同。

l2cache保存的内容是内存内容的一个子集,且l2cache与主存的数据交换是以块或缓存行(cacheline)为单位的(请参见图2b)。从访问顺序上看,sm会先访问l2cache,如果l2cache未命中,则会访问内存。

这里还需要介绍一下程序计数器(pc)。根据不同gpu地址空间的不同,pc可以具有不同的位数,例如16或32。pc用于存放和指示下一条要执行的程序指令的地址,其有自动加1功能,以实现程序的顺序执行。因此,每一条程序指令会对应一个pc值。

前述提及,在gpu中,同一个程序内核中的所有线程使用不同的操作数执行相同的指令。因此,当具有相同pc值的程序指令由不同的线程执行时,它们倾向于表现出类似的行为,从而导致不同线程执行同一程序指令所生成的数据访问请求也倾向于具有相似的数据局部性行为。也即,gpu应用程序中的数据局部性在不同线程之间具有独特的指令级相似性。

所谓的指令级相似性是指:

假定某一sm取了一个线程簇执行操作为例,该线程簇包括32线程,在l2cache的某一缓存行中,存储了这32个线程执行一条程序指令所要访问(读取和写入)的数据。

而另一sm在执行同一指令时,可能在同一缓存行的其他位置存储了其要访问的数据。换句话说,一个缓存行可能存储了所有sm执行同一程序指令所要访问的数据。

在本发明中,将利用上述指令级相似性来预测l2cache缓存行的访问次数。本发明的核心思想是:

在程序启动后进入预测阶段。在预测阶段,会对l2缓存中的缓存行在正常运行阶段的访问次数进行预测(预测出的访问次数可称为预测访问次数);

在预测阶段结束后,进入正常运行阶段,会在缓存行的实际访问次数等于上述预测访问次数后,对缓存行中存储的数据进行关闭处理。这样,在后续的程序运行过程中,就不消耗能量对该缓存行中的数据进行更新和保存,从而可减少存储无用数据的时间,进而降低了能耗。

为了实现控制,请参见图2a,本发明提供的控制装置包括多个控制单元(cu1-cun),其数量与sm相等,也即为每一sm提供一个控制单元。

上述n个控制单元共同参与完成本发明实施例所提供的控制方法。

在一个示例中,在现有架构中,每一sm对应一个ld/stunit(load/storeunit,存取单元),可对ld/stunit进行扩展,在ld/stunit中增加上述控制单元。

而为了存储预测访问次数等信息,每一控制单元可创建一预测表以存储块地址、pc值和预测访问次数。

示例性的,请参见图2b,预测表可包括至少一个条目(图2b以阴影表示一个条目),每一条目包括pc值字段、块地址字段和访问次数字段。

其中,每一条目中的pc值字段用于存储pc值,块地址字段用于存储与该pc值相关联的块地址,而访问次数字段用于存储该块地址的预测访问次数。

举例来讲,假定某一条目中的pc值为“c1”,块地址字段存储的值是“a1”,则其表示:c1代表的程序指令访问的缓存行的地址;在该条目中,若预测访问次数字段的数值是“5”则表示:对a1所代表的缓存行预测出的访问次数是5。

而为了存储缓存行的实际访问次数,请参见图2c,本发明对缓存行的结构也进行了扩展,除了数据字段和标记字段外,每个l2cache的缓存行都增加了一个访问次数字段。

其中,数据字段用于存储数据块,标记字段用于存储该数据块在内存中的位置,而访问次数字段用于记录该缓存行中的数据块的实际访问计数。

下面将基于上面所述的本发明涉及的共性方面,对本发明实施例进行进一步详细说明。

前述提及了,每一sm对应一个控制单元,上述控制单元的动作是一致的,因此本实施例将以一个控制单元的操作为重点进行介绍。

为了便于称呼,可将任一sm称为sme,将与之对应的控制单元称为cue。

图3示出了由上述控制装置执行的控制方法的一种示例性流程,至少可包括如下步骤:

s0:程序启动,进入预测阶段。

在程序启动后,所有l2缓存中的缓存行处于关闭状态,并在首次被访问时得到唤醒。

这样设计是因为观察到有一些应用程序在整个执行期间并没有使用全部的缓存行,而仅使用了其中的一小部分。

为了实现缓存行的关闭和唤醒,请参见图4,利用门控电源技术,在每个缓存行添加一个开关(例如睡眠晶体管),用以控制电源供应,从而可令缓存行的数据字段在开和关的模式之间进行切换。

s1:cue从sme运行的线程块中,随机选择出一个线程块构建预测器,并创建空预测表。

在程序执行期间,由于程序的simt执行模型和硬件调度的特性,即使是不同的线程在gpu上的执行速度也是大体相同的。同时,由于大量的线程交错执行,所以它们对相同存储器地址的访问间隔通常很长。因此,很难在当前调度策略下预测每个存储器请求的数据位置。

为解决上述问题,可先选择出一些线程构成“预测器”,并且优先执行它们,以便在运行其他线程块的线程时,做出相应的决策。

需要说明的是,每一sm都对应一个预测器,也对应一个预测表。

在预测阶段,预测器中的线程相较于其他线程块中的线程有更高的执行优先级。只有预测器中的所有线程都没有准备好时(例如,由于数据依赖导致的停顿),那些来自其他cta中的就绪线程才会执行。

另外,之所以随机选择一个cta,是因为某些cta的特征可能与其他cta的特征明显不同。例如,在bfs的一个内核中,某一cta中的某些线程被分配了比其他线程更多的工作负载,这就导致了线程之间的内存访问不平衡。所以,使用来自一个特定cta中的线程来预测其他cta将是不准确的。而随机选择cta则降低了选择某个具有特殊特性的cta作为预测因子的可能性。

s2:cue获取到来自sme的程序指令。

前述提及了,在pc存放下一条要执行的程序指令的地址(也即pc值),则可读取pc值,获取要执行的程序指令。

s3:根据程序指令执行访问操作,进入s6。

需要说明的是,有可能l2缓存中并没有存储程序指令所要访问的数据,此时,可去访问内存,从内存中取出数据,并放入l2缓存的缓存行中。

步骤s3可由sme执行。

s4:cue判断上述程序指令是否来自预测器中的线程,若是,进入s5,否则进入s6。

需要说明的是,步骤s3与s4-s6是并行执行的。

s5:cue将目标pc值和目标块地址插入sme的预测表,进入s6。

其中,为称呼方便,将上述程序指令的pc值称为目标pc值,将上述程序指令所访问数据对应的缓存行的块地址称为目标块地址。

具体的,在预测表中,一个pc值仅对应一个条目。因此,在一个示例中,可将目标pc值与预测表中的pc值进行比较,在预测表中的pc值与目标pc值均不相同时,向预测表中插入上述目标pc值和目标块地址;而若预测表中已存在与目标pc值相等的pc值,则不会插入。

s6:更新l2缓存中相应缓存行的实际访问次数。

需要说明的是,在程序启动时,各缓存行的实际访问次数为零。

在预测阶段,无论上述程序指令是否来自预测器中的线程,都会更新被访问缓存行的实际访问次数。

前述提及了,每个l2cache的缓存行都增加了一个访问次数字段,在程序启动时,访问次数字段中的值为零。之后,在缓存行被访问后,可通过将被访问缓存行的访问次数字段中的实际访问次数加1而实现对实际访问次数的更新。

步骤s6可由cue执行,也可由ld/stunit中的其他单元或模块执行。

s7:在满足预设条件时,cue获取l2cache中的缓存行的实际访问次数。

s8:cue使用获取的实际访问次数对sme的预测表中的预测访问次数进行更新。

在一个示例中,上述预设条件可包括:所有预测器中的线程均执行完毕。

在另一个示例中,考虑到对于具有大量对l2cache进行访问的应用程序来说,令所有预测器中的线程均执行完毕可能降低了预测的有效性,因为有可能比该时间更早地获得适当的预测结果。

因此,上述预设条件也可设计为包括:l2缓存的累计访问次数到达预设次数阈值。

本领域技术人员可根据实际灵活设计预设次数阈值的取值,例如,100、200等,在此不作赘述。

需要说明的是,在满足上述预设条件之前,预测表中的访问次数字段为空。也就是说,在未满足上述预测条件之前,只是向预测表插入pc值和块地址。在达到预测条件后,才根据缓存行的实际访问次数向预测表中加入预测访问次数。

在一个示例中,针对预测表中的任一条目,可使用该条目中的块地址定位l2缓存中的缓存行(被定位的缓存行可称为目标缓存行),读取出目标缓存行的实际访问次数,将该实际访问次数写入该条目的访问次数字段。

需要说明的是,若实际访问次数为1,则需要删除该条目。这是因为:相应的数据块只会被访问一次,根据预测它将不会再在l2cache中被引用。

在另一个示例中,考虑到预测阶段得到的实际访问次数可能偏小,也可将目标缓存行的实际访问次数与预设误差阈值相加,使用二者的和值作为预测访问次数,写入该条目的访问次数字段。

预测误差阈值的初始值为0,本文后续将介绍如何更新预测误差阈值。

同理,若实际访问次数与预设误差阈值的和值大于1,则将和值填入相应条目的访问次数字段。而若和值等于1,则删除该条目。

s9:在各sm的预测表均更新完毕后,将l2缓存中的缓存行的实际访问次数置为0。

更具体的,可将被访问缓存行的实际访问次数字段清零。

在一个示例中,可参见图2a,控制装置可包括清零单元,用于在各sm的预测表均更新完毕后,将l2cache中的缓存行的实际访问次数置为0。

预测阶段中,控制单元(ld/stunit)自身的操作,以及对l2cache的操作可参见图5a。

步骤s9后,预测阶段结束,预测表中的信息就可供其他的线程使用,将此阶段称为正常执行阶段。

正常运行阶段所执行的流程示例性得包括:

s10:cue获取程序指令的pc值。

根据pc值可获取到程序指令。

s11:cue使用上述pc值,在预测表中查找相应的条目。

具体的,可以比较获取的pc值与预测表中的各条目中的pc值,若相等,则查找到相应的条目。

s12:若查找到相应的条目,根据条目中的块地址访问l2缓存中相应的缓存行。

此外,若未查找到相应的条目,则可去访问内存,从内存中取出数据。

s13:更新l2缓存中相应缓存行的实际访问次数。

s13与s6相同,在此不作赘述。

另外,s13与s12的执行顺序可互换。

s14:比较更新后的实际访问次数和查找到的条目中的预测访问次数。

需要说明的是,若缓存行更新后的实际访问次数等于其预测访问次数,说明根据预测,当前访问是最后一个,后续应对该缓存行中存储的数据进行关闭处理。

而若缓存行更新后的实际访问次数小于其预测访问次数,说明当前访问并不是最后一个,还不应进行关闭处理。

s15:若更新后的实际访问次数等于查找到的条目中的预测访问次数,对相应缓存行中存储的数据进行关闭处理。

更具体的,可对相应缓存行中的数据字段进行断电,以实现对数据进行关闭处理。

前述提及了,可在每个缓存行添加一个开关(例如睡眠晶体管),用以控制电源供应,从而可令缓存行的数据字段在开和关的模式之间进行切换。

则可通过开关令相应缓存行的数据字段切换至关的模式,以实现对数据进行关闭处理。

此外,需要说明的是,进行关闭或断电,会造成数据无效,因此,也可理解为对数据进行“无效处理”。

正常运行阶段中,控制单元(ld/stunit)自身的操作,以及对l2cache的操作可参见图5b。

可见,在本发明实施例中,在程序启动后分为两个阶段——预测阶段和正常运行阶段,在预测阶段会对l2cache中缓存行在正常运行阶段的访问次数进行预测,得到预测访问次数。在正常运行阶段,若某缓存行的实际访问次数等于预测访问次数后,会对该缓存行中的数据进行关闭处理。这样,在后续的程序运行过程中,就不消耗能量对该缓存行中的数据进行更新和保存,从而可减少存储无用数据的时间,进而降低了能耗。

前述提及了,预测出的访问次数可能会偏小,假定预测表中条目a中的预测访问次数偏小,这会导致下述情况出现:

在根据条目a的块地址访问l2缓存中相应的缓存行时,缓存行中的数据已断电。

这说明本次预测得不够准确。这种情况会增加高速缓存的未命中率并损害性能。

针对上述情况,在本发明其他实施例中,请参见图6,上述控制方法还可包括如下步骤:

s16:若访问相应缓存行失败,使用相应缓存行的标记字段中的位置访问内存。

标记字段中有数据块在内存中的位置,因此可通过标记字段中的位置访问内存,以获取数据。

步骤s16可由cue执行,或由其他单元执行。

s17:更新预设误差阈值。

步骤s17可由cue执行,或由其他单元执行。

具体的,可将预设误差阈值加1。

当然,在一次预测中,只需要更新一次预设误差阈值即可。也即,每一次不准确的预测都会使阈值增1。

下一次程序启动后的预测阶段,可使用上一次预测中的预设误差阈值。

根据实验,最多三个阈值几乎涵盖了我们研究的所有应用。因此,可将该阈值的上限设置为3。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1