运算任务的计算方法及超算系统
技术领域
本发明涉及一运算任务的计算方法。本发明还涉及一种超算系统。
背景技术
GPU模块(简称GPU)利用图形处理单元,运行应用程序的并行部分,从而达到比标准CPU模块(简称CPU)速度快很多倍的先进功能。因为GPU能提供给高性能计算程序更快的运行,如生物学,物理学,地震数据处理,金融和其他学科等领域的计算问题,GPU加速已经获得了在高性能计算数据中心的大量应用。
图形处理器通用计算技术GPGPU(General-purpose computing ongraphics processing units),是一种利用处理图形任务的图形处理器来计算原本由中央处理器处理的通用计算任务。这些通用计算常常与图形处理没有任何关系。由于现代图形处理器强大的并行处理能力和可编程流水线,令流处理器可以处理非图形数据。特别在面对单指令流多数据流(SIMD),且数据处理的运算量远大于数据调度和传输的需要时,通用图形处理器在性能上大大超越了传统的中央处理器应用程序。
HPCWire网站在2008年12月刊登了一篇关于开发者工具的文章《Heterogeneous Compilers Ready for Takeoff》,主要讲GPGPU平台上开发工具的第二次浪潮,代表是PGI和CAPS的工具,可以让C和Fortran程序员简单的利用GPU加速。
有很多并行化处理应用(比如视频处理,信号处理,石油勘探软件等),GPU+CPU的异构编程比CPU呈现更好的性能和可扩展性,但是GPU编程并不容易。比如NVIDIA Tesla M2090包含512个CUDA核心,如何让开发者更好的利用这么多处理器进行并行编程是个难题。NVIDIA设计了CUDA模型来简化GPU编程,提高生产力,但是开发者仍然要熟悉GPU硬件的线程模型以及底层设备的管理。OpenCL是苹果公司在2008年提出的用于在异构平台上进行并行编程的开放标准,NVIDIA和AMD公司的GPU产品都提供了符合OpenCL标准的API。但是这些编程接口仍然比较底层,目前一些新的语言对CUDA和OpenCL进行了高层抽象,以隐藏硬件底层细节。
为了让程序员能够更轻松地利用并行计算,英伟达、Cray、PortlandGroup(PGI)以及CAPS等企业2011年11月发布了一个全新的并行编程标准OpenACC。OpenACC最初由PGI、Cray以及英伟达共同开发并得到了CAPS的支持,它是一种全新的并行编程标准,旨在让科学和技术编程人员能够轻松利用CPU/GPU异构计算系统革命性的强大能力。OpenACC让并行编程人员能够向编译器提供简单的提示,这种提示被称作“指令”,其用途是识别需要加速的代码,同时不需要编程人员修改或改编底层代码本身。通过向编译器展示并行机制,指令让编译器能够将计算任务映射到加速器上、执行这方面的详细工作。OpenACC预计将让诸多领域中的各种程序员从中受益,其中包括化学、生物学、物理学、数据分析、天气与气候以及情报等领域。Cray、PGI以及CAPS现有的编译器预计将从2012年第一季度开始提供针对OpenACC标准的初始支持。OpenACC标准完全兼容英伟达(NVIDIA)CUDA并行编程架构并能够与之互操作,该架构让程序员能够控制加速器的各个细节,以便实现最大限度的性能调整。
2011年,在AMD Fusion开发者峰会上,微软拿出了自己的异构计算编程语言:“C++AMP(accelerated massive parallelism)”。C++AMP是微软Visual Studio和C++编程语言的新扩展包,用于辅助开发人员充分适应现在和未来的高度并行和异构计算环境。它使用C++语言的句法,将捆绑在下个版本的Visual Studio 11中发布。为了与OpenCL相抗衡,微软宣布C++AMP标准将是一种开放的规范,允许其它编译器集成和支持。这无疑是对OpenCL的最直接挑战。
在硬件方面,各厂商也已经在异构GPU平台取得一些成就。NVIDIA在2011正式发布了面向企业、个人工作站的新整体解决方案:Maximus。Maximus将成为继GeForce/Verde之后,NVIDIA Quadro和Tesla专业显卡/加速卡驱动及解决方案的统一名称。从硬件层面上来说,Maximus可采用任意Quadro专业显卡+Tesla系列加速卡组成,类似于笔记本电脑中Intel HD Graphics显卡与NVIDIA GeForce独显组成的Optimus解决方案。软件层面也与Optimus类似:Maximus也会在驱动中智能分配任务负载,能采用CUDA加速的代码全部分配给Tesla处理,其余OpenGL或DirectX代码仍由Quadro负责。当然,高端Quadro显卡在这两点上都可以轻松应对,但不能同时进行两项工作。目前已经有多种专业应用软件支持Maximus技术,包括Adobe Premiere Pro,Autodesk 3DS Max,Matlab等,用户可自由选择或交由驱动分配负载。
APU(Accelerated Processing Unit)中文名字叫加速处理器,是AMD融聚理念的产品,它第一次将处理器和独显核心做在一个晶片上,它同时具有高性能处理器和最新独立显卡的处理性能,支持DX11游戏和最新应用的“加速运算”,大幅提升电脑运行效率,实现了CPU与GPU真正的融合。2011年1月,AMD推出一款革命性的产品AMD APU,是AMD Fusion技术的首款产品。2011年6月面向主流市场的Llano APU正式发布。说到底,APU将通用运算x86架构CPU核心和可编程矢量处理引擎相融合,把CPU擅长的精密标量运算与传统上只有GPU才具备的大规模并行矢量运算结合起来。AMD APU设计综合了CPU和GPU的优势,为软件开发者带来前所未有的灵活性,能够任意采用最适合的方式开发新的应用。AMD APU通过一个高性能总线,在单个硅片上把一个可编程x86CPU和一个GPU的矢量处理架构连为一体,双方都能直接读取高速内存。AMD APU中还包含其他一些系统成分,比如内存控制器、I/O控制器、专用视频解码器、显示输出和总线接口等。AMD APU的魅力在于它们内含由标量和矢量硬件构成的全部处理能力。
此外,多核处理器中有一类混合架构处理器,即同一块芯片上集成了中央处理单元和图形处理单元,如英特尔的Sandy Bridge和AMD的Llano系列处理器。然而在这些混合处理器中,CPU核心和GPU核心都执行各自的功能,在运行程序时很少有协作,因此效率不高。
发明内容
本发明要解决的技术问题是提供一种CPU和GPU协作的方法,以达到快算运算的目的。
为解决上述技术问题,本发明的运算任务的计算方法,其由一超算系统来执行,所述超算系统包括多个网络连接的超算装置,所述每个超算装置包括多个CPU模块和多个GPU模块,所述超算系统的操作系统根据所述CPU的空闲情况确定运行运算任务的本地CPU模块,所述本地CPU模块将所述运算任务按照预设的规则分割成多个计算任务并分配到多个CPU模块中;所述每个CPU模块将所述每个计算任务按预设的规则进行本地分割,并分配到该CPU模块对应的本地多个GPU模块进行并行计算,后将所述本地多个GPU模块计算结果进行合并操作;最后,所述本地CPU模块再将所述每个CPU模块的计算结果进行合并操作,完成所述运算任务。
本发明还提供一种超算系统,其包括多个网络连接的超算装置,所述每个超算装置包括多个相互通讯的CPU模块和多个GPU模块,所述超算系统的操作系统根据所述CPU的空闲情况确定运行运算任务的本地CPU模块;所述每个CPU模块将所述每个计算认为按预设规则进行本地分割,并分配到该CPU模块对应的本地多个GPU模块进行并行计算,后将所述本地多个GPU模块的计算结果进行合并操作;最后,所述本地CPU模块再将所述每个CPU模块的计算结果进行合并操作,完成所述运算任务。
本发明的计算方法,通过每个CPU模块对欲计算任务进行本地分割并分配到本地多个GPU来并行计算,最后合并结果的方式,使多CPU和GPU共同完成同一运算任务,该架构可以充分利用GPU众核的并行处理能力,实现大数据量的快速并行计算。
附图说明
下面结合附图与具体实施方式对本发明作进一步详细的说明:
图1为本发明超算系统的示意图;
图2为本发明超算系统的编译运行流程图;
图3为本发明的MGM库的调用示意图;
图4为采用本发明的超算系统计算运行任务的一个实例。
具体实施方式
本发明提供一种CPU与GPU混合的超算系统,所述超算系统(图1)包括多个超算装置,这些超算装置之间通过网络组成一个集群,每个装置内是有多个CPU与多个GPU的主板,装置内CPU与GPU一般经北桥,通过AGP或者PCI-E总线连接,各自有独立的外部存储器,分别是内存和显存。任务分割是将一个任务按负载平衡的方式分配给各线程互相配合完成。CPU除了负责操作系统、系统软件和通用应用程序等通用处理任务外,还负责调度分割每个全系统的并行计算作业,以及负责调度分割每个本地(即任务运行所在的CPU)所对应的GPU并行计算作业;而GPU负责分配给自己的大规模数据的并行计算处理,多个GPU模块之间共享同一内存(即图1中所示的GPU存储器,统一虚拟寻址),CPU与GPU两者共同协同完成同一大规模并行计算应用。
超算装置之间可以通过网络互相通信,超算装置内的多CPU间通过总线通信并进行计算,超算装置内的多GPU间通过统一的共享内存交换数据并进行计算;由高速串行总线连接GPU与CPU,通过CPU的内存和GPU的共享内存交换计算数据,该架构可以充分利用GPU众核的并行处理能力,实现大数据量的快速并行计算。
其次,基于上述硬件上,本发明涉及一种GPU中并行数据处理的方法以及使用。具体来说,是个在超算装置负责管理的节点和超算装置负责计算的节点之间的框架。
本发明自主开发了一个MGM库,该MGM库能支持多GPU程序的调度和单GPU程序的直接执行,它分配任务到不同GPU加速设备上。本发明的编译运行流程见图2。MGM库的并行执行使用fork-join模型:任何运算任务以单进程的方式启动,直到发现一个并行区域,在这个时候,本地线程先按参数(即GPU模块个数,自定义的共同线程组名字)创建一个线程组,并成为线程组的父线程,之后线程组中除父线程外的每个线程继续执行(即对应的GPU开始并行执行程序),具体为:实现对应GPU的初始化上下文,为下面的计算做好初始化准备;GPU并行执行程序具体为:先分配需要的内存,用户自己的程序分割自己的数据,MGM把对应的数据传到对应的GPU中(此时完成了本地的作业分割),GPU再根据用户自己的程序开始对这些数据进行对应的计算;直到所有线程的并行区域结束,此时MGM按参数(即GPU模块个数,自定义的共同线程组名字,以及合并操作类型)做合并操作,具体实现为:把各个GPU算出的结果从GPU内存回传到主机内存,并根据合并操作类型,对结果进行合并,最后清除上下文和相关的GPU内存。在计算前,运算任务这个程序需要做少量修改,以适应MGM运行的需要,具体修改如下:
1.首先要有MGM相对于C实现的头文件mgm.h
2.定义程序中所需要的与MGM有关的变量,如记录某一个并行执行进程的标识和所有参加计算的进程的个数等。
3.MGM程序的开始和结束必须是MGM_Init和MGM_Finalize,2个要配对出现,分别完成MGM程序的初始化和结束工作。其中MGM_Init完成MGM程序的初始化,就是用已知的CUDA技术初始化GPU的上下文。
4.MGM程序的程序体包括各种MGM过程调用语句,和一般的C程序不同的是这些程序体中的执行语句是并行执行的,每一个进程都要执行。这部分的主要工作就是对欲在本地多GPU执行的计算本地分割。
在执行运算任务的过程中:
1.MGM包括一个自己开发的工具,该工具封装mpirun(为MPI自带的小工具)的提交作业方式(见图3),即在mpirun的其他参数基础上增加GPU个数参数(或从环境变量取得GPU个数);
2.在超算装置的运行平台上,用该自己的工具提交可执行程序至超算装置,并由用户自定义参加预算任务的CPU模块和GPU模块的个数;
3.按MPI的构架,本地CPU对于要进行并行计算的地方先按预设的规则进行分割,并分配多个计算节点,即分配到多个CPU上;
4.在每个CPU上,对于该CPU上预并行计算的任务,用MGM库再次进行本地分割,并进行预调度,分配到该CPU对应的本地多GPU上,再进行必要的初始化,即:对欲进行操作GPU的函数调用,分配可用的多机GPU,并创建多机GPU的上下文,以及可能的初始化工作;
5.GPU计算中,视需要,用MGM库函数进行同步等操作;
6.GPU计算后,视需要,用MGM库函数进行必要的合并操作;
7.运算完成后,卸载MGM库,及运行MGM_Finalize语句,并释放占用的GPU;
8.其他MPI相关操作;
9.直至运算任务完成,程序结束。
参见图4,以“1+2+3+…+10000”的运算任务为例说明本发明的计算方法,
步骤1:用户通过自定义窗口输入参与运算的CPU个数为2个和GPU个数为4个。操作系统按空闲状态确定本地CPU,本地CPU通过参数判断,决定调用CPU个数和每个CPU对应的GPU个数。
步骤2:利用现有的MPI工具,本地CPU将上述运算任务按照预设规则(可以是均分,也可以是其他任何适合的规则)分割成“1+2++…+5000”和“5001+5002+…+10000”两个计算任务,并分配到CPU0和CPU1执行。
步骤3:CPU0和CPU1在接到运算任务后,分别通过MGM库将计算任务按预设规则进行分割和分配。CPU0将计算任务分割成“1+2++…+5000”和“2501+2502++…+5000”,并分配给GPU0和GPU1;CPU1将计算任务分割成“5001+5002++…+7500”和“7501+7502++…+10000”,并分配给GPU2和GPU3。
步骤3:GPU0和GPU1在接到运算任务并初始化后,进行并行运算,并在运算结束后,输出运算结果到CPU0,由其进行合并操作,得到“1+2++…+5000”的计算结果。同样,GPU2和GPU3并行运算,并输出运算结果到CPU1,由其合并操作,得到“5001+5002+…+10000”的计算结果。
步骤4:最后将CPU0和CPU1的计算结果合并操作,得到“1+2+3+…+10000”的计算结果。卸载MGM库,并释放占用的CPU和GPU。