基于任务量划分的紧嵌套循环自动并行化方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于任务量划分的紧嵌套循环自动并行化方法
闫昭;刘磊
【摘要】采用计算任务量大小的方法, 解决了在紧嵌套循环自动并行化过程中存在循环并行化的并行粒度确定问题以及循环自动并行化中数据划分的数据访问局部性问题, 在多核系统中实现了紧嵌套循环自动并行化时的数据访问局部性方案和并行化方法, 从而构造了一个基于任务量划分的循环自动并行化模型, 降低了程序自动并行化中小任务量并行带来的开销.
【期刊名称】《吉林大学学报(理学版)》
【年(卷),期】2010(048)004
【总页数】5页(P631-635)
【关键词】计算划分;任务量;数据划分;数据访问局部性;循环并行化
【作者】闫昭;刘磊
【作者单位】吉林大学,计算机科学与技术学院,长春,130012;吉林大学,计算机科学与技术学院,长春,130012
【正文语种】中文
【中图分类】TP311
高性能并行计算是现代科学研究、工程技术开发和大规模数据处理的关键技术, 在加速科学应用方面得到了广泛应用[1]. 实现并行计算需要采用并行程序设计模型设计应用程序, 要求程序设计人员必须使用并行处理的思想将串行应用中能并行执行
的部分识别出, 再通过并行语言构造可以在高性能并行计算机上运行的并行应用程序[2-3]. 而并行程序设计要求程序设计者将应用程序作为众多相互依赖的任务集合, 通过对任务间依赖关系的分析实现在高性能并行计算机上的并行编程. 实践证明, 在并行计算机上利用并行语言编程存在着编程困难和软件移植困难等缺点, 因此如何减轻程序设计者的负担, 降低并行程序开发成本和加快并行程序的开发速度, 使串行程序自动并行化的研究已成为高性能并行计算研究领域的重要课题[4].
串行程序自动并行化是通过把一个大的串行应用自动分解成许多小的子任务, 然后经过相关性分析把彼此独立无关的子任务散列到各个节点机上并行执行, 从而实现提高问题处理速度的目的[5]. 即实现串行程序自动并行化要解决任务分解问题和并行运行各子任务的硬件环境问题. 程序并行化的研究对象可以是串行程序中的循环部分, 也可以是诸如复合语句、语句基本块等非循环代码. 非循环代码并行化应用较少, 因为非循环代码的依赖关系测试情况较复杂、不规则, 而且并行的各个语句子序列的运行时间通常不相等, 难以保证负载平衡. 而循环中并行迭代的执行时间通常相同, 而且循环往往占据程序主要的计算时间, 因此循环并行化已成为并行化研究的重点.
1 基于任务量划分的紧嵌套循环自动并行化算法
通过并行编译实现自动并行化时, 有效的相关性分析和自动并行化变换方法必不可少. 程序自动并行化方法首先通过对程序进行依赖关系分析, 确定程序中哪部分可以并行化, 哪部分存在妨碍并行化的依赖关系. 其次, 通过各种并行化技术将一些妨碍并行化的依赖关系消除, 从而加大程序的并行性. 由于在程序运行过程中, 循环占据了程序的主要计算时间, 因此循环的并行化变换为并行化变换研究的重点[6]. 因此, 为了尽可能地挖掘串行程序中的并行性, 并行编译系统的大部分任务是对循环施加一些等价变换, 增加循环的并行粒度[7], 达到最大限度地利用多处理机计算机体系结构的特点. 本文算法主要针对顺序程序中的嵌套循环在多核系统中进行的循
环级并行, 并且要求能够进行并行处理的循环嵌套所满足的条件为:循环边界和数组下标是循环索引变量和符号常数的线性函数, 且循环迭代次数远大于处理器数. 与分布式系统中的循环级并行不同, 本文提出一种根据任务量进行划分并行粒度的方法实现循环级并行.
1.1 定义和定理
定义1.1 如下所示, 存在一组循环L1,L2,…,Lm, 如果除了第一个循环L1外, 其余每个循环都完整地包含于它的前一个循环中, 即L2包含于L1中, L3包含于L2中,…, Lm包含于Lm-1中, 则称此循环为一个嵌套循环, 记为L.
L1:do I1=p1,q1,θ1
L2:do I2=p2,q2,θ2

Lm:do Im=pm,qm,θm
H1(I1,I2,…,Im)

Hn(I1,I2,…,Im)
enddo

