一种基于Whippletree模型的GPU动态任务分配方法与流程

文档序号:11133736阅读:740来源:国知局
一种基于Whippletree模型的GPU动态任务分配方法与制造工艺

本发明涉及一种GPU调度方法,尤其是涉及一种基于Whippletree模型的GPU动态任务分配方法。



背景技术:

随着信息时代的发展,计算机处理器处理的信息量日渐增大,其数据处理能力要求越来越高,传统的微处理器体系结构已经逐渐无法有效地适应大信息量的高效处理,从传统的指令级并行发展到线程级并行,成为提高处理器性能的一个趋势。

大规模并行的SIMD(Single Instruction Multiple Data,单指令多数据流)计算机体系结构最近成为众多研究的热点,GPU作为协处理器近年来在高性能计算、图像处理等领域得到广泛应用,然而GPU上的调度模型对于均衡的作业有比较理想的性能,却在动态作业调度的开发上进展有限。调度在系统设计上是一个重要的课题。CPU上的调度模型比较成熟,但GPU的体系架构与CPU的体系架构在几个基础的特性上有所差异,因此,将CPU上的成熟调度模型直接简单地移植到GPU上不可行的,主要原因包括分支复杂和数据结构分层等,无法直接使用。

尽管许多研究人员已经开始关注动态任务分配,但是数据局部性却未受到足够的重视,至今没有针对数据的研究来有效地支持不同类型的并行。



技术实现要素:

本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种提高GPU利用率的基于Whippletree模型的GPU动态任务分配方法。

本发明的目的可以通过以下技术方案来实现:

一种基于Whippletree模型的GPU动态任务分配方法,包括以下步骤:

1)构建Whippletree模型,包括数据元素单元、代码单元、任务单元和代码集合单元;

2)测试所述Whippletree模型的正确性和性能;

3)以经过测试的Whippletree模型进行GPU动态任务分配。

所述Whippletree模型为面向CUDA层面建立。

所述数据元素单元存储有执行过程中要处理的数据元素;

所述代码单元存储有用于处理所述数据元素的代码,并限定了处理单个所述数据元素需要的线程数;

所述任务单元中存储有根据需要处理的数据元素与相应代码生成的任务,所述任务具有不同等级。

所述Whippletree模型执行的内核函数由持续从队列中读取任务的工作块构成,每一所述代码分配有一个队列。

所述队列具有多种类型的入列和出列策略。

对于包含多线程的代码,所述Whippletree模型在执行新的内核函数前进行线程的同步。

所述不同等级的任务使用不同特性的GPU架构,不同等级的任务放入不同的队列中。

所述步骤2)的测试包括正确性测试和矩阵乘法测试;

所述正确性测试具体为:对不同层次的任务进行测试,根据GPU上线程的分配结果测试Whippletree模型的正确性;

所述矩阵乘法测试具体为:通过不同尺寸的矩阵乘法进行测试,分析Whippletree模型的性能。

与现有技术相比,本发明具有以下优点:

1)本发明实现动态任务的GPU调度,通过对任务分级,使得并行块更加稀疏分散,在程序负载不均衡时仍可以获得较高的GPU利用效率。

2)本发明的Whippletree模型通过细粒度的资源调度和开发稀疏分散的并行,根据任务和数据的切分,将整个程序合理地分配给GPU上的线程,从而提高GPU的利用效率。

3)本发明通过小的工作块来进行有效的填充,使得处理器单元的负载连贯。

4)本发明Whippletree模型支持多指令流多数据流(MIMD),任务可以动态地创建而且调度考虑到了数据局部性。

5)本发明可对线程进行同步,队列在每个点不使用额外的锁,可以提高队列的执行效率。

附图说明

图1为本发明的流程示意图。

具体实施方式

下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。

如图1所示,本实施例提供一种基于Whippletree模型的GPU动态任务分配方法,包括以下步骤:

