一种支持多核帮助线程的低开销的块同步方法

文档序号:6618936阅读:351来源:国知局
专利名称:一种支持多核帮助线程的低开销的块同步方法
技术领域
本发明涉及一种支持多核帮助线程的低开销的块同步方法,属于多核计算 机技术领域。
背景技术
片上多核处理器(Chip Multi-Processor)技术是将多个计算内核有机集 成在一个处理器芯片中,利用多线程技术,提高应用程序的并行执行性能的一 项技术。依据Amdahl定律,程序并行执行的性能最终是由其串行部分执行的性 能所决定的,而串行部分中长延迟访存引发的开销严重地影响着应用程序的性 能。
通常,片上多核处理器架构具有共享的二级缓存(Level 2 Cache)或最后 一级缓存(Last level Cache)。传统硬件预取技术可对应用程序中的规则数据 (如规则数组)进行预取,并提前送至共享缓存中,当应用程序的当前计算线 程访问到这些规则数据时,往往在共享缓存中就会访问到所需数据,而不用再 进行存储器访问。然而,对地址不连续的非规则数据(如非规则链表、数组的 非规则访问),由于访问数据地址的不连续性,传统硬件预取技术就无法准确获 取到预取数据的地址信息,因此它不会有预取效果。这种情况下,预取帮助线 程的方法被提出。该方法为计算线程抽取其预取帮助线程,并通过使用空闲核, 使预取帮助线程动态保持在计算线程之前访问数据,以使该数据在被计算线程 访问之前被及时推送到共享缓存之中,以提高串行代码执行性能。
编译器或程序员可为应用程序生成计算线程和预取帮助线程,预取帮助线 程在一个计算核中运行,计算线程在另一个计算核中运行,计算线程所需要的 非规则数据可被预取帮助线程推送到共享缓存中。通常,计算线程与预取帮助 线程间需要协同,以防止预取帮助线程执行的太快,造成预取的数据过早,出 现需要用时可能已被缓存替换算法所替换的情况;也要防止预取帮助线程太慢, 计算线程已访问过,使得预取数据已无用的情况。计算线程需要知道其预取帮 助线程的执行情况,反之,预取帮助线程也需要知道其计算线程的执行情况。 为了确定对方的运行位置,在计算线程和预取帮助线程中需要加入同步操作。 目前的传统同步方法,在不考虑线程调度的代价下,对于每一次数据访问,预取帮助线程都会与计算线程进行一次同步,这种精确同步方式带来了严重的同 步开销,并且有可能抵消预取帮助线程在降低非规则的数据缺失和减小长延迟 访存上的性能获益,使得计算线程的执行性能无法得以提高。

