一种面向CPU/GPU异构集群的数据流编程方法和系统转让专利

申请号 : CN201710499328.6

文献号 : CN107329828B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 于俊清杨瑞瑞唐九飞

申请人 : 华中科技大学

摘要 :

本发明公开了一种面向CPU/GPU异构集群的数据流编程方法,其中方法的实现包括:利用数据流程序得到SDF图,对SDF图进行层次性二级任务划分与调度,对每个任务单元设置阶段号,得到任务单元的执行顺序;利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。本发明对数据流程序并行化同时对数据通信进行了优化,提高了程序的整体执行性能。

权利要求 :

1.一种面向CPU/GPU异构集群的数据流编程方法,其特征在于,包括以下步骤:

(1)利用数据流程序得到同步数据流图,即SDF图,对SDF图进行层次性二级任务划分与调度,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射;

(2)根据SDF图中任务单元到异构集群节点的CPU核或GPU的映射,对每个任务单元设置阶段号,得到任务单元的执行顺序;

(3)异构集群节点之间以生产者/消费者模式为基础,与MPI接口保持一致,将每个异构集群节点以分布式存储和共享存储相结合的方式,构造CPU和GPU共享存储空间,得到异构集群多任务数据通信模型;

(4)利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。

2.根据权利要求1所述的一种面向CPU/GPU异构集群的数据流编程方法,其特征在于,所述步骤(1)的具体实现方式:对数据流程序进行词法分析和语法分析后得到的SDF图,对SDF图进行进程级任务划分,得到SDF子图,SDF子图反映SDF图中任务单元到异构集群节点的映射,对SDF子图进行线程级任务划分,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。

3.根据权利要求2所述的一种面向CPU/GPU异构集群的数据流编程方法,其特征在于,所述进程级任务划分的具体实现方式为:将SDF图的每个任务单元预处理为一个独立的粗化group;根据相邻group粗化收益,进行粗粒度划分直到划分粗化图个数等于异构集群节点个数;利用细粒度边界调整粗化图,生成的无环子图为SDF子图。

4.根据权利要求2所述的一种面向CPU/GPU异构集群的数据流编程方法,其特征在于,所述线程级任务划分的具体实现方式为:对SDF子图进行任务单元融合和边界调整,得到SDF子图划分后的凸子图,进而得到凸子图到异构集群节点的CPU核或GPU的映射,利用凸子图与任务单元的映射关系,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。

5.根据权利要求2所述的一种面向CPU/GPU异构集群的数据流编程方法,其特征在于,所述设置阶段号的具体实现方式为:遍历异构集群节点根据进程级任务划分获取的SDF子图;对SDF子图的任务单元集合进行拓扑排序,选择对应的阶段赋值函数设置每个任务单元的阶段号。

6.一种面向CPU/GPU异构集群的数据流编程系统,其特征在于,包括以下模块:

二级任务划分与调度模块,用于利用数据流程序得到同步数据流图,即SDF图,对SDF图进行层次性二级任务划分与调度,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射;

设置阶段号模块,用于根据SDF图中任务单元到异构集群节点的CPU核或GPU的映射,对每个任务单元设置阶段号,得到任务单元的执行顺序;

数据通信模块,用于在异构集群节点之间以生产者/消费者模式为基础,与MPI接口保持一致,将每个异构集群节点以分布式存储和共享存储相结合的方式,构造CPU和GPU共享存储空间,得到异构集群多任务数据通信模型;

目标代码模块,用于利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。

7.根据权利要求6所述的一种面向CPU/GPU异构集群的数据流编程系统,其特征在于,所述二级任务划分与调度模块的具体实现方式:对数据流程序进行词法分析和语法分析后得到的SDF图,对SDF图进行进程级任务划分,得到SDF子图,SDF子图反映SDF图中任务单元到异构集群节点的映射,对SDF子图进行线程级任务划分,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。

8.根据权利要求7所述的一种面向CPU/GPU异构集群的数据流编程系统,其特征在于,所述进程级任务划分的具体实现方式为:将SDF图的每个任务单元预处理为一个独立的粗化group;根据相邻group粗化收益,进行粗粒度划分直到划分粗化图个数等于异构集群节点个数;利用细粒度边界调整粗化图,生成的无环子图为SDF子图。

