一种快速开发异构并行程序的方法

文档序号:6551264阅读:339来源:国知局
一种快速开发异构并行程序的方法
【专利摘要】本发明提供一种快速开发异构并行程序的方法,涉及CPU串行程序的性能分析和异构并行程序的移植:首先对CPU串行程序进行性能和算法分析,定位程序性能瓶颈和其可并行性;然后在原有代码的基础上插入OpenACC预编译指令,得到可在异构并行环境上执行的异构并行代码;将代码根据软硬件平台指定参数编译执行,根据程序运行结果确定是否需要进一步的优化。这种快速开发异构并行程序方法和现有的技术相比,其优势在于:1).无需重构现有代码;2).多语言支持,支持C/C++和FORTRAN等语言;3).跨平台和硬件,支持Linux、Windows和Mac等操作系统平台,支持英伟达、AMD的GPU、Intel?Xeon?Phi等硬件。本发明能够高效的对现有程序进行并行化,使程序充分利用异构系统的计算能力,实用性强,易于推广。
【专利说明】一种快速开发异构并行程序的方法
【技术领域】
[0001]本发明涉及计算机应用和高性能计算领域,具体地说是一种快速开发异构并行程序的方法。
【背景技术】
[0002]2006年,英伟达(NVIDIA)公司推出了可软件编程进行通用计算的图形处理器G80,该处理器包含128个流式微处理器。为了挖掘其图形处理器(GPU,Graphic ProcessingUnit)的计算潜力,英伟达公司于2008年5月推出了计算统一设备架构(CUDA, ComputeUnified Device Architecture)编程模型和适用于其产品线的软件工具开发包。自此GPU编程和其高性能逐渐被科研和市场所接受和重视,被广泛应用到计算流体力学、生物制药、金融、能源等许多领域。英伟达生产的专用于服务器上的Tesla协处理器已经被部署到许多计算集群或超级计算机上,包括中国制造的超级计算机天河I号。
[0003]2008年6月,苹果公司在苹果全球开发者大会(WWDC, Worldwide DevelopersConference)上提出了 OpenCL规范。OpenCL旨在提供一组通用的开发API,以便让编程人员能开发出GPU通用计算软件。不同于CUDA,使用OpenCL开发的软件可运行在任何支持OpenCL标准的图形处理器上,而不仅只是英伟达自家生产的图形处理器。
[0004]2010年,英特尔(Intel)公司向开发者推出了基于众核集成架构(MIC, ManyIntegrated Core Architecture)的处理器产品,并于2011年向市场推出了第一代MIC产品。2012年英特尔正式将这一加速器产品线命名为Intel Xeon Phi。在世界Top500中排名第一、由中国制造的超级计算机天河II号上,部署的加速器是Intel Xeon Phi。
[0005]2011年,英伟达,Cary,PGI和CAPS公司推出了适用于并行计算的编程标准OpenACC0 OpenACC类似于OpenMP,开发人员只需在需要并行的代码块中插入并行预编译即可,无需关注底层的实现细节。
[0006]相对于CUDA,OpenCL提供了统一的编程接口,用其开发的软件可适用于更多的硬件平台。而CUDA的优势在于更接近于硬件,能更好地发挥硬件的性能;其缺点则是可移植性差,目前CUDA程序几乎只能运行在英伟达公司生产的图形处理器上。而MIC与两者不同,需要按照英特尔公司提出的编程模型才能利用其计算能力。
[0007]对想获益于异构体系性能的开发者而言,CUDA、OpenCL和MIC的差异造成了选择上的困难:需要在开发前权衡程序的通用性和性能。如若全部学习和使用,则将加大学习的负担和开发的难度。
[0008]另一方面,无论是CUDA、OpenCL还是MIC,开发者均需要对现有的代码进行重构才能得到适用于CPU+Accelerator的异构环境的并行程序。对现有的代码进行重构可能会引入bug,同时开发人员需要投入相应的努力才能得到异构的并行程序。
[0009]面对不断发展的硬件和性能不断提升的异构并行系统,需要与之相对应的软件才能发挥出其真正潜力。为了实现采用异构并行程序计算的需求,亟需一种快速有效的异构并行程序开发方法。
【发明内容】