发明内容
本发明的目的是为克服上述问题,针对非规则数据预取而提出一种支持多 核帮助线程的低开销的块同步方法。其基本思想是在共享缓存的多核架构基 础上,针对多核应用中非规则数据缺失的问题,通过为预取帮助线程引入提前 量和低开销的块同步机制,达到降低计算线程执行时的数据缺失、减少预取帮 助线程与计算线程同步的开销,提高计算线程执行性能的目的。本发明可广泛 应用于多核编译器优化及数据库性能优化等。
为了解释我们方法所涉及的步骤中有关的术语含义,首先给出这些技术术 语的定义
定义l:当前预取位置
在一个计算线程代码中,将当前需要进行预取的非规则数据的地址称为当 前预取位置;
定义2:当前预取位置的计算工作量
在一个计算线程代码中,将当前预取位置和下一个预取位置间的代码执行 时间称为当前预取位置的计算工作量。其中,如果这个时间为O,属于没有计算 工作量的情况;如果这个时间很小,如小于几十个时钟周期,属于少计算工作 量的情况;
定义3:计算线程的计算分片
在一个计算线程中,将含有大量非规则数据缺失的代码区域称为计算线程 的计算分片;
定义4:共享缓_存缺失的数据流
对一个计算线程的计算分片,如果它连续地大量引发了共享缓存的数据缺 失,用missl, miss2,…,missN代表缺失数据的地址,则称从missl到missN形 成的地址流所对应的数据访问序列为共享缓存缺失的数据流。
定义5:历史地址信息
在计算线程或帮助预取线程中,为了使其相关指针进行高效地跳转,需要 部分记住那些跳转指针的地址,我们把这些保留的地址就称为历史地址信息。 具体来说,对一个链表需要保存(链表长度/k)个指针(小数部分需要进位取整),即头指针,第k+l个指针,第2k+l个指针等,另外数组的下标也可看作这种
情况的特例。这里,k为一个正整数,可通过下面具体实现步骤里的步骤一求得。 本发明的一种支持多核帮助线程的低开销块同步方法的整体框架设计流程
如图1所示,具体实现步骤如下
步骤一、构造预取帮助线程的提前量
在上述相关术语定义的基础上,构造预取帮助线程的提前量。基本思想是: 在预取非规则数据时,借助已有的历史地址信息,动态保持预取帮助线程的预取 工作指针总提前于计算线程的当前工作指针k个位置,这样,无论在计算线程和 预取帮助线程是处于开始或同步状态时,预取帮助线程可动态保持在计算线程 之前访问数据,并使该数据能在被计算线程访问之前被及时推送到共享缓存之 中。其主要构造步骤如下
第(1)步在计算线程中,对当前预取位置的计算工作量进行估算,如果 属于没有计算工作量或少计算工作量的情况,转第(2)步,否则转第(4)步;
第(2)步为保证预取帮助线程领先于计算线程At时间,在计算线程的 当前预取位置,找到提前At代码计算量的位置,并在预取帮助线程代码中调整 当前预取工作指针提前于计算线程的当前工作指针k个位置(对于数组的下标调 整为这个下标值加k ;对于链表,预取工作指针调整为当前链表指针后的第k个指 针);这里At和k有下式关系
△ t=f (k) =k*MissPenalty+cO
其中k代表一个正整数,可依据At的估计值或测量值来确定; MissPenalty代表一次长延迟访存的开销; c0代表一个设定的常数值;
第(3)步当计算线程本次数据推送的分片结束,转第(4)步;当同步 时,转第(2)步;
第(4)步结束。
步骤二、选择低开销的块同步机制
在步骤一构造预取帮助线程的提前量基础上,步骤二选择一种低开销的块 同步机制。
该低开销的块同步机制分为两种情况,可依据测试情况选择其中之一a. 双计数器的块同步机制
低开销的块同步机制的基本思想是块同步机制将计算线程中引发共享缓 存缺失的数据访问流,按先后顺序划分为若干块,每个块的大小依据应用实例 的选择测试效果情况来设定具体值;并且同步操作仅仅发生在块的边界,以减 小同步的精度来降低同步代价;预取帮助线程的提前量及其动态的保持可由步 骤二来完成,对于每一个块用pushsize表示块的大小,计算线程和预取帮助线 程都拥有自己的计数器,当它们每访问共享缓存缺失数据流中的一项数据,就 会对其计数器加l,当计数器的数值达到pushsize时,其线程间必须进行同步, 如果另一线程没有与其达到同一进度,此线程必须被阻塞并等待直到另一线程 与之同步。块同步机制的操作步骤由计算线程的计算分片操作步骤和预取帮助 线程的操作步骤组成
① 计算线程的计算分片具体操作步骤如下-第(l)步开始;
第(2)步计数器置O,计算线程与预取帮助线程开始协作; 第(3)步读数据,计数器加l,执行计算; 第(4)步如果计算分片结束,转第(6)步;
第(5)步如果计数器值大于piishsize,转第(2)步,否则转第(3)步;
第(6)步结束。
② 预取帮助线程的具体操作步骤如下 第(l)步开始;
第(2)步计数器置O,计算线程与预取帮助线程开始协作;
第(3)步如果是同步的开始,按帮助预取线程调整提前量后的当前工作指
针推送预取数据,否则按帮助预取线程新的当前工作指针推送预取数据,计数
器加1;
第(4)步如果计算结束,转第(6)步;
第(5)步如果计数器值大于pushsize,转第(2)步,否则转第(3)步;
第(6)步结束。
b. 单计数器的块同步机制
单计数器的块同步机制的基本思想是计算线程不会被同步所阻塞,也没 有加入额外的同步操作,只有预取帮助线程拥有一个计数器,当计数器的值达
到pushsize,预取帮助线程会将推送数据的指针与计算线程设为相同,预取帮
9助线程的提前量及其动态的保持可由步骤一来完成。单计数器的块同步机制的 操作步骤,由计算线程的计算分片操作步骤和预取帮助线程的操作步骤组成
① 计算线程的计算分片具体操作步骤如下-第(l)步开始;
第(2)步计算线程与预取帮助线程开始协作; 第(3)步读数据,执行计算;
第(4)步如果计算分片结束,转第(5)步,否则转第(3)步; 第(5)步结束。
② 预取帮助线程的具体操作步骤如下 第(l)步开始;
第(2)步计算线程与预取帮助线程开始协作; 第(3)步计数器置O,获取计算线程的当前工作指针;
第(4)步如果是同步的开始,按帮助预取线程调整提前量后的当前工作指 针推送预取数据,否则按帮助预取线程新的当前工作指针推送预取数据,计数 器加l;
第(5)步如果计算结束,转第(7)步;
第(6)步如果计数器值大于pushsize,转第(3)步,否则转第(4)步; 第(7)步结束。
单计数器的块同步机制可克服双计数器的块同步机制在同步点阻塞的特殊 情况,它保障了计算线程的可持续运行能力。双计数器的块同步机制与单计数 器的块同步机制可在具体应用环境、应用程序中测试后,择优使用。
有益效果
①本发明采用低开销的可选择的块同步机制,它包括双计数器的块同步和 单计数器的块同步,有效的减少了传统精确同步机制所造成的同步开销。与每
次预取都需要同步的传统精确同步方式来说,有着不可比拟的低开销特点选 择适合的Pushsize值,可有效平衡过大的pushsize导致的缓存污染,也可有 效平衡过小pushsize带来的同步开销,有效地提高了计算线程的执行性能。单 计数器的块同步机制可克服双计数器的块同步机制在同步点阻塞的特殊情况, 它保障了计算线程的可持续运行能力。这两种机制可在具体应用环境和应用程 序中测试后,择优使用。②为预取帮助线程引入了提前量,使得在计算线程的当前工作位置中,无 论有无足够的计算工作,都能让低开销的块同步机制得到有效地执行。提前量 构造方法可动态保持预取帮助线程的工作指针总提前于计算线程的当前指针K 个计算工作量,它是低开销的双计数器的块同步和单计数器的块同步机制的实 现基础。在较少计算量的情况下,它具有计算线程和预取帮助线程两者仍可进 行交迭计算的特点。