9.根据权利要求7所述的一种面向CPU/GPU异构集群的数据流编程系统,其特征在于,所述线程级任务划分的具体实现方式为:对SDF子图进行任务单元融合和边界调整,得到SDF子图划分后的凸子图,进而得到凸子图到异构集群节点的CPU核或GPU的映射,利用凸子图与任务单元的映射关系,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。

10.根据权利要求7所述的一种面向CPU/GPU异构集群的数据流编程系统,其特征在于,所述设置阶段号的具体实现方式为:遍历异构集群节点根据进程级任务划分获取的SDF子图;对SDF子图的任务单元集合进行拓扑排序,选择对应的阶段赋值函数设置每个任务单元的阶段号。

说明书 :

一种面向CPU/GPU异构集群的数据流编程方法和系统

技术领域

[0001] 本发明属于计算机编译技术领域,更具体地,涉及一种面向CPU/GPU异构集群的数据流编程方法和系统。

背景技术

[0002] 传统CPU多核处理器和CPU集群有时无法满足某些应用程序对大规模和超大规模计算的需求,图形处理器(Graphic Processing Unit,GPU)在诸如CPU/GPU异构架构服务器上的高性能浮点计算、并行计算等方面有巨大的优势,因此逐渐得到广泛应用。一种多CPU与多GPU相结合的异构计算机逐渐成为研究对象,在该架构下,传统核CPU与计算核GPU可以同时工作,任务以多粒度并行方式执行。因此,CPU/GPU异构集群系统成为了一个解决超大规模计算问题值得深入探索的高效编程平台。数据流编程语言(Data Flow Programming Language,DFPL)以其能够面向领域编程(Domain Specific Programming)的特征近年来得到广泛应用,与该语言对应的数据流编程模型(Data Flow Stream Programming Model)因其具有将计算与通信分离的特性,被研究人员发现并提出。在当前需要高性能计算的大数据时代,传统并行计算模型已经不能满足大规模应用的性能需求。
[0003] 在以高性能计算为核心的大数据时代,传统多核并行模型已经不能满足大规模计算的需求。传统多核集群平台下的任务划分与调度方法并不能在异构体系下简单复制,传统CPU集群平台下的大规模并行计算模型都会采用如Hadoop、Spark、Strom等分布式存储框架来提供服务器节点间的网络数据通信。现有的CPU与GPU同时工作存在无法合理分配目标体系结构下的硬件资源,没有充分挖掘数据流程序中存在的并行性,程序性能较低的技术问题。

发明内容