[0010]为了解决上述技术问题,本发明提出了一种快速开发异构并行程序的方法。该方法的技术任务是解决现有技术的不足,为异构架构编程人员提供一种快速开发异构并行程序和性能优化的方法。
[0011]本发明的技术方案实施过程如下:
[0012]步骤一:串行CPU程序分析,分析工作和方案包括:
[0013]I)使用第三方性能测试工具获取程序运行的数据;
[0014]2)使用打印时间方式测试程序中的性能瓶颈;
[0015]3)根据算法和数据结构特点分析代码块是否可并行;
[0016]步骤二:对可并行的关键函数或者模块插入OpenACC指令进行异构并行化,其中:
[0017]I)对程序整体性能影响很小的代码块无需并行化;
[0018]2)大部分的时间耗时都是因为循环迭代造成,可以使用#pragma acc parallelloop语句将循环迭代并行化;
[0019]3)使用#pragma acc data、#pragma acc update等指令显式指定数据复制、更新,以保证数据在主机和加速器上的一致性和有效性;
[0020]步骤三:完成了基于OpenACC指令的程序异构并行化之后,使用支持OpenACC的编译器针对不同硬件平台编译代码。在编译过程中:
[0021 ] I)编译器需支持或兼容所采用的OpenACC指令的版本和标准;
[0022]2)对不支持OpenACC标准的编译器,设置其忽视所插入的OpenACC预编译指令,即可得到与修改前一样的串行CPU程序;
[0023]3)根据程序运行的软硬件指定编译参数,得到适用于指定软硬件平台的可执行程序。通常软件平台指Windows、Linux或Mac等操作系统,硬件平台包括英伟达公司的图形处理器、AMD公司的Radeon图形处理器或者Intel MIC协处理器等。
[0024]步骤四:在异构硬件平台上运行并行程序,测试其性能。性能测试数据包括并行版本的加速比、各代码块的耗时等数据。
[0025]步骤五:分析收集的异构并行程序运行的数据信息,如果未达到预定的性能要求,可对其进行进一步优化。其中优化手段包括:
[0026]I)插入更多的并行指令以更为细致的方式引导编译器进行进一步优化;
[0027]2)并行在串行测试中不是很关键的代码块或者函数。并行化后的程序可能会让之前不是性能瓶颈的模块成为新的性能热点,将其并行化能够进一步减少并行程序耗时;
[0028]3)采用异步通信方式掩盖数据传输带来的延迟;
[0029]4)预先分配数据空间,减少因为处理器每次执行并行代码带来的分配空间和初始化开销;
[0030]步骤六:重复上述开发和优化流程,直到不能再进一步优化或者达到目标要求。
[0031]本发明与现有技术手段相比所产生的有益效果是:
[0032]1.本发明可以在不修改原有串行代码的基础上快速有效的得到适用于多软件平台、多硬件平台的异构并行程序代码;
[0033]2.本发明提供的方法可以帮助开发人员快速开发和迭代得到适用于异构并行计算环境的高性能并行程序;
[0034]3.本发明提供的快速开发并行程序算法具有天然的可移植性,可以让程序代码变得更为通用;
[0035]4.本发明缩短了异构并行程序开发的周期,减少了 bug调试时间,减轻了程序开发人员的负担和难度;
[0036]5.本发明提供的方法按照逐步修改,快速迭代的原则,简洁高效;
[0037]6.本发明提供的一种快速开发异构并行程序的方法实用性强,易于推广。
【专利附图】