图1为本发明的整体框架设计流程图;
具体实施例方式
根据上述技术方案,下面结合实施例对本发明进行详细说明。 以下面简单程序为例,在头文件ldsHeader.h中添加ADDSCALE变量,通过
改变该变量的值来控制链表中每个结点的计算工作量,链表结点的计算为-while(iterator){
temp = iterator-〉i一data; while(i++<ADDSCALE){ temp+=l;
res+=temp; i = 0;
iterator = iterator—〉next;
通过不断改变ADDSCALE的值来调节计算工作量,从ADDSCALE为0时开始, 每次ADDSCALE的值增加5,这样我们有ADDSCALE为0, 5, 10, 15, 20等。 结合上述举例,给出相关术语的定义如下
定义l:当前预取位置
在一个计算线程代码中,将当前需要进行预取的非规则数据的地址称为当 前预取位置;
通过以下代码计算当前预取位置-temp 二 iterator—〉i—data;
li定义2:当前预取位置的计算工作量
在一个计算线程代码中,将当前预取位置和下一个预取位置间的代码执行 时间称为当前预取位置的计算工作量。其中,如果这个时间为o,属于没有计算 工作量的情况;如果这个时间很小,如小于几十个时钟周期,属于少计算工作 量的情况;
通过以下代码计算当前预取位置的计算工作量
while(i十+〈ADDSCALE) { temp+二l;
res+=temp; i = 0;
定义3:计算线程的计算分片
在一个计算线程中,将含有大量非规则数据缺失的代码区域称为计算线程 的计算分片;
通过以下代码计算当前预取位置的计算线程的计算分片 while (iterator) {
temp 二 iterator-M—data;
while(i++<ADDSCALE) { temp+=l;
res+=temp; i = 0;
iterator = iterator-〉next; 定义4:共享缓存缺失的数据流
对一个计算线程的计算分片,如果它连续地大量引发了共享缓存的数据缺 失,用missl, miss2,…,missN代表缺失数据的地址,则称从missl到missN形
成的地址流所对应的数据访问序列为共享缓存缺失的数据流。
上述程序中的itemtor, iterator-〉next等所指数据即为共享缓存缺失的 数据流。定义5:历史地址信息
在计算线程或帮助预取线程中,为了使其相关指针进行高效地跳转,需要 部分记住那些跳转指针的地址,我们把这些保留的地址就称为历史地址信息。
对本例中的iterator链表,如果链表长度二IOOOO, k=20,需要保存500个指针, 即头指针,第21个指针,第41个指针等。
步骤一、构造预取帮助线程的提前量
第(1)步在计算线程中,对当前预取位置的工作量进行估算,如果ADDSCALE 为0或5或10,这属于几乎完全没有计算工作量或较少计算工作量的情况, 转第(2)步;否则,如果ADDSCALE为15或20,转第(4)步;
第(2)步为保证预取帮助线程领先于计算线程At时间,在计算线程的 当前预取位置,找到提前At代码计算量的位置,并在预取帮助线程代码中调整
当前预取工作指针提前于计算线程的当前工作指针k个位置;
当At =6000, MissPenalty-300时钟周期,c(^0时 k= △ t/MissPenalty=6000/300=20
第(3)步当计算线程本次数据推送的分片结束,转第(4)步,当需要 同步时,转第(2)步; 第(4)步结束。
步骤二、低开销的可选择的块同步机制
a.以main计算线程一个计算分片Pl为例,其预取帮助线程为push,构造 其双计数器的块同步机制过程为
① main计算线程的计算分片Pl具体操作步骤如下 第(l)步开始main;
第(2)步计数器counter置0, sem一post (&main) , sem一wait (&push) , main 计算线程与push预取帮助线程开始协作;
第(3)步读数据,计数器ccmnter加l,执行计算; 第(4)步如果main计算分片Pl结束,转第(6)步; 第(5)步如果计数器counter值大于pushsize,转第(2)步,否则转第 (3)步;
第(6)步结束。
② push预取帮助线程的具体操作步骤如下-第(l)步开始PUsh;
第 (2) 步计数器 push—counter 置 0 ,sem一post (&push), sem_wait (&main) , push线程与main线程开始协作;
第(3)步如果是同步的开始,按push帮助预取线程调整提前量后的当前 工作指针推送预取数据,否则按帮助预取线程push新的当前工作指针推送预取 数据,计数器push—counter力口 1;
第(4)步如果push计算结束,转第(6)步;
第(5)步如果计数器push—counter值大于pushsize,转第(2)步,否则 转第(3)步;
第(6)步结束。
b .以main计算线程一个计算分片P2为例,其预取帮助线程为piish。构造
其单计数器的块同步机制过程为
① main计算线程的计算分片P2具体操作步骤如下-第(l)步开始main;
第(2)步sem—post (&main) , sem—wait (&push) , main计算线程与push予页 取帮助线程开始协作;
第(3)步读数据,执行计算;
第(4)步如果main计算分片P2结束,转第(5)步,否则转第(3)步; 第(5)步结束。
② push预取帮助线程的具体操作步骤如下 第(l)步开始pUSh;
第(2)步sem—post (&push) , sem一wait (&main) , push线禾呈与main线程开始 协作;
第(3)步计数器push—counter置0,获取main线程的当前工作指针; 第(4)步如果是同步的开始,按push帮助预取线程调整提前量后的当前
工作指针推送预取数据,否则按帮助预取线程push新的当前工作指针推送预取
数据,计数器push—counter力卩l;
第(5)步如果push计算结束,转第(7)步;
第(6)步如果计数器push—counter值大于pushsize,转第(3)步,否则 转第(4)步;
第(7)步:结束。上述举例的综合测试结果如下:
0(k=20, pushsize=600) 120. 175
80. 117
5(k=20, pushsize=600) 121.627
82,474
ADDSCALE (规模变量)
无预取帮助线程
的执行时间 有预取帮助线程 的执行时间 (本发明方法)
通过测试结果可以看到使用本发明方法,程序的执行时间明显缩短,
10(k=20, pushsize=600) 135. 234
89.839
15(k=0, pushsize=600) 153.057
118.076
20(k=0, pushsize=600) 171.058
117.697
1权利要求
1.一种支持多核帮助线程的低开销的块同步方法,其特征在于其基本思想是在共享缓存的多核架构基础上,针对多核应用中非规则数据缺失的问题,通过为预取帮助线程引入提前量和低开销的块同步机制,达到降低计算线程执行时的数据缺失、减少预取帮助线程与计算线程同步的开销,提高计算线程执行性能的目的;具体实现步骤如下步骤一、构造预取帮助线程的提前量在预取非规则数据时,借助历史地址信息,动态保持预取帮助线程的预取工作指针总提前于计算线程的当前工作指针k个位置,这样,无论在计算线程和预取帮助线程是处于开始或同步状态时,预取帮助线程可动态保持在计算线程之前访问数据,并使该数据能在被计算线程访问之前被及时推送到共享缓存之中;步骤二、选择低开销的块同步机制在步骤一构造预取帮助线程的提前量基础上,步骤二选择一种低开销的块同步机制;该低开销的块同步机制分为两种情况,可依据测试情况择优选择其中之一a.双计数器的块同步机制块同步机制将计算线程中引发共享缓存缺失的数据访问流,按先后顺序划分为若干块,每个块的大小依据应用实例的选择测试效果情况来设定具体值;并且同步操作仅仅发生在块的边界,以减小同步的精度来降低同步代价;预取帮助线程的提前量及其动态的保持可由步骤一来完成,对于每一个块用pushsize表示块的大小,计算线程和预取帮助线程都拥有自己的计数器,当它们每访问共享缓存缺失数据流中的一项数据,就会对其计数器加1,当计数器的数值达到pushsize时,其线程间必须进行同步,如果另一线程没有与其达到同一进度,此线程必须被阻塞并等待直到另一线程与之同步;b.单计数器的块同步机制计算线程不会被同步所阻塞,也没有加入额外的同步操作,只有预取帮助线程拥有一个计数器,当计数器的值达到pushsize,预取帮助线程会将推送数据的指针与计算线程设为相同,预取帮助线程的提前量及其动态的保持可由步骤一来完成。
2. 根据权利要求1所述的一种支持多核帮助线程的低开销的块同步方法,其特征在于步骤一中构造预取帮助线程的提前量步骤为 第(1)步在计算线程中,对当前预取位置的计算工作量进行 估算,如果属于没有计算工作量或少计算工作量的情况,转第(2)步,否则转第(4)步;第(2)步为保证预取帮助线程领先于计算线程At时间,在计 算线程的当前预取位置,找到提前At代码计算量的位置,并在预取 帮助线程代码中调整当前预取工作指针提前于计算线程的当前工作 指针k个位置(对于数组的下标调整为这个下标值加k;对于链表,预 取工作指针调整为当前链表指针后的第k个指针);这里At和k有下式关系At=f (k) =k*MissPenalty+cO其中k代表一个正整数,可依据At的估计值或测量值来确定; MissPenalty代表一次长延迟访存的开销; c0代表一个设定的常数值;第(3)步当计算线程本次数据推送的分片结束,转第(4)步; 当同步时,转第(2)步;第(4)步结束。
3. 根据权利要求1所述的一种支持多核帮助线程的低开销的块同步方法,其特征在于步骤二选择低开销的块同步机制中,双计数器 的块同步机制由计算线程的计算分片操作步骤和预取帮助线程的操 作步骤组成-①计算线程的计算分片具体操作步骤如下-第(l)步开始;第(2)步计数器置0,计算线程与预取帮助线程开始协作; 第(3)步读数据,计数器加l,执行计算; 第(4)步如果计算分片结束,转第(6)步;第(5)步如果计数器值大于pushsize,转第(2)步,否则转第(3)步;第(6)步结束;②预取帮助线程的具体操作步骤如下 第(l)步开始;第(2)步计数器置0,计算线程与预取帮助线程开始协作; 第(3)步如果是同步的开始,按帮助预取线程调整提前量后的当前工作指针推送预取数据,否则按帮助预取线程新的当前工作指针推送预取数据,计数器加l;第(4)步如果计算结束,转第(6)步;第(5)步如果计数器值大于pushsize,转第(2)步,否则转 第(3)步;第(6)步结束。
4.根据权利要求1所述的一种支持多核帮助线程的低开销的块同步方法,其特征在于步骤二选择低开销的块同步机制中,单计数器 的块同步机制由计算线程的计算分片操作步骤和预取帮助线程的操作步骤组成① 计算线程的计算分片具体操作步骤如下 第(l)步开始;第(2)步计算线程与预取帮助线程开始协作; 第(3)步读数据,执行计算;第(4)步如果计算分片结束,转第(5)步,否则转第(3)步; 第(5)步结束;② 预取帮助线程的具体操作步骤如下-第(l)步开始;第(2)步计算线程与预取帮助线程开始协作; 第(3)步计数器置0,获取计算线程的当前工作指针; 第(4)步如果是同步的开始,按帮助预取线程调整提前量后的当前工作指针推送预取数据,否则按帮助预取线程新的当前工作指针推送预取数据,计数器加l;第(5)步如果计算结束,转第(7)步;第(6)步如果计数器值大于pushsize,转第(3)步,否则转第(4)步;第(7)步结束。
全文摘要
本发明涉及一种支持多核帮助线程的低开销的块同步方法,属于多核计算机技术领域。本发明在共享缓存的多核架构基础上,针对多核应用中非规则数据缺失的问题,通过为预取帮助线程引入提前量和低开销的块同步以及循环控制的机制,降低了计算线程执行的数据缺失,减少了共享缓存的污染,提高了计算线程的执行性能,实现了异核协同的非规则数据推送。本发明可广泛应用于未来多核编译器优化及数据库性能优化。
文档编号G06F9/46GK101561766SQ20091008560
公开日2009年10月21日 申请日期2009年5月26日 优先权日2009年5月26日
发明者刘昌定, 古志民, 周伟峰, 洁 唐, 博 张, 轶 张, 郑宁汉, 嘉 陈, 艳 黄 申请人:北京理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1