一种推测多线程调度方法及装置
技术领域
本发明涉及多核芯片技术领域,尤其涉及一种推测多线程调度方法及装置。
背景技术
现有典型的多核系统上典型的线程调度算法有先来先服务算法、优先级算法、采样-共生算法等。
先来先服务算法,所有的线程构成一个队列,所有空闲核构成另一个队列,如果线程队列不为空,且空闲核队列也不为空,为线程队列顶部的线程分配空闲核队列顶部的处理器核执行;等到线程执行完毕,将处理器核加入到空闲核队尾;线程放弃处理器执行权时,回到线程队列尾部;若有新的线程进来,则添加到线程队列尾部。这种算法实现简单,但完全没有考虑线程之间以及处理器核之间的差异性,对于NUCA结构效果很差。
优先级算法,在先来先服务基础上做了改进,为每一个线程设置一个优先值,每次从线程队列中选择优先级最高的线程执行。这种算法同样没有考虑处理器核之间的访问cache差异,同时优先级的设置并没有将核的任务分配问题考虑在内。
采样-共生算法,通过线程执行的采样阶段来获取线程的执行信息、访存共享信息等,并基于采样信息为线程分配合适的核来执行。这种算法考虑到了处理器核之间的差异对线程的影响,但一来需要额外的硬件支持来获取线程采样信息,而且需要线程粒度较大并采样时间片轮转调度来执行线程,不适合于推测线程抢占式线程执行方式。
上述算法多基于小规模片上多核系统,有采用纯软件、纯硬件、软硬结合三种实现方式,以后两种为主。由于小规模片上多核系统核数少且核之间在访存方面差异小或者没有差异,片上系统所有核都可以无差别的用于执行推测线程。
然而,基于NUCA(non-uniform cache architecture)的大规模片上多核系统中,核数越来越多,位于片上不同“位置”的核在访问共享的Cache、访问内存以及访问时延相差方面存在明显差异。这样在将串行程序线程化并行执行以加速单个程序执行速度并让多核/众核系统计算资源得到更充分的利用时,传统适应小规模片上多核系统的推测多线程机制应用到基于NUCA的大规模片上系统时就遇到瓶颈,即由于基于小规模(16核以内)片上多核系统的推测多线程机制没有考虑在大规模片上系统上应用推测多线程机制时核之间的访存(访问共享cache)差异对推测线程的线程执行代价、线程提交代价的显著影响,导致推测多线程机制执行效果不好,甚至不如串行执行效果;基于小规模(16核以内)片上多核系统的推测多线程机制没有考虑核的任务分配问题,推测线程可以调度到所有核上运行,在大规模片上系统上应用推测多线程机制时,需要考虑核的任务分配问题。
发明内容
(一)技术问题
本发明要解决的问题是:在大规模片上多核系统中,使用现有的推测多线程机制推测多线程机制执行效果不好,甚至不如串行执行效果,而且没有考虑核的任务分配问题。
(二)技术方案
本发明提供一种推测多线程调度方法,该方法包括:
获取推测线程的访存统计数据,所述访存统计数据包括目标程序中每个潜在并行区域访存落在NUCA中各个并行访问缓存阵列(CacheBank)的次数和整个目标程序访存落在各个Cache Bank上的次数;
基于上述访存统计数据,根据NUCA系统中共享Cache的结构特点和每个cache bank的时延参数,计算每个推测线程的数据重心位置,所述数据重心位置为推测线程访问各个Cache Bank所经过的最大链路数;
根据每个推测线程的数据重心位置计算每个核到各个推测线程数据重心位置的距离,按照距离大小对所有核进行排序,并将推测线程调度到当前可用的距离所述数据重心位置最小的核中。
可选的,所述获取推测线程的访存统计数据的步骤具体包括:
根据推测线程派生规则,确定潜在推测并行区域,所述潜在并行区域是指按照推测线程机制派生规则派生的一个推测线程的程序段;
统计目标程序中每个潜在并行区域访存落在NUCA中各个CacheBank的次数和整个目标程序访存落在各个Cache Bank上的次数;
所述计算每个推测线程的数据重心位置具体包括:
如果一个潜在推测并行区域最终成为一个推测线程,则直接基于该潜在推测并行区域的访存统计计算数据重心;如果几个潜在推测并行区域派生为一个推测线程,则先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计计算推测线程的数据重心。
可选的,使用动态剖析工具获取推测线程的访存统计数据。
可选的,所述动态剖析工具为Profiling工具。
可选的,利用下述公式计算每个推测线程的数据重心位置:
Dist(k,i)=llink*(abs(kx-ix)+abs(ky-iy))
其中,Max{}表示取最大值函数,n为cache bank数,CDG为数据重心,即0到n-1之间的整数,MA(k)为推测线程对第k个cache bank的访问次数,llink为相邻cache bank之间的链路时延,Dist(k,i)为第k个cache bank和第i个cache bank之间的链路数,abs()表示绝对值函数,kx,ky,ix,iy分别为第k个cache bank和第i个cache bank在片上的x-y坐标值。
可选的,所述计算每个推测线程的数据重心位置的步骤具体包括:
如果一个潜在推测并行区域最终成为一个推测线程,则直接基于该潜在推测并行区域的访存统计数据计算数据重心;
如果几个潜在推测并行区域派生为一个推测线程,则先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计数据计算推测线程的数据重心;
生成推测线程号-数据重心表。
可选的,所述每个核到各个推测线程数据重心位置的距离为每个核到各个推测线程数据重心位置相隔的链路数。
可选的,所述可用的核为片上系统中当前可用于推测线程执行的核。
本发明还提供一种推测多线程调度装置,该装置包括:
获取单元,用于获取推测线程的访存统计数据,所述访存统计数据包括目标程序中每个潜在并行区域访存落在NUCA中各个CacheBank的次数和整个目标程序访存落在各个Cache Bank上的次数;
数据重心位置计算单元,用于基于上述访存统计数据,根据NUCA系统中共享Cache的结构特点和每个cache bank的时延参数,计算每个推测线程的数据重心位置,所述数据重心位置为推测线程访问各个Cache Bank所经过的最大链路数;
推测线程调度单元,用于根据每个推测线程的数据重心位置计算每个核到各个推测线程数据重心位置的距离,按照距离大小对所有核进行排序,并将推测线程调度到当前可用的距离所述数据重心位置最小的核中。
可选的,所述获取单元具体包括:
确定单元,用于根据推测线程派生规则,确定潜在推测并行区域,所述潜在并行区域是指按照推测线程机制派生规则派生的一个推测线程的程序段。
统计单元,用于统计目标程序中每个潜在并行区域访存落在NUCA中各个Cache Bank的次数和整个目标程序访存落在各个CacheBank上的次数;
所述数据重心位置计算单元具体用于:
如果一个潜在推测并行区域最终成为一个推测线程,则直接基于该潜在推测并行区域的访存统计计算数据重心;如果几个潜在推测并行区域派生为一个推测线程,则先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计计算推测线程的数据重心。
可选的,所述获取单元使用动态剖析工具获取推测线程的访存统计数据。
可选的,所述动态剖析工具为Profiling工具。
可选的,利用下述公式计算每个推测线程的数据重心位置:
Dist(k,i)=llink*(abs(kx-ix)+abs(ky-iy))
其中,n为cache bank数,CDG为数据重心,即0到n-1之间的整数,MA(k)为推测线程对第k个cache bank的访问次数,llink为相邻cache bank之间的链路时延,Dist(k,i)为第k个cache bank和第i个cache bank之间的链路数,kx,ky,ix,iy分别为第k个cache bank和第i个cache bank在片上的x-y坐标值。
可选的,所述数据重心位置计算单元具体包括:
判断单元,用于判断是一个潜在推测并行区域最终成为一个推测线程,还是几个潜在推测并行区域派生为一个推测线程;
计算单元,用于在一个潜在推测并行区域最终成为一个推测线程时,直接基于该潜在推测并行区域的访存统计数据计算数据重心;在几个潜在推测并行区域派生为一个推测线程时,先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计数据计算推测线程的数据重心;
生成单元,用于生成推测线程号-数据重心表。
可选的,所述推测线程调度单元具体包括:
推测线程号-核有序编号表生成单元,用于计算每个核到各个推测线程数据重心的片上系统中相隔链路数,并按照所述链路数从大到小对所有核进行排序,进而生成推测线程号-核有序编号表;
核确定单元,用于确定可用核队列中距离数据重心所述链路数最小的核;
线程调度单元,用于将线程调度到所述距离数据重心所述链路数最小的核。
可选的,所述可用的核为片上系统中当前可用于推测线程执行的核。
本发明还提供一种多核系统,该系统包括多个核以及前面所述的推测多线程调度装置。
(三)技术效果
通过提出的基于NUCA的大规模片上系统推测线程调度机制,以数据重心为基础对推测线程执行进行调度,可以有效降低不同核因片上访问共享Cache差异对推测多线程执行的影响,提高大规模片上多核系统中推测多线程执行的性能。
附图说明
图1表示基于NUCA结构的64核片上多核系统;
图2表示本发明所述技术方案的流程图;
图3表示本发明所述技术方案的结构框图;
图4表示本发明提出的一种基于推测多线程调度的多核系统;
图5表示本发明提出的另一种基于推测多线程调度的多核系统;
图6表示本发明所述技术方案的一种具体实施方式的流程图。
具体实施方式
基于NUCA(non-uniform cache architecture)的大规模片上多核系统中,位于片上不同“位置”的核在访问共享的Cache、访问内存方面存在明显差异。如图1所示是一种基于NUCA的64核片上系统,共享的L2cache由分布的64个bank构成,bank之间通过轻量级的2D mesh网络连接,每个核访问不同的位置的cache bank其时延相差很大(比如访问相邻的bank,时延约为3cycle,而访问不相邻的bank,时延可能会在在6cycles以上,但一般不超过48cycles)。
本发明正是充分考虑大规模片上多核系统的不同“位置”的核在访问共享的Cache、访问内存方面存在的明显差异性,利用动态剖析工具来获取推测线程的访存特征,在此基础上计算每个线程的数据重心,以数据重心为基础对推测线程执行进行调度,这可以有效降低不同核因片上访问共享Cache差异对推测多线程执行的影响,提高大规模片上多核系统中推测多线程执行的性能。
实施例1:
本发明提供一种推测多线程调度方法,如图2所示,该方法包括:
S1.获取推测线程的访存统计数据;
S2.基于上述访存统计数据和非统一cache访问结构NUCA参数计算每个推测线程的数据重心位置;
S3.根据所述数据重心位置和当前可用核列表调度对推测线程进行调度。
可选的,所述步骤S1具体包括:
S11.根据推测线程派生规则,确定潜在推测并行区域,所述潜在并行区域是指按照推测线程机制派生规则派生的一个推测线程的程序段。
S21.统计目标程序中每个潜在并行区域访存落在NUCA中各个Cache Bank的次数和整个目标程序访存落在各个Cache Bank上的次数。
可选的,所述步骤S2具体包括:
S21.如果一个潜在推测并行区域最终成为一个推测线程,则直接基于该潜在推测并行区域的访存统计数据计算数据重心;
S22.如果几个潜在推测并行区域派生为一个推测线程,则先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计数据计算推测线程的数据重心。
S23.生成推测线程号-数据重心表。
可选的,所述步骤S3具体包括:
S31.计算每个核到各个推测线程数据重心的片上系统中相隔链路数,并按照所述链路数从大到小对所有核进行排序,进而生成推测线程号-核有序编号表;
S32.确定可用核队列中距离数据重心所述链路数最小的核;
S33.将线程调度到所述距离数据重心所述链路数最小的核。
本实施例还提供一种推测多线程调度装置,该装置包括CPU和存储装置,所述存储装置存储有计算机程序,所述计算机程序控制所述CPU执行下列流程:
S1.获取推测线程的访存统计数据;
S2.基于上述访存统计数据和非统一cache访问结构NUCA参数计算每个推测线程的数据重心位置;
S3.根据所述数据重心位置和当前可用核列表调度对推测线程进行调度。所述可用核列表为片上系统中当前可用于推测线程执行的核。
实施例2
本实施例提供一种推测多线程调度装置,如图3所示,该装置包括:
获取单元1,用于获取推测线程的访存统计数据;
数据重心位置计算单元2,用于基于上述访存统计数据和非统一cache访问结构NUCA参数计算每个推测线程的数据重心位置;
推测线程调度单元3,用于根据所述数据重心位置和当前可用核列表调度对推测线程进行调度。
可选的,所述获取单元具体包括:
确定单元,用于根据推测线程派生规则,确定潜在推测并行区域,所述潜在并行区域是指按照推测线程机制派生规则派生的一个推测线程的程序段。
统计单元,用于统计目标程序中每个潜在并行区域访存落在NUCA中各个Cache Bank的次数和整个目标程序访存落在各个CacheBank上的次数。
可选的,所述数据重心位置计算单元具体包括:
判断单元,用于判断是一个潜在推测并行区域最终成为一个推测线程,还是几个潜在推测并行区域派生为一个推测线程;
计算单元,用于在一个潜在推测并行区域最终成为一个推测线程时,直接基于该潜在推测并行区域的访存统计数据计算数据重心;在几个潜在推测并行区域派生为一个推测线程时,先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计数据计算推测线程的数据重心;
生成单元,用于生成推测线程号-数据重心表。
可选的,所述推测线程调度单元具体包括:
推测线程号-核有序编号表生成单元,用于计算每个核到各个推测线程数据重心的片上系统中相隔链路数,并按照所述链路数从大到小对所有核进行排序,进而生成推测线程号-核有序编号表;
核确定单元,用于确定可用核队列中距离数据重心所述链路数最小的核;
线程调度单元,用于将线程调度到所述距离数据重心所述链路数最小的核。
如图4所示,本实施例提供一种基于推测多线程调度的多核系统,该系统包括多个核以及如上所述的推测线程调度装置。该多核系统是大规模片上系统,具有众多个核。
如图5所示,本实施例还提供一种基于推测多线程调度的多核系统,该多核系统包括多核CPU,所述多核CPU包括有一个主核5和多个从核4,其中,所述主核5具体包括:
获取单元,用于获取推测线程的访存统计数据,所述访存统计数据包括目标程序中每个潜在并行区域访存落在NUCA中各个并行访问缓存阵列的次数和整个目标程序访存落在各个并行访问缓存阵列上的次数;
数据重心位置计算单元,用于基于上述访存统计数据,根据NUCA系统中共享缓存的结构特点和每个并行访问缓存阵列的时延参数,计算每个推测线程的数据重心位置,所述数据重心位置为推测线程访问各个并行访问缓存阵列所经过的最大链路数;
推测线程调度单元,用于根据每个推测线程的数据重心位置计算每个从核到各个推测线程数据重心位置的距离,按照距离大小对所有核进行排序,并将推测线程调度到当前可用的距离所述数据重心位置最小的从核中。
实施例3
本实施例提出一种更为具体的实施方式,该实施方式主要包括3个步骤,每个步骤通过特定的方式来实现,本实施例的流程图如图6所示。
I.获取访存特征(即访存统计数据)
使用动态剖析工具,在串行执行目标程序的过程中,统计目标程序中每个潜在并行区域访访存落在NUCA中各个Cache Bank的次数和整个目标程序访存落在各个Cache Bank上的次数。
步骤I所述动态剖析工具可以使用第三方开源Profiling工具,如Pin Tools,也可以自行开发的基于推测线程的Profiling工具。
步骤I所述潜在并行区域是指按照推测线程机制派生规则将派生为一个推测线程的程序段为一个潜在并行区域。
步骤I所述访存统计方法需要进行两次动态剖析执行,第一次剖析根据推测线程派生规则,确定潜在的推测并行区域;第二次剖析执行统计访存特征。对于每一个访存操作进行插装,根据访存地址计算其所属的Cache Bank,将该并行区域该Cache Bank的访存次数加1。
II.计算推测线程数据重心
基于步骤I获取的每个潜在推测并行区域(推测线程)的访存统计数据,根据NUCA系统中共享Cache的结构特点和每个cache bank的时延参数,按照数据重心计算公式计算每个推测线程的数据重心位置。
步骤II所述数据重心计算公式包括公式(1)(2)。
公式(1):
公式(2)
Dist(k,i)=llink*(abs(kx-ix)+abs(ky-iy))
其中,n为cache bank数,CDG(Centre of Data Gravity)为数据重心(0到n-1之间的整数)。MA(k)为推测线程对第k个cache bank的访问次数,llink为相邻cache bank之间的链路时延,Dist(k,i)为第k个cache bank和第i个cache bank之间的链路数,kx,ky,ix,iy分别为第k个cache bank和第i个cache bank在片上的x-y坐标值,比如在8x8的CMP中,第10个cache bank的x-y坐标值分别为1,2,即(1,2)。
步骤II所述计算数据重心过程中,如果一个潜在推测并行区域最终成为一个推测线程,则直接基于该潜在推测并行区域的访存统计计算数据重心;如果几个潜在推测并行区域派生为一个推测线程,则先将这几个潜在推测并行区域的访存统计数据汇总,然后根据汇总的访存统计计算推测线程的数据重心;最终,生成一个推测线程号-数据重心表,作为推测多线程调度的依据。
III推测线程调度
准备阶段读取步骤II生成的推测线程号-数据重心表,使用步骤2中公式2计算每个核到各个推测线程数据重心的距离,并按照距离从大到小对所有核进行排序,进而生成推测线程号-核有序编号表。
为线程分配执行核对于线程队列中优先级最高的线程,获取当前可用核队列,判断是否有空闲核;如果没有,则线程等待;如果有,根据该线程对应的核有序编号表来确定可用核队列中距离数据重心距离最小的核,将推测线程调度到该处理器核中。如果存在多个核与数据重心距离相同,选择核编号最小的核。
线程队列中优先级确定按照推测线程的逻辑顺序以及推测线程机制确定的推测-验证机制来确定。
步骤III所述可用核列表指片上系统中当前可用于推测多线程执行的核,可用核列表可以通过操作系统获取;步骤III所述距离指在片上系统中相隔链路数。
实施例4
本实施例提供在如图1所示64核NUCA-based CMP中运用推测多线程机制来加速串行程序执行(发明实例采用POSH推测多线程框架—一种开源的推测多线程框架,包括支持推测线程的编译器,在NUCA-based CMP中扩展的可以用于缓存推测线程中间结果的cache一致性协议,以及一套推测线程派生、执行、验证、提交机制)。在POSH推测多线程框架基础上,实现本发明所述推测线程调度机制。
获取访存特征
在POSH框架中自带的profiler基础上,添加访存统计模块,对每一个访存地址addr,通过表达式(addr>>log2Bsize)%64确定其所访问的cache bank号(其中,Bsize为cache的块大小),并将相应的潜在并行区域的cache bank访存数加1.当对目标程序串行剖析执行完成,就可以获得一个统计表,包括了每个潜在并行区域中64个cache bank上的访存数。
计算数据重心
对步骤(1)中获取的访存统计表进行处理。在POSH推测线程化编译器对目标程序编译后,profiling中确定的潜在并行区域最终整合成一个个推测线程,编译器记录下每个推测线程的起-止位置,并将其编号。将profiling获得的潜在并行区域信息与推测线程编译信息进行对应,将步骤(1)中基于潜在并行区域的访存统计按照实际推测线程区域进行合并,形成基于推测线程的访存统计,并按照发明技术方案II中所述公式(1)(2)计算每个推测线程的数据重心。最终,生成一个推测线程号-数据重心表,作为推测多线程调度的依据。
(3)推测线程调度
准备阶段:在应用了推测多线程机制的64核NUCA-based CMP中执行步骤2中编译的推测线程化可执行程序,按照推测线程执行特点,一般化的选择64个核中空闲的2-8个核来用于推测线程加速串行目标程序。在程序开始执行前,线程调度器读取步骤(2)中得到的推测线程号-数据重心的表,并计算64个核中每个核到各个推测线程数据重心的距离,并按照距离从小到大对64个核进行排序,进而生成推测线程号-核有序编号表。
为线程分配执行核:对于线程队列中优先级最高的线程,获取当前可用核队列,判断是否有空闲核;如果没有,则线程等待;如果有,根据该线程对应的核有序编号表来确定可用核队列中距离数据重心距离最小的核,将推测线程调度到该处理器核中。如果存在多个核与数据重心距离相同,选择核编号最小的核。
针对传统的推测多线程线程执行调度机制无法适应NUCA系统不同核访问共享cache的时延差异的特点,导致推测多线程机制性能瓶颈的问题,提出基于NUCA的大规模片上系统推测线程调度机制,可以有效降低不同核因片上访问共享Cache差异对推测多线程执行的影响,提高大规模片上多核系统中推测多线程执行的性能。
在规模为64核的片上多核系统中,使用本发明推测线程调度策略,分别采用2,4,8个核用于推测多线程执行SPECInt2000等测试程序,相对于原有的采用先来先服务线程调度策略,本发明策略能够取得平均显著性能提升。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。