1)构建Whippletree模型。Whippletree模型为基于CUDA层面的任务分配模型。CUDA编程模型将CPU作为主机,GPU作为协处理器或者设备。在一个系统中可以存在一个主机和若干个设备。CPU、GPU各自拥有相互独立的存储地址空间:主机端内存和设备端显存。CUDA对内存的操作与一般的C程序基本相同,但是增加了一种新的pinned memory;操作显存则需要调用CUDA API存储器管理函数。一旦确定了程序中的并行部分,就可以考虑把这部分计算工作交给GPU。运行在GPU上的CUDA并行计算函数称为内核函数。一个完整的CUDA程序是由一系列的设备端kernel函数并行步骤和主机端的串行处理步骤共同组成的。这些处理步骤会按照程序中相应语句的顺序依次执行,满足顺序一致性。CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。CUDATM是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDATM架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序可以在支持CUDATM的处理器上以超高性能运行。

在Whippletree中使用动态并行策略,即允许代码直接调用GPU上的内核,以前的动态并行策略要求跟踪内核的层次,这限制了程序的性能;此外,为了避免阻塞GPU,必须支持线程块的调度;最后,数据间要通过缓慢的全局内存进行通信。

建立的Whippletree模型包括数据元素单元、代码单元、任务单元和代码集合单元。数据元素单元work items存储有执行过程中要处理的数据元素;代码单元procedures存储有用于处理数据元素的代码,每个procedure声明其在处理单个数据元素所需要的线程数;任务单元tasks中存储有根据需要处理的数据元素与相应代码生成的任务,任务具有不同等级。代码集合单元programs指的是procedures组成的集合,内部的procedure可以相互之间创建任务。

Whippletree模型根据数据局部性和程序的特点对任务进行分级,不同等级的任务使用不同特性的GPU架构,不同等级的任务放入不同的队列中。level-0的任务可以使用束等级的特性,在同一个SIMD组中执行;level-1的任务可以使用块等级的特性,在同一个流处理器中执行;而level-2的任务只能使用GPU全局的特性。不同等级的任务放入不同的队列中,再通过GPU的工作块从队列中读取任务。

Whippletree模型执行的内核函数由持续从队列中读取任务的工作块构成,每一代码分配有一个队列。我们为每个procedure分配一个队列,使得不同的任务类型能够以不同的方式执行,在执行过程中可以创建任意类型的新任务。

Whippletree模型的队列管理:为适应具有不同特性的程序,本发明通过模板库为Whippletree模型添加不同类型的入列和出列策略,可以根据应用的特征选择不同的策略,从而提高模型的适用性。

因为访问全局内存的代码较高,共享内存队列对于提高程序的性能至关重要,然而共享内存有限,而且可能在任务执行过程中使用,因此共享内存队列相对较少,在决定工作块的大小后,可以用剩余的共享内存来完成本地的队列管理任务。

Whippletree模型的线程同步:在程序包含多阶段的procedure时,我们需要在开始执行新的内核函数之前进行线程的同步。由于队列不支持同时的入列和出列操作,因此队列在每个点不使用额外的锁,可以提高队列的执行效率。

2)测试Whippletree模型的正确性和性能,具体为:

通过对不同层次的任务进行测试,根据GPU上线程的分配结果测试模型的正确性。我们选择十个level-2任务和四十个level-0任务进行测试,根据测试结果可知每个level-2任务由单个线程执行,而每个level-0任务由单个线程束执行,与Whippletree模型设计思想相符。

通过不同尺寸的矩阵乘法进行测试,比较Whippletree模型与cuda的内置函数(cuda_matmul)的性能并分析结果。本实施例分别选择尺寸为3200,6400,9600的矩阵进行测试。

通过不同尺寸的矩阵乘法进行测试,比较Whippletree模型与另一个基于动态作业调度的GPU模型的性能并分析结果。在与cuda内置函数比较后,本实施例分别选择尺寸为3200,6400,9600的矩阵进行下一步测试。

测试服务器的主要参数为:中央处理器Processor E5-2695 v3@2.30GHz,内存12GB,GPU Tesla K40,CUDA核心数目为2880。

结果显示,对于不同等级的任务,线程的分配情况与我们预期一致,证明了Whippletree模型的正确性;通过与cuda的内置函数(cuda_matmul)比较,发现Whippletree模型的性能要优于cuda的内置函数,加速比为1.084x;通过与另一个基于动态作业调度的GPU模型比较,发现Whippletree模型的性能要更优,加速比为3.743x。这一实验表明,本发明方法构建的Whippletree模型对于GPU上的作业调度有着优异的性能和适用性。

3)以经过测试的Whippletree模型进行GPU动态任务分配。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1