[0004] 针对现有技术的以上缺陷或改进需求,本发明提供了一种面向CPU/GPU异构集群的数据流编程方法和系统,现有的CPU与GPU同时工作存在无法合理分配目标体系结构下的硬件资源,没有充分挖掘数据流程序中存在的并行性,程序性能较低的技术问题。
[0005] 为实现上述目的,按照本发明的一个方面,提供了一种面向CPU/GPU异构集群的数据流编程方法,包括以下步骤:
[0006] (1)利用数据流程序得到SDF图,对SDF图进行层次性二级任务划分与调度,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射;
[0007] (2)根据SDF图中任务单元到异构集群节点的CPU核或GPU的映射,对每个任务单元设置阶段号,得到任务单元的执行顺序;
[0008] (3)将异构集群节点之间以生产者/消费者模式为基础,与MPI接口保持一致,将每个异构集群节点以分布式存储和共享存储相结合的方式,构造CPU和GPU共享存储空间,得到异构集群多任务数据通信模型;
[0009] (4)利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。
[0010] 进一步的,步骤(1)的具体实现方式:
[0011] 对数据流程序进行词法分析和语法分析后得到的SDF图,对SDF图进行进程级任务划分,得到SDF子图,SDF子图反映SDF图中任务单元到异构集群节点的映射,对SDF子图进行线程级任务划分,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。
[0012] 进一步的,进程级任务划分的具体实现方式为:
[0013] 将SDF图的每个任务单元预处理为一个独立的粗化group;根据相邻group粗化收益,进行粗粒度划分直到划分粗化图个数等于异构集群节点个数;利用细粒度边界调整粗化图,生成的无环子图为SDF子图。
[0014] 进一步的,线程级任务划分的具体实现方式为:
[0015] 对SDF子图进行任务单元融合和边界调整,得到SDF子图划分后的凸子图,进而得到凸子图到异构集群节点的CPU核或GPU的映射,利用凸子图与任务单元的映射关系,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。
[0016] 进一步的,设置阶段号的具体实现方式为:
[0017] 遍历异构集群节点根据进程级任务划分获取的SDF子图;对SDF子图的任务单元集合进行拓扑排序,选择对应的阶段赋值函数设置每个任务单元的阶段号。
[0018] 按照本发明的另一方面,提供了一种面向CPU/GPU异构集群的数据流编程系统,包括以下步骤:
[0019] 二级任务划分与调度模块,用于利用数据流程序得到SDF图,对SDF图进行层次性二级任务划分与调度,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射;
[0020] 设置阶段号模块,用于根据SDF图中任务单元到异构集群节点的CPU核或GPU的映射,对每个任务单元设置阶段号,得到任务单元的执行顺序;
[0021] 数据通信模块,用于将异构集群节点之间以生产者/消费者模式为基础,与MPI接口保持一致,将每个异构集群节点以分布式存储和共享存储相结合的方式,构造CPU和GPU共享存储空间,得到异构集群多任务数据通信模型;
[0022] 目标代码模块,用于利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。
[0023] 进一步的,二级任务划分与调度模块的具体实现方式:
[0024] 对数据流程序进行词法分析和语法分析后得到的SDF图,对SDF图进行进程级任务划分,得到SDF子图,SDF子图反映SDF图中任务单元到异构集群节点的映射,对SDF子图进行线程级任务划分,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。
[0025] 进一步的,进程级任务划分的具体实现方式为:
[0026] 将SDF图的每个任务单元预处理为一个独立的粗化group;根据相邻group粗化收益,进行粗粒度划分直到划分粗化图个数等于异构集群节点个数;利用细粒度边界调整粗化图,生成的无环子图为SDF子图。
[0027] 进一步的,线程级任务划分的具体实现方式为:
[0028] 对SDF子图进行任务单元融合和边界调整,得到SDF子图划分后的凸子图,进而得到凸子图到异构集群节点的CPU核或GPU的映射,利用凸子图与任务单元的映射关系,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射。
[0029] 进一步的,设置阶段号的具体实现方式为:
[0030] 遍历异构集群节点根据进程级任务划分获取的SDF子图;对SDF子图的任务单元集合进行拓扑排序,选择对应的阶段赋值函数设置每个任务单元的阶段号。
[0031] 总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:
[0032] (1)本发明提供的数据流编程方法以数据流程序经词法分析和语法分析后得到的同步数据流图(SDF图)作为输入,对其依次进行层次性二级任务划分与调度、设置阶段号、数据通信,最后生成目标代码。完成数据流程序的并行化处理,提高执行性能。使得CPU与GPU同时工作合理分配目标体系结构下的硬件资源,充分挖掘数据流程序中存在的并行性,提高程序性能。
[0033] (2)优选的,对数据流程序经词、语法分析后得到的SDF图进行进程级任务划分和线程级任务划分后,将SDF图内任务单元负载均衡的映射到异构集群节点内CPU核或GPU上,使得任务单元执行并行化,提高程序执行性能。
[0034] (3)优选的,进程级任务划分同时考虑异构集群节点间负载均衡与通信开销,将SDF图划分为多个无环子图分别映射到异构集群各节点上,将SDF图各任务单元在异构集群各节点上并行执行,提高程序整体执行性能。
[0035] (4)优选的,线程级任务划分考虑异构集群节点内CPU核间或GPU间负载均衡和通信开销,将SDF子图内任务单元映射到不同CPU核或GPU上并行执行,提高程序执行性能。
[0036] (5)优选的,对SDF图内任务单元计算阶段号,得到各个任务单元的执行顺序,完成流水线并行,提高程序执行性能。

附图说明