【附图说明】
[0038]图1是本发明的异构程序开发流程图;
[0039]图2为一种异构并行程序的运行模型图;
[0040]图3为使用OpenACC指令的异构并行代码示例图。
【具体实施方式】
[0041]下面将结合本发明实施例中的附图,对本发明实施例中的方法进行清楚、完整的描述。所描述的实施例仅仅是本发明的一部分实施例,而不是全部。基于本发明中的实施例,本领域技术人员在没有做出创造性工作前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0042]如附图1所示,本发明提供的一种快速开发异构并行程序的方法首先对串行CPU程序进行性能分析和热点测试,然后在现有的代码基础上插入OpenACC预编译指令将程序进行异构并行化;使用支持OpenACC标准的编译器针对运行的软硬件平台编译异构并行化的程序代码,得到可执行程序;在异构计算系统上运行并行程序,采集程序运行信息数据;根据数据信息,结合性能和开发需求确定是否对程序进行进一步的性能优化。本发明充分利用了 OpenACC技术的跨平台和开发便捷性,能够快速高效地开发出适用于不同异构体系的异构并行计算程序。
[0043]一种快速开发异构并行计算程序的方法的具体操作过程为:
[0044]1、对CPU串行程序进行分析:
[0045]A)根据测试找到串行程序的性能热点和相关算法和代码段;
[0046]B)分析性能瓶颈代码段的可并行性和并行粒度;
[0047]C)分析串行程序的算法特点,确定其在加速器上的工作模式;
[0048]D)分析串行程序的数据结构存储方式,确定数据在主机和加速器上更新和复制的方式。
[0049]2、在程序中插入OpenACC预编译指令:
[0050]A)在主机和加速器上的数据操作可使用#pragma acc data指令标识数据在主机和加速器之间的初始化、复制、更新等操作;
[0051]B)程序的耗时一般在大密度的迭代计算上,对于不依赖与上一次结果的迭代代码段,可使用#pragma acc parallel loop指令让其转移到加速器上执行;
[0052]C)主机和加速器上的数据同步可使用#pragma acc update指令来完成;
[0053]D)附图3是插入OpenACC指令的代码段示例,串行代码在CPU上运行,而循环则移到了适合于高密度计算的GPU上执行。
[0054]3、使用支持OpenACC标准的编译器编译代码:
[0055]A)编译在不同操作系统上执行的代码可能需要使用运行在相应操作系统的编译器来编译,例如使用Windows版本的PGI Accelerator编译器编译运行在Windows系统上的程序;运行在Linux系统上的程序则使用Linux版本的编译器;
[0056]B)编译的时候可能需要指定硬件架构,例如PGI AcceIerator编译器编译的OpenACC程序默认是运行在英伟达的GPU上,如果程序需要运行在AMD公司的Radeon图形处理器上需要指定_ta = radeon参数。
[0057]4、在异构计算系统上运行并行程序,附图2是一个异构并行程序运行的时间线抽象模型;
[0058]5、根据程序运行信息,决定是否需要对程序进行进一步优化。如果性能已经达到目标,则将现有程序作为最终版发布;如果性能未达到要求,可在以下方面进行进一步优化:
[0059]A)插入更多的并行指令以更为细粒度的方式引导编译器执行深层优化;
[0060]B)若有新的程序性能瓶颈出现,分析其算法的并行性和并行粒度;如果可并行化,则在相应的代码段插入OpenACC预编译指令进行并行化;
[0061]C)主机和加速器之间的数据复制在保证正确性的情形下使用异步复制方式;
[0062]D)预先分配数据空间,减少空间分配和初始化带来的程序性能开销;
[0063]6、根据以上流程对程序进行快速开发和性能优化迭代,直到满足要求为止。
[0064]由本发明的技术方案可见,本发明充分利用OpenACC技术,结合异构并行程序开发的需求,给出了一种快速开发异构并行程序的方法。该方法学习成本低,执行效率高,在开发过程中能够做到快速开发。
[0065]以上所述仅为本发明的实施例,凡在本发明及所附权利要求的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种快速开发异构并行程序的方法,其特征在于,所述方法具体包括以下步骤: 步骤一:进行CPU串行程序性能分析,包括测试当前串行程序的性能瓶颈、分析算法或代码块的可并行性等; 步骤二:针对性能热点和可并行化代码块,插入OpenACC指令对其进行异构并行化;根据算法特点和数据特点使用合适的指令将密集计算部分转移到加速器上执行; 步骤三:针对程序执行的软硬件平台,使用支持OpenACC的编译器对异构并行代码进行编译,得到可执行文件; 步骤四:在异构环境上执行并行化的程序,收集性能数据; 步骤五:根据性能数据,确定是否需要进行进一步优化;如果需要再次优化,优化手段包括优化数据结构、优化通信交互方式等。
2.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述步骤一的详细过程为:性能瓶颈分析指根据运行时间确定耗时占比大的算法或者函数代码块,作为后续并行化的重点关注对象;算法或代码块的可并行性分析指根据算法的数据结构特点,算法的具体执行方式来确定其是否能够并行,以及并行的粒度。
3.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述步骤二的详细过程 为:根据步骤一的性能分析,对可并行化的热点代码块或者算法插入OpenACC预编译指令对其进行并行化;根据代码的特征采用合适的数据分配和主机与加速器之间的通信模式。
4.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述步骤三中,对代码的编译需要采用支持OpenACC标准的编译器来编译。支持OpenACC的编译器可根据用户指定的硬件平台编译得到相应的可执行程序。本发明提出的方法将与操作系统平台和硬件相关的底层工作交给编译器,开发者只需要关注高层接口和特性。开发人员使用高级语言即可得到一次编写,处处可运行的代码,解决了跨平台和移植性的问题。
5.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述步骤四中,并行异构性能测试可通过第三方性能测试工具或者在程序中打印耗时得到。记录的数据反应了并行后程序的运行状况,将用作是否需要进一步优化的依据。
6.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述步骤五中,进一步优化方法包括以下方面: A)插入更细粒度的OpenACC控制指令,引导编译器进行进一步优化; B)优化主机和加速器上的数据存取方式,减少数据延迟; C)考虑采用异步通信机制,叠加数据复制和计算,掩盖通信延迟; D)对新的程序性能热点进行并行化。
7.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述方法无需对现有代码进行重构,减少编程工作量;开发人员只需根据需求将预编译指令插入到现有的代码中即可快速得到并行版本的程序代码;对于不支持OpenACC指令的编译器,将忽视这些指令而编译得带常规的串行程序。
8.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述方法使代码具有跨平台和与硬件无关的特性。开发人员使用高层次的编程指令对并行算法进行描述,具体的并行实现以及底层硬件的适配工作交给编译器完成。由于程序编码与具体的软件平台和硬件细节相剥离,代码只需一次编写,便可在各种操作系统和支持异构计算的硬件平台上编译执行。本发明减少了程序员的开发负担,加快了异构并行程序的开发速度。
9.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述方法具有快速开发和迭代性质。使用该方法的程序员可首先在关键模块将其并行,得到初始版本的并行程序。对并行程序进行性能测试之后。可再次重复整个流程对程序进行更细致的优化,直到达到性能要求。
10.根据权利要求1所述的一种快速开发异构并行程序的方法,其特征在于:所述方法能够充分利用异构并行计算机的计算资源。通过对现有串行代码添加OpenACC并行指令,根据软件和硬件平台编译即可得到适用于该软硬件的异构并行代码。异构化的并行程序能有效的利用计算机的 资源,发挥其最大性能。
【文档编号】G06F9/44GK104035781SQ201410300760
【公开日】2014年9月10日 申请日期:2014年6月27日 优先权日:2014年6月27日
【发明者】刘铁刚, 何晓峰, 赵越 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1