盛冲冲,胡新明,李佳佳,吴百锋
(复旦大学计算机科学技术学院,上海201203)
面向节点异构GPU集群的编程框架
盛冲冲,胡新明,李佳佳,吴百锋
(复旦大学计算机科学技术学院,上海201203)
基于异构GPU集群的主流编程方法是MPI与CUDA的混合编程或者其简单变形。因为对底层的集群架构不透明,程序员对GPU集群采用MPI与CUDA编写应用程序时需要人为考虑硬件计算资源,复杂度高、可移植性差。为此,基于数据流模型设计和实现面向节点异构GPU集群体系结构的新型编程框架分布式并行编程框架(DISPAR)。DISPAR框架包含2个子系统:(1)代码转换系统StreamCC,是DISPAR源代码到MPI+CUDA代码的自动转换器。(2)任务分配系统StreamMAP,具有自动发现异构计算资源和任务自动映射功能的运行时系统。实验结果表明,该框架有效简化了GPU集群应用程序的编写,可高效地利用异构GPU集群的计算资源,且程序不依赖于硬件平台,可移植性较好。
GPU集群;异构;分布式并行编程框架;代码转换;任务分配;可移植性
面向通用计算的GPU(GPGPU)以其大规模数据级并行计算能力和极其出色的性能功耗比特性,在当下已经成为了低能耗超级计算机和计算机集群追捧的加速器。在计算机集群中,不断加入不同类型的GPGPU导致了集群内部计算资源多样化。集群底层硬件计算部件不断更新、节点间计算资源的异构程度不断加剧,使得仅仅依靠现有的一些较低抽象层面的编程模型(如MPI、CUDA混合编程)设计出高效应用程序变得更加困难。对于异构计算,高性能的获得往往伴随着软件开发的高复杂度[1]。由于依赖于硬件计算资源,并且需要程序员人为制定分配方案,这样的任务划分在复杂度较高时,难以得到与各个节点的计算能力相匹配的解决方案,从而不能有效地利用GPU集群的计算能力。并且以这样的方式编写应用程序不仅对程序员的要求甚高,而且开发的程序可移植性差。简而言之,不在较高抽象层将应用任务按GPU集群架构进行划分就不能很好地有效利用GPU集群的计算资源。
为解决这个问题,本文以数据流模型[2-3]为基础,将计算过程进行流处理,设计并实现一种新型的能够适应节点异构GPU集群体系结构的分布式并行编程框架(Distributed Parallel Programming Framework,DISPAR)。DISPAR框架包含2个子系统,即代码转换子系统StreamCC和任务分配子系统StreamMAP。
GPU集群是一种同时包含CPU和GPU两种计算机资源的分布式并行计算系统,其中CPU负责执行应用程序中的串行部分,而GPU则负责数据级的并行计算部分。不同的GPGPU不断加入集群中导致节点间的计算能力差异化,造成了GPU集群在节点层面的异构。典型的节点异构GPU集群系统如图1所示。
图1 典型的节点异构GPU集群系统
图1反映了GPU集群在节点层次的异构性。Intel最新推出的MIC架构(Many Integrated Core Architecture)协处理器Xeon Phi也已经开始作为加速器加入到GPU集群中[4],所以在可见的未来内,异构集群将呈现多样化、复杂化。
文献[5-6]探讨了基于MPI+OpenMP的对称多处理器体系结构的并行编程方法。但是对于GPU集群而言并不适用,因为GPU集群的通信和内存访问特性并不同,这一点可以在文献[7-8]中找到相关的论述。文献[9-10]讨论了对称GPU集群的MPI+ CUDA模型。其中,MPI负责进程的划分和通信, CUDA负责面向数据级并行的GPU计算。它的不足之处主要在于,需要程序员了解底层的硬件拓扑信息来手动完成任务到节点的映射,比方说手动地将数据密集型的任务分配给含有GPU较多、计算能力较强的节点。显然,当集群规模较大、任务划分更为复杂的时候,这种方法并不可取;另外手动分配需要适应底层架构,影响程序的可移植性,这也是设计DISPAR时需要解决的问题。事实上也早有人在做基于GPU的数据流模型的研究[11],但大都还停留在模型描述上。
3.1 系统思想
在DISPAR编程框架下,一个应用的处理过程被划分为2类模块:VNODE(虚拟节点)和PIPE(连接管道)。虚拟节点VNODE处理算术和逻辑运算等,通过单向的PIPE连接一对VNODE,从而为数据传输提供通信接口。虚拟节点可以调用CUDA(直接或者间接),是DISPAR数据级并行计算的处理单位。虚拟节点的这一抽象可以使得程序员把应用程序的设计重心放到功能单元的划分上。VNODE之间的数据传输通过PIPE进行,连接管道在逻辑上表示功能单元的连接,在物理上表示进程之间的联系(进程间通信或内存的拷贝)。DISPAR框架基于数据流模型,它表达应用的一个示例如图2所示。
图2 DISPAR表达应用的示例
DISPAR的基本思想是为数据密集型计算的应用提供一个任务划分框架。在DISPAR框架下,开发人员可以从较高的抽象层出发,采用自顶向下的设计方法进行层次化的程序设计。按功能层次化方式划分的功能处理单元(可以看成是VNODE)往往更具有数据并行性,适合利用GPU kernel程序加速。
开发人员将编写好的DISPAR程序经过StreamCC预处理器自动转换为MPI,CUDA混合程序,然后通过运行时系统StreamMAP进行任务分析;根据StreamCC产生的VNODE信息和资源信息数据库来自动生成任务映射配置文件,最终程序通过集群的MPI环境执行。具体的流程见图3。DISPAR框架的特点:(1)高效性:从较高的抽象层出发,采用自顶向下的设计方法,无需考虑硬件资源。(2)移植性:隐藏了进程的显式划分,根据不同的集群系统自动生成程序配置文件,通过预编译分析的手段提供一个虚拟层,运行时确定任务映射。(3)透明性:通过VNODE和PIPE的定义,封装了显式的进程划分和通信,通过生成中间虚拟层(MPI程序配置文件)将虚拟节点与物理节点分离。
图3 DISPAR处理流程
3.2 StreamCC预处理子系统
DISPAR框架通过定义一套新的以VNODE和PIPE为核心的语法,指导用户编写基于DISPAR框架语言的程序。然后StreamCC通过词法分析和语法分析将其转换为MPI,CUDA混合代码。这样一种引导用户以数据流模型的思想来编写程序的方式,避免原有MPI要求的进程显示划分,简化了应用的描述和程序的设计。StreamCC主要实现了2个核心转换:(1)VNODE到MPI/CUDA进程的转换。(2)将PIPE通信接口自动转换为MPI相应的MPI_ SEND和MPI_RECV调用。图4为StreamCC的流程框架。
图4 StreamCC流程图框架
从图4可见,StreamCC依次包含3个模块: (1)代码解析模块,对DISPAR代码源程序进行词法、语法分析,解析VNODE和PIPE的关联信息,并写入HASH表,供下一个模块使用。(2)进程框架生成模块,根据HASH表中的虚拟节点VNODE的使用情况(由模块1来标记)来确定将要生成的MPI程序中case语句(对应各个进程行为)的结构,从而为每个虚拟节点分配一个进程ID。该模块只完成一个转换的框架,真正的代码转换由下一个模块完成。(3)代码生成模块,读取HASH表中连接管道PIPE的信息(也就VNODE的连接关系,用来表示DISPAR的数据输入与输出),将其转化为MPI程序的通信原语。
3.3 StreamMAP任务分配子系统
DISPAR框架借鉴了OpenMP,OpenACC[12]等的编译制导(Compiler Directive)特性,StreamMAP以扩展C编译器前端的方式提供对编译制导指令的支持,从而引导开发人员在源程序中显示地指明VNODE计算资源的需求。语法表示为:#pragma streamap directive[clause[[,]clause]…],其中directive可以为resource(表示计算资源,可以指明为CPU或者GPU),也可以为communication(表示通信关系)。
StreamMAP作为一个运行时系统完成DISPAR框架下应用程序的任务至计算资源(物理节点)的映射。在安装配置完DISPAR后,集群启动时首先完成节点计算资源的自动发现(通过Linux的系统调用和CUDA的设备查询语句),然后动态建立资源信息库(包括CPU和GPU的配置信息,如数目、计算能力、内存,以及各个物理计算节点的拓扑结构)。DISPAR会开启一个后台进程来维护这个资源信息数据库。StreamMAP分析VNODE内部计算资源的需求和PIPE通信的传输,询问资源信息数据库得到各个节点的物理计算能力和分配情况,然后动态地映射和分配任务,以实现平台无关性;也就是说当集群拓扑结构改变时(如加入新节点、节点失效等),应用程序不需要做任何改动就可以运行在这个新集群上。StreamMAP处理过程可见图5。
StreamMAP主要包括编译制导解析模块、计算资源发现模块和任务映射分配模块;前2个模块分别实现了应用程序资源需求(产生需求拓扑图)和各个物理节点计算资源(产生节点资源表)的分析与发现,而最后一个模块给出任务分配方案(需求拓扑图和节点资源表建立匹配,生成配置文件)。虚拟节点VNODE有2种可能的资源需求:CPU-only(用CO表示)或CPU+GPU(用CG表示),通过扫描VNODE的源代码,寻找有无针对GPU的CUDA kernel调用,来判定需求类型。以资源需求作为顶点,管道连接作为弧的图就是需求拓扑图(Require Topology Graph,RTG)。
图5 StreamMAP处理过程
为了更好地描述分配算法,用符号CRT表示只含CPU节点的资源表,GRT表示同时含有CPU, GPU节点的资源表。CRT={n1,n2,…,nk},GRT= {n1,n2,…,nm}。ni=(ID,total,available)。其中, ID表示节点标识;total表示节点计算资源(CPU或CPU-GPU对)数量;available表示当前可用的数量。各个节点在初始阶段total与available相等,可以在total和available变量之后加_co或_cg的后缀以区分不同计算资源。CRT和GRT各有一个指向表内第一个节点的指针,算法的具体过程如下:
Step 1选取RTG起始顶点作为当前顶点。
Step 2若当前顶点的类型为CG,执行下一步,否则跳至Step4。
Step 3检查GRT节点表指针是否为NULL,若是则跳至Step5;若不是则把当前节点分配给当前顶点,相应的available_cg减1(如果变为0则指针移到GRT中下一个节点),跳至Step7。
Step 4检查CRT节点表指针是否为NULL,若是则跳至Step3;若不是则把当前节点分配给当前顶点,相应的available_co减1(如果变为0则指针移到GRT中下一个节点),跳至Step7。
Step 5若当前顶点为CG类型,检查相邻的顶点是否CG类型并已被分配,若是则分配到同一节点并跳至Step7,否则执行Step6。若当前顶点为CO类型,检查相邻的顶点是否已被分配,若是则分配到同一节点并跳至Step7,否则执行Step6。
Step 6若当前顶点为CG类型,则分配到任意CG节点(低负载节点优先)并跳至Step7。若当前顶点为CO类型,则分配到任意节点(低负载节点优先)并跳至Step7。
Step 7取与之相邻的未分配顶点为当前顶点,跳至Step2;若相邻的未分配顶点不存在,则随机任取一个未分配顶点作为当前顶点,进入Step2,若所有顶点均被分配,算法结束。
该算法中有4个原则:(1)一个顶点只能分配到一个节点;(2)CG顶点只能分配给CG节点,CO顶点可分配给CO或CG节点;(3)尽可能保证负载平衡;(4)相邻顶点优先分配到同一节点,以减少通信代价。
4.1 实验环境
本文实验采用了一个节点异构的小型GPU集群,集群包含4个节点,通过交换机网络InfiniBand QDR相连。所有节点安装的Linux系统均为Ubuntu Server10.04 LTS,MPI采用开源的MPICH。采用数字信号处理领域常见的FIR数字滤波程序。集群配置详单如表1所示。
表1 集群配置
4.2 实验方法
分别采用3种方法实现上述例程:(1)MPI与CUDA直接混合编程,任务映射由MPI以随机的方式完成。(2)MPI与CUDA人工优化编程,由程序员分析出最优的任务映射,写入MPI程序配置文件。(3)在DISPAR框架下以数据流模型实现代码,并由StreamCC实现代码转换后由StreamMAP自动产生适应集群架构的MPI程序配置文件。分别以上述3种方式实现并运行,得出实验数据并分析。
4.3 实验结果
3种方法编写同一个应用程序时,代码规模和运行时间的如图6和图7所示。
图6 代码规模比较
图7 运行时间比较
从代码规模比较来看,方法(3)采用DISPAR描述应用最为简单,方法(1)和方法(2)代码规模几乎没有差异,但仅仅从代码规模看并不能完全体现代码实现复杂度,方法(2)人工找出最优的分配方案,需要程序员付出更多的时间代价。从运行时间角度看,方法(3)和人工优化过的方法(2)具有相近的运行时间,比随机映射的方法(1)有明显的加速,这是因为MPI的随机映射完全不考虑节点的计算能力,当任务分配不合理时,不能有效地利用GPU加速。所以由此可知,DISPAR编程框架方法可以以较低的实现难度得到理想的加速效果。
本文论述一种新型的面向节点异构GPU集群的编程框架DISPAR。通过代码转化和自动任务分配改进原有的MPI,CUDA混合编程模型。DISPAR编程框架方法实现了在异构计算时以较低的编程难度得到理想加速效果的目标。后续研究可以考虑将DISPAR框架与GPU虚拟化技术[13]相结合,从而更好地利用集群的计算资源。
[1] Diamos G,Yalamanchili S.Harmony:An Execution Model and Runtime for Heterogeneous Many Core Systems[C]//Proceedings of the17th International Symposium on High Performance Distributed Computing.[S.l.]:ACM Press,2008:197-200.
[2] Whiting P G,Pascoe R S V.A History of Data-flow Languages[J].IEEEAnnalsoftheHistoryof Computing,1994,16(4):38-59.
[3] Keller R M.Data Flow Program Graphs[J].Computer, 1982,15(2):26-41.
[4] Dokulil J,Bajrovic E,Benkner S,et al.High-level Support for Hybrid Parallel Execution of C++ ApplicationsTargetingIntelXeonPhiCoprocessors[C]//Proceedings of International Conference on Computational Science.[S.l.]:Springer,2013.
[5] 王惠春,朱定局,曹学年,等.基于SMP集群的混合并行编程模型研究[J].计算机工程,2009,35(3): 271-273.
[6] 陈 勇,陈国良,李春生,等.SMP机群混合编程模型研究[J].小型微型计算机系统,2004,25(10): 1763-1767.
[7] Wu Yongwen,SongJunqiang,LuFengshun,etal. Communication and Memory Access Latency Characteristics of CPU/GPU Heterogeneous Cluster[C]//Proceedings of International Conference on Computational and Information Sciences.Chongqing,China:[s.n.],2012: 958-961.
[8] Kindratenko V V,Enos J J,Shi Guochun,et al.GPU ClustersforHigh-performanceComputing[C]// Proceedings of IEEE International Conference on Cluster Computing.[S.l.]:IEEE Press,2009:1-8.
[9] 许彦芹,陈庆奎.基于SMP集群的MPI+CUDA模型的研究与实现[J].计算机工程与设计,2010,31(15): 3408-3412.
[10] 滕人达,刘青昆.CUDA、MPI和OpenMP三级混合并行模型的研究[J].微计算机应用,2010,31(9):63-69.
[11] 郑杨杨.基于GPU的数据流通用处理模型[D].大连:大连理工大学,2011.
[12] OpenACC.OpenACC.1.0.pdf[EB/OL].(2013-11-09).http://openacc.org/Downloads.
[13] Shi Lin,ChenHao,SunJianhua.vCUDA:GPU Accelerated High Performance Computing in Virtual Machines[J].IEEE Transactions on Computers,2009, 61(6):408-416.
编辑 顾逸斐
Programming Framework for Node Heterogeneous GPU Cluster
SHENG Chongchong,HU Xinming,LI Jiajia,WU Baifeng
(School of Compute Science,Fudan University,Shanghai 201203,China)
The mainly used programming method for heterogeneous GPU cluster is hybrid MPI/CUDA or its simple deformation.However,because of its transparency to underlying architecture when using hybrid MPI/CUDA to write code for heterogeneous GPU cluster,programmers tend to need detailed knowledge of the hardware resources,which makes the program more complicated and less portable.This paper presents Distributed Parallel Programming Framework (DISPAR),a new programming framework for node-level heterogeneous GPU cluster based on data flow model. DISPAR framework contains two sub-systems,StreamCC and StreamMAP.StreamCC is a code conversion tool which coverts DISPAR code into hybrid MPI/CUDA code.StreamMAP is a run-time system which can detect heterogeneous computing resources and map the tasks to appropriate computing units automatically.Experimental results show that the methods can make efficient use of the computing resources and simplify the programming on heterogeneous GPU cluster. Besides,it has better portability and scalability as the code does not rely on the execution platform.
GPU cluster;heterogeneous;Distributed Parallel Programming Framework(DISPAR);code conversion; task assignment;portability
盛冲冲,胡新明,李佳佳,等.面向节点异构GPU集群的编程框架[J].计算机工程,2015,41(2):292-297.
英文引用格式:Sheng Chongchong,Hu Xinming,Li Jiajia,et al.Programming Framework for Node Heterogeneous GPU Cluster[J].Computer Engineering,2015,41(2):292-297.
1000-3428(2015)02-0292-06
:A
:TP391
10.3969/j.issn.1000-3428.2015.02.056
复旦大学ASIC和系统国家重点实验室基金资助项目;华为创新研究计划基金资助项目。
盛冲冲(1988-),男,硕士研究生,主研方向:嵌入式系统,并行计算;胡新明、李佳佳,硕士;吴百锋,教授。
2014-03-12
:2014-04-03E-mail:11210240001@fudan.edu.cn