[0037] 图1为本发明实施例提供的一种面向CPU/GPU异构集群的数据流编程方法的流程图;
[0038] 图2为本发明实施例1提供面向CPU/GPU异构集群的数据流编程框架图;
[0039] 图3为本发明实施例1中进程级多路图划分算法流程图;
[0040] 图4为本发明实施例1中线程级动态适应性划分算法中SDF子图actor融合示例图;
[0041] 图5本发明实施例1中线程级动态适应性划分算法中SDF子图actor节点映射示例图;
[0042] 图6为本发明实施例1中集群节点内actor阶段赋值示例图;
[0043] 图7为本发明实施例1中异构集群系统多任务数据通信框架图;
[0044] 图8为本发明实施例1中异构集群节点内数据通信存储映射机制模型图;

具体实施方式

[0045] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0046] 如图1所示,一种面向CPU/GPU异构集群的数据流编程方法,包括以下步骤:
[0047] (1)对数据流程序进行词法分析和语法分析后得到的SDF图,对SDF图进行层次性二级任务划分与调度,得到SDF图中任务单元到异构集群节点的CPU核或GPU的映射;
[0048] (2)根据SDF图中任务单元到异构集群节点的CPU核或GPU的映射,对每个任务单元设置阶段号,得到任务单元的执行顺序;
[0049] (3)将异构集群节点之间以生产者/消费者模式为基础,与MPI接口保持一致,将每个异构集群节点以分布式存储和共享存储相结合的方式,构造CPU和GPU共享存储空间,得到异构集群多任务数据通信模型;
[0050] (4)利用SDF图中任务单元到异构集群节点的CPU核或GPU的映射和异构集群多任务数据通信模型,得到任务单元之间的数据通信,根据任务单元的执行顺序和任务单元之间的数据通信得到数据流程序的目标代码。
[0051] 实施例1
[0052] 如图2所示为本实施例1在COStream数据流编译系统中的编译框架图,以COStream语言编写的数据流程序作为初步输入,通过COStream编译系统前端进行词法分析和语义分析将源程序构造成由顶层文法节点表示的抽象语法树;对该抽象语法树转换为一个以任务单元actor为单位通过数据流stream连接而成的有向无环图即SDF图,图中节点对应源程序任务单元表示计算,边对应源程序数据流表示节点间的依赖关系与数据通信方向;以源程序对应的SDF图为处理对象,根据异构集群节点数目以及节点内硬件结构配置分别进行层次性二级任务划分与调度;然后根据SDF图内actor到集群节点内CPU核或GPU的映射结果进行阶段赋值,构造软件流水线;多任务流数据通信包括并行任务间(进程间)消息传递和单个任务内(进程内)主控程序与计算kernel间数据通信。系统采用分布式存储与共享存储相结合的方式,并行任务间消息传递与传统MPI接口保持一致,单个任务流内提供数据共享,使得CPU主控程序和GPU计算kernel通过对共享数据的访问隐藏系统主存与显存之间的显式数据传输。
[0053] (1)完成COStream数据流源程序对应的SDF图内actor与异构集群节点及节点内CPU核或GPU映射的二级任务划分与调度步骤
[0054] 该步骤包括两个子步骤:进程级任务划分和线程级任务划分。集群节点间的任务划分在进程级层面即属于一级划分,合理的将SDF图的任务单元划分到各个服务器节点是后续处理的基础也是整个数据流并行编程模型的关键。异构并行系统又具有其独特性,节点内任务划分在线程级层面属于二级划分,需要考虑当前服务器节点的结构特征,对纯CPU服务器节点考虑负载均衡的将任务映射到CPU多核,而对CPU/GPU混合架构服务器节点则同时考虑负载均衡与降低通信开销的情况下将并行任务划分到GPU端,提高程序执行性能。具体步骤如下:
[0055] (1.1)进程级任务划分:集群节点间任务划分不仅需要综合考虑actor的工作量以达到划分后负载相对均衡,而且需要衡量actor之间的数据依赖关系,最大程度的降低划分后子图之间的数据通信开销,以使得负载和通信最优化,充分利用集群硬件资源。多层K路图划分策略(Multilevel k-way Partitioning Scheme)以图论相关知识为基础是一种针对一般图的划分算法,它主要考虑划分各部分负载相对均衡同时减少划分之间的通信,相对来说可以得到不错的划分结果,由于数据流源程序对应的SDF图是一个有向无环图,结合SDF图本身包含的数据流的特性以及集群节点间网络延迟带来的通信开销影响对MKP划分算法改进,设计并实现了进程级多路图划分算法。如图3所示,具体步骤为:首先输入COStream源程序对应的SDF图,将每个actor预处理为一个独立的粗化group;然后,计算相邻group的粗化收益进行粗粒度划分直到划分子图个数等于集群节点个数;最后,细粒度边界调整粗化图,生成无环子图降低节点间的通信开销,并将结果映射到集群节点。
[0056] (1.2)线程级任务划分:进程级多路图任务划分将SDF图划分为多个子图,使得每个子图的任务单元actor映射到对应的集群节点,下一步对于划分到每个服务器节点上的SDF子图进行线程级任务划分完成actor到集群节点内CPU核心或GPU之间的映射。由于经过进程级一级任务划分后,每个集群节点上映射一个SDF子图,任务量已大大减少,对于部分并行任务量不足的应用程序如果强制划分到所有CPU核心或全部GPU,非但不能提高并行度还会增大核间或GPU间通信开销降低程序执行性能。因此,考虑到数据流程序一级任务划分映射后的actor工作量对以上算法做出改进,设计并实现了一种线程级动态适应性划分算法,该算法在运行时根据actor工作负载确定最终划分份数,最大程度上实现任务并行化同时最小化数据通信开销。该算法基本步骤为:
[0057] (1.2.1)SDF子图actor节点融合:如图4所示,遍历actor节点集合根据达到稳态调度后计算的工作量与通信量构邻接点融合收益值,根据相邻节点融合收益值从大到小依次进行节点融合。具体操作为:对当前异构集群节点映射的SDF子图包含的actor集合,每个actor看为一个set,进行拓扑排序;对排序后的拓扑序列集合依次处理,对每个set遍历其上下邻接节点集合,判断相邻set融合收益,若收益为正则进行融合;对每次融合后的set集合构成的子图计算当前划分子图的负载与划分理论平均负载,调整当前划分移除负载大的set,直到该子图负载小于或等于理论平均负载。
[0058] (1.2.2)边界调整:考虑负载均衡并使得每个划分子图为凸子图。为了最大程度的降低各个粗化划分子图之间的通信开销,对每个划分子图进行边界调整,保证每个划分子图p都是一个凸子图(Converx Subgraph,CS),非凸子图(Non-Convetx Subgraph,NCS)会导致相邻子图之间高额的通信开销。对于CS定义如下:如果图p,满足结点一边结构为G(V,C),不存在任何一条从结点Vm到Vn且包含结点Vp的边,其中,Vm∈p,Vn∈p, 则图p称为凸子图。
[0059] (1.2.3)SDF划分子图与actor节点映射关系映射:如图5所示,该步骤相当于一个反融合操作,对每个划分子图进行逆向还原得到每个actor对应的划分编号。具体步骤为:经SDF子图actor节点映射及边界调整后,得到粗化图P0,P1,P2,每个粗化图内包含一个actor集合;同时考虑负载均衡和减少子图间的通信开销适当调整边界actor节点,然后进行逆向处理;得到每个actor与划分子图编号的映射关系。
[0060] (2)根据层次性二级任务划分与调度结果构造进行阶段赋值构造软件流水线步骤[0061] 该步骤主要针对步骤(1)的任务划分结果确定进程级和线程级划分的任务的流水线执行过程,使得程序执行延迟尽可能的小。为了使得数据流应用程序经并行化处理后正确执行,根据二级划分映射结果对每个actor设置阶段号确定执行顺序,构造软件流水线调度。阶段赋值算法步骤为:遍历集群节点根据一级任务划分结果获取映射到当前服务器节点的SDF子图;对SDF子图actor集合进行拓扑排序,根据服务器节点硬件结构选择对应的阶段赋值函数计算每个actor的执行阶段号。如图6所示,图6(a)描述了CPU多核服务器架构阶段赋值处理方式:对于指定的actor如果其父actor与其分配在相同服务器和相同CPU核,则当前actor阶段号与父actor相同;如果其父actor与其分配在相同服务器但是不同CPU核,则当前actor对其父actor的执行阶段有依赖关系,阶段号为父actor阶段号加1;如果父actor分配在不同服务器,此时涉及到集群节点间的异步流水,则当前actor阶段号设置为父actor阶段号加2。图6(b)描述了CPU/GPU混合架构服务器阶段赋值处理方式:在混合架构内为actor设置阶段号需要同时考虑是否与其父节点分配到相同服务器以及同时映射到CPU端或GPU端,若与父actor同时分配到一个服务器内的相同CPU核或同一个GPU,则当前actor阶段号与其父actor相同;若与父actor同时分配到一个服务器内的CPU端或GPU端,但是不在同一核或同一GPU上,则阶段号为父actot加1;若当前actor与父actor不在同一服务器上或者分别位于CPU端和GPU端,则需要再增加一个阶段号处理集群节点间的异步流水或混合架构服务器节点内CPU与GPU间的数据通信,当前actor阶段号为父actor加2。
[0062] (3)根据异构集群硬件架构,对集群节点间网络通信和节点内数据通信采用MPI/OpenCL混合编程模型构造多任务数据通信步骤
[0063] 面向CPU/GPU的异构集群平台是由传统CPU服务器与图形处理器GPU构成的架构,不仅需要考虑服务器节点之间的网络通信,还需要考虑将并行计算任务移植到GPU上执行同时完成节点内数据通信。基于以上需求,设计并实现一种MPI/OpenCL混合编程模型,如图7所示,对于系统内任务流之间采用基于生产者/消费者模式的消息传递机制控制数据通信,任务流内CPU上运行的逻辑处理主控程序模块和GPU上运行的大数据量kernel计算模块,通过构造共享缓冲区实现数据通信。
[0064] (3.1)节点间数据通信:数据流源程序对应的同步数据流任务图经过二级任务划分后,完成了将整个SDF图中所有actor任务单元到集群节点编号以及节点内CPU核与GPU的映射。每个集群节点划分到的部分actor任务单元对应一个SDF子图,内部actor通过共享存储实现数据通信,而边界actor通过消息传递机制完成。因此,节点间数据通信模块分为构造发送、接收缓冲区,SDF子图内actor间通信边构造两个步骤来完成。
[0065] (3.1.1)构造发送、接收缓冲区:异构集群节点间数据通信基于以消息传递机制为基础的MPI并行编程模型实现,MPI提供了一组可以直接调用的可靠的通信接口。结合数据流程序的特性,构造生产者、消费者通用类,。将发送、接收缓冲区封装起来,并选择利用MPI非阻塞消息传递机制使得计算与数据通信尽可能重叠执行,降低通信开销。
[0066] (3.1.2)对每个集群服务器节点映射的SDF子图内各个actor与其相邻actor之间构造通信边。遍历异构集群服务器节点得到每个节点对应SDF子图的actor集合;对当前任务单元curActor的所有出边连接的任务单元outActor进行分析,得到其划分到的集群节点划分编号;若被划分到同一台服务器节点则两者通过共享存储实现数据传输,否则curActor作为生产者角色,outActor作为消费者角色构造网络通信边实现数据传输。
[0067] (3.2)节点内CPU端逻辑任务与GPU端kernel计算的数据通信。数据流程序的多级任务划分,对SDF图中所有actor分析,根据每个actor的状态完成了各个任务单元向CPU端或GPU端的分配与映射。划分到CPU端的actor依然按照原始方式完成,划分到GPU端的actor将核心计算任务通过OpenCL的kernel来完成。因此,异构集群节点内的数据通信即是CPU端逻辑任务与GPU端kernel计算的数据通信。
[0068] 如图8所示,一种系统主存/显存问存储映射机制来实现集群节点任务流内CPU与GPU能够实现对数据的共享访问。存储空间p是为CPU和GPU提供的一个共享空间,由系统主存host和显存device相互映射而成,CPU逻辑任务可直接访问,GPU计算任务通过OpenCL提供的API间接访问
[0069] 本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。