enddo
enddo
其中: Ir称为索引变量; pr,qr和θr分别称为循环的初值、终值和增量; p1和q1为整常数, pr和qr是I1,I2,…,Ir-1的整值函数; θr为非零整数. 为方便, 规定循环体H(I1,I2,…,Im)是由赋值语句组成的集合, 各层循环间不含其他语句, 且1≤r≤m.
定义1.2 对于一个嵌套循环L, 如果除了最后一个循环外, 每个循环的循环体都是它的后一个循环, 即Lm是Lm-1, 则称此嵌套循环L为紧嵌套循环.
定义1.3 将串行程序描述的任务划分成多个可并行运行的子任务称为任务划分.
任务划分是实现程序并行化的基础, 任务划分策略的好坏直接影响到负载平衡、通信复杂度、任务间的依赖性以及任务间的同步方式和同步频繁程度等[4].
定义1.4 嵌套循环L的所有索引变量组成的向量I=(I1,I2,…,Im), 称为L的索引向量. I的值称为索引点, 即是大小为m的整向量(i1,i2,…,im), 其中, p1≤i1≤q1,
p2(i1)≤i2≤q2(i1), …, pm(i1,i2,…,im-1)≤im≤qm(i1,i2,…,im-1). 嵌套循环L的循环体是H(I1,I2,…,Im)或H(I). 给定一个索引点i=(i1,i2,…,im), 便确定了H的一个实例H(i)=H(i1,i2,…,im), 称为L的一个迭代.
定义1.5 如果一个循环的各个迭代都可按任何次序执行, 而结果与串行执行时相同, 则称其为可并行化循环[3].
定义1.6 一个程序中, 若事件或动作B发生前, 事件或动作A必须发生, 则称B依赖于A, 这种关系称为依赖关系. 其中, 程序中由于读写同一数据而引起的依赖关系, 称为数据依赖关系.
因为影响程序向量化和并行化的主要关系是数据依赖关系, 所以本文主要讨论数据依赖关系, 并常将其简写为依赖关系, 用符号δ表示[3].
定义1.7 设语句S和T是嵌套循环L中的语句, 如果语句T依赖于S, 则存在实例S(i)δT(j). 令d=j-i, σ=sign(d), l=lev(d), 则d称为该依赖关系的依赖距离向量. 其中: σ是依赖方向向量; l是依赖层次. 语句T称为在第l层上以距离向量d及方向向量σ依赖于语句S.
依赖距离向量指明了对同一存储单元的两次访问间相隔的循环迭代数; 依赖方向向量指明了存在依赖关系的两个迭代在每一维上的依赖方向; 依赖层次指明了由哪一层循环引起的依赖关系[3].
定理1.1[3] 一个循环是可并行化的判定条件是:当且仅当循环体中不存在依赖方向不为0的依赖关系.
定理1.2[3] 嵌套循环L=(L1,L2,…,Lm)中第l层循环Ll是可并行化循环的判定条件是:当且仅当L中不存在层次为l的依赖关系, 即不存在方向向量为
σ1=σ2=…=σl-1=0, σl=1, σl+1=…=σm=*的依赖关系.
1.2 对任务量的规定
通常在共享存储的并行计算机上并行执行的程序块(region)都必须足够大, 以补偿并行计算机初始化和同步的开销. 在多核系统中各个核心仍然是共享内存和总线, 因此在实现串行程序自动并行化时也要考虑并行执行程序块的大小, 即任务量大小, 通过实现大任务量并行补偿并行执行线程的创建开销和线程间的通信开销.
本文对任务量的计算主要是对嵌套循环的循环体任务量的计算. 由于循环是将一段代码重复执行多次, 所以计算循环体的任务量可以从计算循环所包含代码段的任务量和循环次数的计算两方面考虑. 一般情况下, 循环中经常包含的语句是变量赋值和表达式的计算和赋值, 其中表达式的计算影响处理时间, 为了形式化描述循环体的任务量, 以紧嵌套循环L为模型关于循环中的代码规定如下:
(1) 简单变量赋值的任务量描述级别为w1;
(2) 加减法运算的任务量描述级别为w2;
(3) 乘除法运算的任务量描述级别为w3;
(4) 乘方的任务量描述级别为w4;
(5) 函数调用的任务量描述级别为w5;
(6) 简单条件语句的任务量描述级别为w2;
(7) 简单逻辑运算的任务量描述级别为w3;
(8) 循环体的任务量描述变量为Wd.
以上变量值主要是以指令开销为依据给出, 由于指令执行开销随运行平台的变化而变化, 所以本文给出一个相对量的描述. 根据线程创建的开销, 初步给定一个衡量可并行执行循环迭代任务量的一个阈值Wd, 其中要求Wd>Woverhead,
Woverhead是创建一个线程的基本开销. 通常Woverhead可以通过一个空循环串行执行和并行执行之间的差值计算. 由于该任务量的阈值只是一个参考, 所以用户可以根据每次处理后的运行结果对其进行动态调整, 以达到运行效率最佳. 同时还设置另一个描述值即通过总线进行一次通讯的开销值, 记为Wc, 可根据运行平台提供的同步机制的一次同步处理确定标准值.
1.3 基于任务量的紧嵌套循环自动并行化方法
并行执行一个循环就是把循环中的迭代分配给各个处理机执行. 一般情况下, 对嵌套循环总是选择可并行化的外层循环做并行化. 并行执行时把循环的最外层迭代空间平均分配到各个处理器单元上, 内层的循环体作为一个整体在一个处理器单元上运行[6]. 为了充分利用处理器单元, 一般有几个处理器单元就创建几个线程, 但采用该方案有时会出现一种浪费处理器资源的现象, 即当最外层循环的迭代次数少于处理器单元的个数时, 会出现有些线程没有任务可执行, 导致处理器单元的浪费和额外的线程创建开销. 考虑到这种情况, 本文提出了避免出现类似浪费的紧嵌套循环自动并行化算法.
算法描述如下:
规定对于紧嵌套循环L=(L1,L2,…,Lm)(其中第i层的循环初值为pi, 终值为qi, 且循环步长均为1), W为可并行执行单元的任务量, Wd为循环语句体的基本任务量, m 为嵌套循环的循环层数, N为处理器单元数. 算法分为两部分.
算法1.1 循环体任务量Wd算法.
Wd=k1×w1+k2×w2+k3×w3+k4×w4+k5×w5,
其中k1~k5分别表示语句体中各种运算的次数, 其值可以在对源程序进行编译时得到.
算法1.2 自动并行化算法.
(1) 根据定理1.2确定该紧嵌套循环的最外层循环是否可以并行执行, 若可以则转
(5), 否则执行(2);
(2) 根据定理1.2分别计算嵌套循环的各层循环, 确定可并行化的循环Li;
(3) 按照可并行化的循环Lj的层数j, 转(5)进行任务量的计算, 满足任务量要求则执行(6), 否则执行(4);
(4) 进行循环置换, 使无依赖关系的循环置换到外层[7-9];
(5) 根据各种运算的任务量描述值计算最内层循环体内各语句的任务量, 假设记为Wd, 若嵌套循环的可并行执行循环层数为j, 则根据如下公式计算一个迭代的任务量W:
(6) 若W满足W≥Woverhead+Wc, 则按外层循环的迭代次数创建线程, 线程个数为并将M个线程平均分配到各处理器单元, 若W不满足任务量大小的要求, 则以M/N的值为单位合并相邻的迭代, 并按合并后的迭代次数建立线程, 最差情况是整个嵌套循环不适合并行而采用串行运行.
2 多核环境下循环并行化的数据划分
2.1 Intel多核系统的结构特点
片上多核处理器(CMP)就是将多个计算内核集成在一个处理器芯片中, 从而提高计算能力[10]. 处理器的各CPU核心执行的程序间有时需要进行数据共享和同步, 因此硬件结构必须支持核间通信, 目前主流的片上高效通信机制有两种: 一种是基于总线共享的cache结构, 另一种是基于片上的互联结构. 总线共享cache结构是指每个CPU内核拥有共享的二级或三级cache, 用于保存常用的数据, 并通过连接核心的总线进行通信. 基于片上互连的结构是指每个CPU核心具有独立的处理单元和cache, 各个CPU核心通过交叉开关或片上网络等方式连接, 各CPU核心通过消息进行通信. 本文以Intel最新的同构多核处理器为运行部件, 其特点是采用共享式二级缓存设计, 每个内核都采用乱序执行, 内部有一级缓存, 且各核心的一级数据
缓存之间可以直接传输数据[10-13].
2.2 多核环境中的数据划分
在多核系统中每个核心在共享内存和二级缓存的基础上还存在自己私有的一级缓存, 一级缓存与处理单元在同一块芯片上, 所以一级缓存的访问速度非常快, 但容量有限, 基本上不可能将任务的整个代码和数据装入到其中. 考虑到运行平台是共享内存的结构, 所以本文在数据划分方面没有分布式系统复杂, 只设计了一个简单方法. 由于在前面并行化处理过程中将不相关的循环分配到各个处理器芯片上并行执行, 具有依赖关系的循环在同一个处理器芯片上串行执行, 所以把线程经常访问的数据装入一级缓存从而减少通讯次数. 无法装入一级缓存的数据和代码再根据访问频度依次保存于二级缓存和内存中[7-8].
综上可见, 串行程序自动并行化是实现并行处理提高程序运行速度的关键, 本文针对当前先进的硬件技术, 提出了一种在片上多处理器上运行的自动并行化算法, 侧重考虑了识别出的可并行单元任务量对并行性能的影响, 并且给出了任务量的一个理论描述方法.
参考文献
【相关文献】
[1] LIANG Bo, AN Hong, WANG Li, et al. Exploring of Speculative Theread-Level Parallelism from Subroutine [J]. Journal of Chinese Computer Systems, 2009, 30(2): 230-235. (梁博, 安虹, 王莉, 等. 针对子程序结构的线程级推测并行性分析 [J]. 小型微型计算机系统, 2009, 30(2): 230-235.)
[2] Zhai A, Colohan C B, Steffan J G, et al. Compiler Optimization of Memory-Resident Value Communication between Speculative Threads [C]//Proceedings of the Interrational Symposium on Code Generation and Optimization. Mowry: [s.n.], 2004: 39-50.
[3] 沈志宇, 胡子昂, 廖湘科, 等. 并行编译方法 [M]. 北京:国防工业出版社, 2000: 31-157.
[4] Femer G S. The Paragu in Compiler Message-Passing Code Generation Using SUIF
[C]//The Proceeding of the IEEE Southeast Con 2002. Columbia: SC, 2002: 5-7.
[5] GONG Xue-rong, SHENG Yong-hong, SHEN Ya-nan. Automatic Generation of Computing Code and Synchronous Cammunication Code in Translating Serial Program into Parallel Program [J]. Computer Applications and Software, 2008, 25(1): 91-92. (龚雪容, 生拥宏, 沈亚楠. 串行程序并行化中计算代码与同步通讯代码的自动生成 [J]. 计算机应用与软件, 2008, 25(1): 91-92.)
[6] GONG Xue-rong, LU Lin-sheng, ZHAO Rong-cai. Automatic Generation of Pipeline Parallel Code in Distributed Memory System [J]. Computer Engineering, 2008, 34(11): 77-79. (龚雪容, 陆林生, 赵荣彩. 分布内存系统中流水并行代码的自动生成 [J]. 计算机工程, 2008,
34(11): 77-79.)
[7] MA Guo-kai, WANG Xin-rang, WANG Peng, et al. Increase Parallel Granularity and Data Locality by Unimodular Metrics [J]. Chinese Journal of Computers, 2004, 27(4): 516-523. (马国凯, 王欣孃, 王鹏, 等. 利用U模变换增加并行粒度与改善数据访问局部性的方法 [J]. 计算机学报, 2004, 27(4): 516-523.)
[8] DONG Chun-li, HAN Lin, ZHAO Rong-cai. Linear Computation and Data Decomposition Algorithm in Parallel Compilation [J]. Computer Engineering, 2006, 32(24): 26-28. (董春丽, 韩林, 赵荣彩. 并行编译中一种线性数据和计算划分算法 [J]. 计算机工程, 2006, 32(24): 26-28.)
[9] YU Yi-jun, ZANG Bin-yu, SHI Wu, et al. Automatically Computing Unimodular Transforming Matrix to Parallelize Nested Sequential Loops [J]. Journal of Software, 1999, 10(4): 366-371. (俞一峻, 臧斌宇, 施武, 等. 自动寻找使多重串行循环并行化的么模变换 [J]. 软件学报, 1999, 10(4): 366-371.)
[10] Akhter S. 多核程序设计技术 [M]. 李宝峰, 富弘毅, 李韬, 译. 北京: 电子工业出版社, 2007:
37-71.
[11] Kremer U. NP-Completeness of Dynamic Remapping [C]//Proceedings of the Fourth Workshop on Compilers for Parallel Architectures and Compilation Techniques. Delft: Montreal, 1994: 1-8.
[12] DING Qiang, ZANG Bin-yu, ZHU Chuan-qi. Data Partition Mode for Dynamic Array Distributions [J]. Computer Engineering and Design, 2005, 26(5): 1135-1139. (丁强, 臧斌宇, 朱传琪. 一种动态分布数组的数据划分模式 [J]. 计算机工程与设计, 2005, 26(5): 1135-1139.) [13] LU Wei, Dennis G. Parallel XML Processing by Work Stealing [C]//Proceedings of the 2007 Workshop on Service-Oriented Computing Performance: Aspects, Issues, and Approaches. California: Monterey, 2007: 31-38.。

相关文档
最新文档