CN109725903A - 程序代码变换处理方法、装置及编译系统 - Google Patents

程序代码变换处理方法、装置及编译系统 Download PDF

Info

Publication number
CN109725903A
CN109725903A CN201711031826.4A CN201711031826A CN109725903A CN 109725903 A CN109725903 A CN 109725903A CN 201711031826 A CN201711031826 A CN 201711031826A CN 109725903 A CN109725903 A CN 109725903A
Authority
CN
China
Prior art keywords
code
control flow
public
flow branching
time
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201711031826.4A
Other languages
English (en)
Inventor
卢兴敬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Original Assignee
Huawei Technologies Co Ltd
Institute of Computing Technology of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd, Institute of Computing Technology of CAS filed Critical Huawei Technologies Co Ltd
Priority to CN201711031826.4A priority Critical patent/CN109725903A/zh
Publication of CN109725903A publication Critical patent/CN109725903A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请提供一种程序代码变换处理方法、装置及编译系统,该方法包括:获取待编译的应用程序代码;确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;若所述应用程序代码为可变换代码,则根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。该方法结合应用程序代码的具体情况对应用程序代码进行变换,因此能够满足各种场景下的既能消除控制流造成的性能下降又不会引入过多的优化开销的要求。

Description

程序代码变换处理方法、装置及编译系统
技术领域
本申请涉及计算机领域,尤其涉及一种程序代码变换处理方法、装置及编译系统。
背景技术
随着以图形处理器(Graphics Processing Unit,GPU)技术为基础搭建的计算平台的应用领域变得越来越广泛,更多的程序开发人员需要在GPU平台上进行软件开发。在GPU平台上进行软件开发,需要遵循的GPU平台的体系结构特征。目前的GPU平台主要采用单指令多线程(Single Instruction Multi Thread,SIMT)体系结构。在SIMT体系结构中,线程通常按照网格(Grid)、线程块(Block)和Warp来组织。其中,Grid包含多个Block,每个Block又包含多个Warp,每个Warp包含多个线程并且是GPU上的最小调度单元,一般单个Warp内有32个线程。Warp内的线程遵循SIMT调度模式,即该Warp内的所有线程执行相同的指令序列。Warp内分为多组线程,当Warp执行分支程序时,Warp内的每组线程执行单个分支,而由于Warp内线程是单指令流,因此Warp执行分支程序的总时间为每组线程执行各自分支的时间之和,即Warp执行分支程序的总时间较长,从而影响程序的执行性能。
现有技术中,可以使用分支内核方法,为每个分支建立独立的内核(Kernel),以使得每个Warp仅执行单个分支。或者可以使用冗余线程方法,静态控制线程与任务间的映射,使得每个warp内的线程只会执行单个分支。
但是,现有技术的方法并不能满足既能消除控制流造成的性能下降又不会引入过多的优化开销的要求。
发明内容
本申请提供一种程序代码变换处理方法、装置及编译系统,用于解决现有技术中不能满足既能消除控制流造成的性能下降又不会引入过多的优化开销的要求的问题。
本申请第一方面提供一种程序代码变换处理方法,该方法包括:
获取待编译的应用程序代码;
确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;
若所述应用程序代码为可变换代码,则根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
该方法中,在确定出应用程序代码的代码特征之后,根据应用程序代码中的公共计算代码、公共访存代码以及实际所应用的硬件平台参数信息对应用程序代码进行变换处理,即本实施例结合应用程序代码的具体情况对应用程序代码进行变换,因此能够满足各种场景下的既能消除控制流造成的性能下降又不会引入过多的优化开销的要求。
进一步地,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码,包括:
根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略;
使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码;
其中,所述变换策略为分支缩减策略、分支内核策略或冗余线程策略。
进一步地,所述变换策略为分支缩减策略;所述使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码,包括:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;
将所述控制流分支代码中的访存代码组合为向量访存代码。
该方法中,通过将公共计算以及公共访存外提,不再需要在每个分支下都执行相同的代码,从而减少执行开销,提升代码性能。同时,通过形成向量化访存,可以进一步减少访存次数并提高带宽的利用率。
进一步地,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略,包括:
根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间;
根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益;
根据所述执行收益,确定所述应用程序代码对应的变换策略。
进一步地,所述根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益,包括:
使用公式TimeRealCondBrS=TimeRealTotal–Time(HoistMemAcc)*(NumBrMemAcc-1)–Time(HoistCompute)*(NumBrCompute-1)–Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1)、TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute)以及TimeBenefit=TimeRealTotal-TimeRealCondBrS确定所述分支缩减策略下所述应用程序代码的控制流分支的执行收益;
其中,TimeRealTotal为所述源程序执行时间,HoistMemAcc为外提到控制流分支外的所述公共访存的操作,HoistCompute为外提到控制流分支外的所述公共计算代码对应的操作,NumBr为包含所述公共访存的操作或者所述公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
进一步地,所述根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间,包括:
使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算所述应用程序代码的控制流分支的源程序执行时间;
将所述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为所述应用程序代码的控制流分支的源程序执行时间;
其中,Time(Compute)为根据所述硬件平台参数信息所计算出的所述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据所述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
进一步地,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略之前,还包括:
通过硬件平台配置信息以及运行数据分析profiling获取所述硬件平台参数信息;
其中,所述硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
进一步地,所述确定所述应用程序代码的代码特征,包括:
判断所述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个线程束Warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定所述应用程序代码为可变换代码。
本申请第二方面提供一种程序代码变换处理装置,该装置包括:
第一获取模块,用于获取待编译的应用程序代码;
确定模块,用于确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;
变换模块,用于在所述应用程序代码为可变换代码时,根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
进一步地,所述变换模块包括:
确定单元,用于根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略;
变换单元,用于使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码;
其中,所述变换策略为分支缩减策略、分支内核策略或冗余线程策略。
进一步地,所述变换策略为分支缩减策略;所述变换单元具体用于:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;以及,
将所述控制流分支代码中的访存代码组合为向量访存代码。
进一步地,所述变换策略为分支缩减策略;所述变换单元具体用于:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;以及,
将所述控制流分支代码中的访存代码组合为向量访存代码。
进一步地,所述确定单元具体还用于:
使用公式TimeRealCondBrS=TimeRealTotal–Time(HoistMemAcc)*(NumBrMemAcc-1)–Time(HoistCompute)*(NumBrCompute-1)–Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1)、TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute)以及TimeBenefit=TimeRealTotal-TimeRealCondBrS确定所述分支缩减策略下所述应用程序代码的控制流分支的执行收益;
其中,TimeRealTotal为所述源程序执行时间,HoistMemAcc为外提到控制流分支外的所述公共访存的操作,HoistCompute为外提到控制流分支外的所述公共计算代码对应的操作,NumBr为包含所述公共访存的操作或者所述公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
进一步地,所述确定单元具体还用于:
使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算所述应用程序代码的控制流分支的源程序执行时间;
将所述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为所述应用程序代码的控制流分支的源程序执行时间;
其中,Time(Compute)为根据所述硬件平台参数信息所计算出的所述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据所述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
进一步地,所述装置还包括:
第二获取模块,用于通过硬件平台配置信息以及运行数据分析profiling获取所述硬件平台参数信息;
其中,所述硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
进一步地,所述确定模块具体用于:
判断所述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个线程束Warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定所述应用程序代码为可变换代码。
本申请第三方面提供一种编译系统,该系统包括前述第二方面所述的程序代码变换处理装置。
附图说明
图1为存在分支的函数执行示例图;
图2为本申请所提供的程序代码变换处理方法的应用场景示意图;
图3为本申请提供的程序代码变换处理方法实施例一的流程示意图;
图4为本申请提供的程序代码变换处理方法实施例二的流程示意图;
图5为本申请提供的程序代码变换处理装置实施例一的模块结构图;
图6为本申请提供的程序代码变换处理装置实施例二的模块结构图;
图7为本申请提供的程序代码变换处理装置实施例三的模块结构图。
具体实施方式
在SIMT体系结构中,线程通常按照网格(Grid)、线程块(Block)和线程束(Warp)来组织。其中,Grid包含多个Block,每个Block又包含多个Warp,每个Warp包含多个线程并且是GPU上的最小调度单元,一般单个Warp内有32个线程。Warp内的线程遵循SIMT调度模式,即该Warp内的所有线程执行相同的指令序列。
Warp内分为多组线程,当Warp执行分支程序时,Warp内的每组线程执行单个分支,而由于Warp内线程是单指令流,因此Warp执行分支程序的总时间为每组线程执行各自分支的时间之和,即Warp执行分支程序的总时间较长,从而影响程序的执行性能。
以下以一个示例进行说明。
图1为存在分支的函数执行示例图,如图1中的(a)所示,在热点函数fun中,存在三条控制流分支,当该热点函数被分配给图1中的(b)所示的warp执行时,假设warp内分有三组线程能够满足不同的控制流条件分支,且其任务到线程的映射如图1中的(b)所示,则该图显示了该Warp内线程的实际执行过程。从该过程中可以看到,虽然每组线程都只执行单个分支,但由于Warp内线程是单指令流,所以当线程组t[0:7]在执行cond1Compute分支时,另外两个线程组也只能在空转中等待;同理,当线程组t[8:16]在执行cond2Compute分支时,另外两个线程组也只能空转,最后当所有的分支都被执行完时,三个线程组同时执行otherCompute。则该Warp完成函数热点fun的时间如下述公式(1)所示:
Tall=Tif+Telseif+Telse+Tother (1)
由上述示例可以看出,Warp执行分支程序的总时间为每组线程执行各自分支的时间之和,即Warp执行分支程序的总时间较长,从而影响程序的执行性能。
针对上述问题,现有技术中提出了分支内核方法以及冗余线程方法。其中,分支内核方法为每个分支建立独立的Kernel,以使得每个Warp仅执行单个分支。但是,该方法在分支较多时会建立较多的Kernel,因此会增加Kernel的管理开销,并且会增加访存机会。冗余线程方法静态控制线程与任务间的映射,使得每个Warp内的线程只会执行单个分支,从而避免执行多个条件分支引入的计算开销,并且在静态时实现,也不会引入运行时开销。但是,该方法仅适用于需要静态确定每个任务可能满足的分支集合的场景,并且需要建立条件分支与任务编号之间的联系,对适用的条件分支具有限制,因此该方法不能满足所有存在分支的应用场景。
因此,现有技术的方法并不能满足所有场景下的既能消除控制流造成的性能下降又不会引入过多的优化开销的要求。
本申请涉及的技术方案,旨在解决上述问题。
图2为本申请所提供的程序代码变换处理方法的应用场景示意图,如图2所示,本申请的方案主要应用于自动完成程序代码在GPU上的跨控制流分支代码的变换。
在该场景中,用户输入的应用程序可以属于图像处理算法、人工智能算法和无线5G算法等,在这些算法的核心计算中通常存在分支来控制算法对边界数据的处理,对这些含有分支的热点计算的优化对程序性能有较大的影响。
如图2所示,在已经生成的中间表示上,在现有的性能优化过程中增加一个新的优化过程,即本申请所涉及的技术方案,该新的优化过程能够自动完成程序特征分析、潜在优化方案生成、最终优化方案确定、代码优化变换及最终的代码生成。即,本申请所涉及的技术方案,应用在应用程序代码的编译过程中。
该新的优化过程最终生成可以运行不同SIMT体系结构的硬件平台上,例如可以是开放运算语言(Open Computing Language,OpenCL)程序、统一计算架构(Compute UnifiedDevice Architecture,CUDA)程序等,再经过目标平台上编译器的分析变换,生成可执行程序;也可以是二进制文件,能够直接运行在目标平台上。
如图2所示,该新的优化过程最终生成可以运行的硬件平台可以是专用集成电路(Application Specific Integrated Circuit,ASIC)、中央处理器(Central ProcessingUnit,CPU)、因特尔Phi(Intel Phi)、现场可编程门阵列(Field-Programmable GateArray,FPGA)、NVIDIA GPU以及AMD GPU等。
图3为本申请提供的程序代码变换处理方法实施例一的流程示意图,如图3所示,该方法包括:
S301、获取待编译的应用程序代码。
如上述图2所示,在已经生成的中间表示上,在现有的性能优化过程中增加一个新的优化过程,即本申请所涉及的技术方案。其中,中间表示是一种语言格式,该中间表示是平台无关以及语言无关的。
在本申请所涉及的技术方案被执行之前,应用程序代码已经从高级语言被翻译为中间表示语言格式,并且,在此过程中,编译器会在中间表示层标注程序的上层语义信息,这些上层语义能够帮助后续的程序特征分析。
因此,本步骤中,所获取的待编译的应用程序代码是指通过中间表示语言格式来表示的程序代码,进而基于该中间表示语言格式所表示的程序代码来执行后续的处理。
S302、确定上述应用程序代码的代码特征。
其中,上述代码特征包括上述应用程序代码是否为可变换代码、上述应用程序代码的控制流分支中的公共计算代码以及上述应用程序代码的控制流分支中的公共访存代码。
首先对本申请下述实施例涉及的相关术语解释如下:
(1)、伪控制流:在一个特定的热点函数内,对于其中的一组控制流分支代码{if,elseif_0,elseif_1,…,elseif_N,else},如果至少有两个控制流的条件分支会被同一个warp内的至少两个线程满足,且分别满足不同控制流条件分支的线程中,至少有两个是不同的,则称该部分代码为Warp的伪控制流。
(2)、伪控制流分支组:在伪控制流内称被满足的控制流分支集合伪控制流分支组。
(3)、伪控制流分支:伪控制流分支组的任意一个控制流分支被称为伪控制流分支。
示例性地,上述图1所示的热点函数fun中,从if开始到else结束的一段分支为一个伪控制流分支。
(4)、伪控制流线程:满足伪控制流分支组内任意控制流条件分支的线程被称为伪控制流线程。
(5)、伪控制流线程组:满足某个伪控制流分支的线程集合被称为该伪控制流分支的伪控制流线程组。
其中,判断上述应用程序代码是否为可变换代码需要判断上述应用程序代码中是否存在伪控制流。
具体地,判断上述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个Warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定上述应用程序代码为可变换代码。
除此之外,本步骤中,还需要确定上述应用程序代码的控制流分支中的公共计算代码以及上述应用程序代码的控制流分支中的公共访存代码。
其中,控制流分支中的公共计算代码是指控制流分支中各条件分支下都存在的相同的计算代码,控制流分支中的公共访存代码是指控制流分支中各条件分支下都存在的相同的访存代码。
S303、判断上述应用程序代码是否为可变换代码,若是,则执行步骤S304。
如果判断出上述应用程序代码不为可变换代码,则继续按照现有技术的处理过程执行。
S304、根据上述公共计算代码、上述公共访存代码以及硬件平台参数信息,对上述应用程序代码中的控制流分支组代码进行变换处理,生成变换处理后的目标代码。
其中,上述硬件平台参数信息是预先根据应用程序代码所应用的硬件平台的实际信息所确定。
本实施例中,在确定出应用程序代码的代码特征之后,根据应用程序代码中的公共计算代码、公共访存代码以及实际所应用的硬件平台参数信息对应用程序代码进行变换处理,即本实施例结合应用程序代码的具体情况对应用程序代码进行变换,因此能够满足各种场景下的既能消除控制流造成的性能下降又不会引入过多的优化开销的要求。
以下实施例对上述实施例中各步骤的具体方法进行说明。
图4为本申请提供的程序代码变换处理方法实施例二的流程示意图,如图4所示,本申请具体执行过程包括:
S401、通过硬件平台配置信息以及运行数据分析(profiling)获取硬件平台参数信息。
其中,硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
具体地,可以通过查阅硬件平台手册来获取硬件平台配置信息,包括硬件平台的核数、峰值性能、峰值带宽和操作的延迟,例如单个加法操作所需要的时钟等。这些配置信息即为一部分硬件平台参数信息。
具体地,可以通过profiling获取硬件平台参数信息,包括Kernel的创建开销、主机和设备之间的带宽、设置Kernel参数的开销、将Kernel插入队列的开销等。
需要说明的是,当上述应用程序代码应用于一个新的硬件平台时,需要执行本步骤。如果已经获取到硬件平台参数信息,则不需要再执行本步骤。
S402、确定应用程序代码的代码特征。
根据前述对于可变换代码、公共计算代码以及公共访存代码的定义,可以自动识别上述应用程序中的伪控制流分支组、伪控制流线程、伪控制流线程组、公共计算代码以及公共访存代码等代码特征。
S403、根据上述公共计算代码、公共访存代码以及硬件平台参数信息,确定上述应用程序代码对应的变换策略。
其中,上述变换策略可以为分支缩减策略、分支内核策略或冗余线程策略。
分支内核策略以及冗余线程策略分别对应前述的分支内核方法以及冗余线程方法,这两种方法的具体实现方式可以参照前述实施例,此处不再赘述。
分支缩减策略是将控制流分支中的公共计算代码以及公共访存代码外提,以及尽量实现向量访存的方式,将在下述实施例中详细说明。
可选地,在确定变换策略之前,可以首先根据代码特征,确定可能使用的策略集合。具体地,首先判断上述应用程序代码是否能够利用静态方法实现优化,即是否能预先建立条件分支与线程的对应关系,如果不能利用静态方法实现优化,则确定可能使用的策略集合中包括分支缩减策略和分支内核策略;如果能利用方法实现优化,则确定可能使用的策略集合中包括分支缩减策略、分支内核策略以及冗余线程策略。
即在具体确定要使用的变换策略之前,先对可以使用的变换策略进行筛选,从而避免后续确定变换策略过程中对明显不适用的变换策略进行处理所引起的开销。
进而,通过以下过程确定上述应用程序代码对应的变换策略:
首先,根据所述硬件平台参数信息,确定上述应用程序代码的控制流分支的源程序执行时间。
具体地,首先使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算上述应用程序代码的控制流分支的源程序执行时间。其次,将上述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为上述应用程序代码的控制流分支的源程序执行时间。
其中,Time(Compute)为根据硬件平台参数信息所计算出的上述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据上述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
伪代码示例如下:
(a)TimeCond(i)=Time(Compute)+Time(MemAcc)
一个应用程序代码中可能包含多个控制流分支,此处计算每个控制流分支的源程序执行时间。
(b)foreach j in CondBrGroup
TimeRealTotal+=TimeCond(j)
其中,TimeRealTotal表示应用程序代码的控制流分支的源程序执行时间,即将每个控制流分支的源程序执行时间相加,从而得出应用程序代码的控制流分支的源程序执行时间,即总执行时间。
其次,根据上述公共计算代码、上述公共访存以及所述源程序执行时间,确定每种变换策略下上述应用程序代码的控制流分支的执行收益。
具体地,对于每种变换策略,使用其对应的执行收益公式计算执行收益。
以下分别说明分支缩减策略、分支内核策略以及冗余线程策略对应的执行收益计算方法。
(a)分支缩减策略
首先说明分支缩减策略的具体执行方法。
分支缩减策略是将控制流分支代码中的公共计算代码以及公共访存代码增加到控制流分支代码之外,并删除控制流分支代码中的公共计算代码以及公共访存代码,并且,将控制流分支代码中的访存代码组合为向量访存代码。
基于分支缩减策略的执行过程,其执行收益计算如下:
公式(1):
TimeRealCondBrS=TimeRealTotal–
Time(HoistMemAcc)*(NumBrMemAcc-1)–
Time(HoistCompute)*(NumBrCompute-1)–
Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1);
公式(2):
TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute);
公式(3):
TimeBenefit=TimeRealTotal-TimeRealCondBrS;
其中,TimeRealTotal为上述源程序执行时间,HoistMemAcc为外提到控制流分支外的公共访存的操作,相应地,Time(HoistMemAcc)为公共访存的耗费时间,HoistCompute为外提到控制流分支外的公共计算代码对应的操作,相应地,Time(HoistCompute)为公共计算的耗费时间,NumBr为包含公共访存的操作或者公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
另外,公式(1)表示分支缩减策略下Kernel的实际执行时间,具体是将应用程序代码的源程序执行时间减去通过该策略所节省的时间;公式(2)表示该方案引入的额外开销,公式3表示该方案带来的执行收益。
(b)分支内核策略
该策略的执行收益计算如下:
公式(1):
TimeRealKernel=TimeCost+Max(TimeCond(CondBrGroup));
公式(2):
TimeCost=Time(SetUpKernel)=Time(MemAcc)+Time(SetArg)+Time(Enqueque)+Time(HostDeviceComm);
公式(3):
TimeBenefit=TimeRealTotal–TimeRealKernel;
其中,公式(1)表示kernel的实际执行时间,公式(2)表示表示该方案引入的额外开销,公式(3)表示该方案带来的执行收益。
(c)冗余线程策略
该策略的执行收益计算如下:
公式(1):
TimeRealRedundant=Max(TimeCond(CondBrGroup))+TimeCost;
公式(2):
TimeCost=Time(AdditionalCond);
公式(3):
TimeBenefit=TimeRealTotal–TimeRealRedundant-TimeCost;
其中,公式(1)表示kernel的实际执行时间,公式(2)表示表示该方案引入的额外开销,公式(3)表示该方案带来的执行收益。
再次,根据上述执行收益,确定上述应用程序代码对应的变换策略。
具体地,计算出每种变换策略对应的执行收益之后,确定出执行收益最大的变换策略,将其作为本次需要使用的变换策略。
S404、使用上述应用程序代码对应的变换策略,对上述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
如果经过上述处理确定出的变换策略为分支内核策略或冗余线程策略,则按照现有的分支内核方法或冗余线程方法对应用程序代码进行变换处理,具体变换处理过程此处不再赘述。
如果经过上述处理确定出的变换策略为分支缩减策略,则具体处理过程如前述的分支缩减方法的处理过程,即:
将控制流分支代码中的公共计算代码以及公共访存代码增加到控制流分支代码之外,并删除控制流分支代码中的公共计算代码以及公共访存代码,并且,将控制流分支代码中的访存代码组合为向量访存代码。
即在分支缩减方法中,通过两种手段来提升代码性能:
(1)将公共计算代码以及公共访存代码外提(在后续实施例中通过完整的代码示例进行解释)
(2)增加向量访存的机会
对于上述(2),假设有如下代码:
1 int a,b;
2 a=matA[itx][ity];
3 if(gidy<1)
4 b=matA[itx][ity];
5 else
6 b=matA[itx][ity+1];
第2行(控制流分支前)和第6行(控制流分支内)的访存的地址连续,因此,可以将第2行和第6行的访存代码组合为向量访存代码,即形成向量化访存,从而可以进一步减少访存次数并提高带宽的利用率。
因此,在分支缩减策略下,通过将公共计算以及公共访存外提,不再需要在每个分支下都执行相同的代码,从而减少执行开销,提升代码性能。同时,通过形成向量化访存,可以进一步减少访存次数并提高带宽的利用率。
在此之后,应用程序代码经过变换处理形成目标代码,该目标代码的格式可以为二进制代码,也可以是CUDA、OpenCL等形式,并且可以应用在不同的硬件平台上。
本实施例中,首先结合公共计算代码、公共访存代码以及硬件平台参数信息确定出每种变换策略下应用程序代码的执行收益,并根据执行收益确定最终使用的变换策略,并使用该变换策略进行变换处理。因此能够覆盖更多的应用场景,并且针对特定场景能够自动选择优化方案。同时,根据执行收益确定变换策略,因此能够保证程序变换只发生在会获取收益的前提下,即能偶保证变换处理的收益。另外,该方法能进一步挖掘向量化访存的机会,因此进一步提升了代码变换处理的收益。
以下通过一个具体实例进一步说明本申请的技术方案。
假设待编译的应用程序代码如下:
1 if(ity==a)
2 pre=Src[itx][1]*2;
3 pre=pre–Src[itx][3];
4 mid=Src[itx][ity];
5 lat=Src[itx][ity+1];
6 res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;
7 else if(ity==b)
8 pre=Src[itx][ity-1];
9 mid=Src[itx][ity];
10 lat=Src[itx][N-2]*2;
11 lat=lat-Src[itx][N-4];
12 res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;
13 else
14 pre=Src[itx][ity-1];
15 mid=Src[itx][ity];
16 lat=Src[itx][ity+1];
17 res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;
需要说明的是,根据本申请前述应用场景中所述,本申请中待编译的应用程序代码为中间表示语言格式的代码,但是,由于中间表示语言比较底层并且人工阅读较困难,因此,本示例中使用上述的类似C语言的伪代码形式来表示中间表示语言。
另外,本示例中存在控制流分支,而在实际实施过程中,如果应用程序代码中存在多个控制流分支时,则需要针对每个控制流分支分别执行下述针对控制流分支的操作。
针对上述应用程序代码,处理过程如下:
(1)判断是否为可变换代码
在该示例中,条件分支分别为ity==a,ity==b以及无条件跳转(else),由程序高层语义可知,ity的值集合中存在与a和b相等的值,因此,可能存在某个Warp同时满足三个分支的情况,因此存在伪控制流,即上述示例代码为可变换代码。
(2)判断是否能够利用静态方法实现优化
根据(1)的分析结果,虽然可以获知a和b值的范围,但是无法确定其具体值,因此不能在静态时确定条件分支与线程之间的关系。因此不能利用静态方法实现优化。即不能使用冗余线程策略,而仅能在分支缩减策略和分支内核策略中进行选择。
(3)确定公共访存代码
(31)确定每个条件分支的访存地址集合
(a)条件分支1的访存地址集合:
ReadAddrSet1={Src[itx][1],Src[itx][3],Src[itx][ity],Src[itx][ity+1],Filter0,Filter1,Filter2};
WriteAddrSet1={res[itx][ity]}
(b)条件分支2的访存地址集合:
ReadAddrSet2={Src[itx][ity-1],Src[itx][ity],Src[itx][N-1],Src[itx][N-4],Filter0,Filter1,Filter2};
WriteAddrSet2={res[itx][ity]}
(c)条件分支3的访存地址集合:
ReadAddrSet3={Src[itx][ity-1],Src[itx][ity],Src[itx][ity+1],Filter0,Filter1,Filter2};
WriteAddrSet3={res[itx][ity]}
(32)确定条件分支之间的公共访存
根据(31)中各条件分支的访存地址集合,确定出控制流分支中的公共访存为:
ReadAddrCommonSet={Src[itx][ity-1],Src[itx][ity],Src[itx][ity+1],Filter0,Fitler1,Filter2};
WriteAddrCommonSet={res[itx][ity]}
(4)确定公共计算代码
具体为:
CommonExprSet={res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;}
(5)计算每种变换变换策略下的执行收益:
为了方便后续过程的描述,首先对硬件平台的参数进行如下标记:
TimeReadG:单次全局地址读延迟;TimeWriteG:单次全局地址写延迟;
TimeAdd:加法操作或者减法操作的开销;TimeMul:乘法操作的开销;
TimeReal1:条件分支1的实际执行时间
TimeReal1=TimeReadG*7+TimeMul*4+TimeAdd*4+TimeWriteG
TimeReal2:条件分支2的实际执行时间
TimeReal2=TimeReadG*7+TimeMul*4+TimeAdd*4+TimeWriteG
TimeReal3:条件分支3的实际执行时间
TimeReal3=TimeReadG*6+TimeMul*3+TimeAdd*3+TimeWriteG
TimeRealMax=Max(TimeReal1,TimeReal2,TimeReal3)=TimeReal1=TimeReal2;
TimeRealTotal=TimeReal1+TimeReal2+TimeReal3=
TimeReadG*21+TimeMul*11+TimeAdd*11+TimeWriteG*3
TimeSetupKernel:创建kernel引入的开销,包括内存分配管理、设置参数、插入队列和kernel调度等负载;
(51)分支内核策略的执行收益计算:
TimeRealCK=TimeSetupKernel*2+TimeRealMax;
TimeBenefitCK=TimeRealTotal–TimeRealCK;
(52)分支缩减策略的执行收益计算:
为便于理解计算过程,参考下述示例代码,该示例代码显示的是完成变换后的代码。
1 int3temp=vload3(Src[itx][ity-1]);
2 pre=temp[0];
3 mid=temp[1];
4 lat=temp[2];
5 if(ity==a)
6 pre=Src[itx][1]*2;
7 pre=pre–Src[itx][3];
8 else if(ity==b)
9 lat=Src[itx][N-2]*2;
10 lat=lat-Src[itx][N-4];
11 else;
12 res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;
TimeRealHoist:外提到控制流分支之外的访存和计算的时间;
TimeReal1Opt,TimeReal2Opt,TimeReal3Opt,TimeRealTotalOpt分别表示进行代码变换后,每个条件分支的执行时间或者总的执行时间。
由于temp访问的是缓存,延迟很小,因此,为了简化问题,此处对temp的访问开销可以忽略。
TimeRealHoist=TimeReadG*4+TimeMul*3+TimeAdd*3+TimeWriteG;
TimeReal1Opt=TimeReadG*2+TimeAdd+TimeMul;
TimeReal2Opt=TimeReadG*2+TimeMul+TimeAdd;
TimeRead3Opt=0;
TimeRealCS=TimeRealTotalOpt=TimeReal1Opt+TimeReal2Opt+TimeReal3Opt=TimeReadG*8+TimeMul*5+TimeAdd*5+TimeWriteG;
TimeBenefitCS=TimeRealTotal–TimeRealCS=
TimeReadG*13+TimeMul*6+TimeAdd*6+TimeWritG
(6)根据每种变换变换策略下的执行收益确定变换策略:
根据(51)和(52)的计算可以得出,分支内核策略的最终执行时间为:
TimeRealCK=TimeSetupKernel*2+TimeReadG*4+TimeMul*4+TimeWrietG+TimeAdd*4;
TimeRealCS=TimeReadG*5+TimeMul*5+TimeRealAdd*5+TimeWriteG;
TimeRealCK–TimeRealCS=TimeSetupKenrel*2–TimeReadG–TimeMul–TimeAdd;
根据硬件平台参数信息可知,内核创建的开销要远远大于单次访存、乘法和加法操作的开销。所以,最终选择分支缩减策略作为变换策略。
(7)使用分支缩减策略进行代码变换
变换后的代码即为上述(52)中所述的变换后的代码。
其中,对公共访存进行外提并进行向量化访存优化后,生成的代码为第1行的代码,访存的数据写入局部变量temp中。
将公共计算外提后生成的代码为第12行的代码。
另外,将各个条件分支被外提的访存操作替换成对局部变量temp的访问。
(8)根据实际需要,生成二进制或者OpenCL形式的变换后代码,此处以生成OpenCL代码为例,所生成的变换后代码如下:
1 __kernel void Column(
2 __global unsigned char*Src){
3 int gidx=get_global_id(0);
4 int giddy=get_global_id(1);
5 if(gidx>=Width||giddy>=Height)
6 return;
7 int3temp=vload3(Src[itx][ity-1]);
8 pre=temp[0];
9 mid=temp[1];
10 lat=temp[2];
11 if(ity==a)
12 pre=Src[itx][1]*2;
13 pre=pre–Src[itx][3];
14 else if(ity==b)
15 lat=Src[itx][N-2]*2;
16 lat=lat-Src[itx][N-4];
17 else;
18 res[itx][ity]=pre*Filter0+mid*Filter1+lat*Filter2;
19 }
图5为本申请提供的程序代码变换处理装置实施例一的模块结构图,如图5所示,该装置包括:
第一获取模块501,用于获取待编译的应用程序代码;
确定模块502,用于确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;
变换模块503,用于在所述应用程序代码为可变换代码时,根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
该装置用于实现前述方法实施例,其实现原理和技术效果类似,此处不再赘述。
图6为本申请提供的程序代码变换处理装置实施例二的模块结构图,如图6所示,变换模块503包括:
确定单元5031,用于根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略。
变换单元5032,用于使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
其中,所述变换策略为分支缩减策略、分支内核策略或冗余线程策略。
另一实施例中,所述变换策略为分支缩减策略;变换单元5032具体用于:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;以及,
将所述控制流分支代码中的访存代码组合为向量访存代码。
另一实施例中,确定单元5031具体用于:
根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间。
根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益。
根据所述执行收益,确定所述应用程序代码对应的变换策略。
另一实施例中,确定单元5031具体还用于:
使用公式TimeRealCondBrS=TimeRealTotal–Time(HoistMemAcc)*(NumBrMemAcc-1)–Time(HoistCompute)*(NumBrCompute-1)–Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1)、TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute)以及TimeBenefit=TimeRealTotal-TimeRealCondBrS确定所述分支缩减策略下所述应用程序代码的控制流分支的执行收益。
其中,TimeRealTotal为所述源程序执行时间,HoistMemAcc为外提到控制流分支外的所述公共访存的操作,HoistCompute为外提到控制流分支外的所述公共计算代码对应的操作,NumBr为包含所述公共访存的操作或者所述公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
另一实施例中,确定单元5031具体还用于:
使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算所述应用程序代码的控制流分支的源程序执行时间。
将所述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为所述应用程序代码的控制流分支的源程序执行时间。
其中,Time(Compute)为根据所述硬件平台参数信息所计算出的所述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据所述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
图7为本申请提供的程序代码变换处理装置实施例三的模块结构图,如图7所示,该装置还包括:
第二获取模块504,用于通过硬件平台配置信息以及profiling获取所述硬件平台参数信息。
其中,所述硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
另一实施例中,确定模块502具体用于:
判断所述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定所述应用程序代码为可变换代码。

Claims (17)

1.一种程序代码变换处理方法,其特征在于,包括:
获取待编译的应用程序代码;
确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;
若所述应用程序代码为可变换代码,则根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
2.根据权利要求1所述的方法,其特征在于,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码,包括:
根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略;
使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码;
其中,所述变换策略为分支缩减策略、分支内核策略或冗余线程策略。
3.根据权利要求2所述的方法,其特征在于,所述变换策略为分支缩减策略;所述使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码,包括:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;
将所述控制流分支代码中的访存代码组合为向量访存代码。
4.根据权利要求2或3所述的方法,其特征在于,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略,包括:
根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间;
根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益;
根据所述执行收益,确定所述应用程序代码对应的变换策略。
5.根据权利要求4所述的方法,其特征在于,所述根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益,包括:
使用公式TimeRealCondBrS=TimeRealTotal–Time(HoistMemAcc)*(NumBrMemAcc-1)–Time(HoistCompute)*(NumBrCompute-1)–Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1)、TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute)以及TimeBenefit=TimeRealTotal-TimeRealCondBrS确定所述分支缩减策略下所述应用程序代码的控制流分支的执行收益;
其中,TimeRealTotal为所述源程序执行时间,HoistMemAcc为外提到控制流分支外的所述公共访存的操作,HoistCompute为外提到控制流分支外的所述公共计算代码对应的操作,NumBr为包含所述公共访存的操作或者所述公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
6.根据权利要求4所述的方法,其特征在于,所述根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间,包括:
使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算所述应用程序代码的控制流分支的源程序执行时间;
将所述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为所述应用程序代码的控制流分支的源程序执行时间;
其中,Time(Compute)为根据所述硬件平台参数信息所计算出的所述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据所述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
7.根据权利要求2-6任一项所述的方法,其特征在于,所述根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略之前,还包括:
通过硬件平台配置信息以及运行数据分析profiling获取所述硬件平台参数信息;
其中,所述硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述确定所述应用程序代码的代码特征,包括:
判断所述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个线程束Warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定所述应用程序代码为可变换代码。
9.一种程序代码变换处理装置,其特征在于,包括:
第一获取模块,用于获取待编译的应用程序代码;
确定模块,用于确定所述应用程序代码的代码特征,所述代码特征包括所述应用程序代码是否为可变换代码、所述应用程序代码的控制流分支中的公共计算代码以及所述应用程序代码的控制流分支中的公共访存代码;
变换模块,用于在所述应用程序代码为可变换代码时,根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码。
10.根据权利要求9所述的装置,其特征在于,所述变换模块包括:
确定单元,用于根据所述公共计算代码、所述公共访存代码以及硬件平台参数信息,确定所述应用程序代码对应的变换策略;
变换单元,用于使用所述应用程序代码对应的变换策略,对所述应用程序代码中的控制流分支代码进行变换处理,生成变换处理后的目标代码;
其中,所述变换策略为分支缩减策略、分支内核策略或冗余线程策略。
11.根据权利要求10所述的装置,其特征在于,所述变换策略为分支缩减策略;所述变换单元具体用于:
将所述控制流分支代码中的公共计算代码以及公共访存代码增加到所述控制流分支代码之外,并删除所述控制流分支代码中的公共计算代码以及公共访存代码;以及,
将所述控制流分支代码中的访存代码组合为向量访存代码。
12.根据权利要求10或11所述的装置,其特征在于,所述确定单元具体用于:
根据所述硬件平台参数信息,确定所述应用程序代码的控制流分支的源程序执行时间;
根据所述公共计算代码、所述公共访存以及所述源程序执行时间,确定每种变换策略下所述应用程序代码的控制流分支的执行收益;
根据所述执行收益,确定所述应用程序代码对应的变换策略。
13.根据权利要求12所述的装置,其特征在于,所述确定单元具体还用于:
使用公式TimeRealCondBrS=TimeRealTotal–Time(HoistMemAcc)*(NumBrMemAcc-1)–Time(HoistCompute)*(NumBrCompute-1)–Time(VectMemAcc)*(NumBrMemAcc-1)*(NumEle-1)、TimeCost=Time(RedundantMemAcc)+Time(RedundantCompute)以及TimeBenefit=TimeRealTotal-TimeRealCondBrS确定所述分支缩减策略下所述应用程序代码的控制流分支的执行收益;
其中,TimeRealTotal为所述源程序执行时间,HoistMemAcc为外提到控制流分支外的所述公共访存的操作,HoistCompute为外提到控制流分支外的所述公共计算代码对应的操作,NumBr为包含所述公共访存的操作或者所述公共计算代码对应的操作的控制流分支的数目,NumEle为向量访存操作的长度。
14.根据权利要求12所述的装置,其特征在于,所述确定单元具体还用于:
使用公式TimeCond(i)=Time(Compute)+Time(MemAcc)计算所述应用程序代码的控制流分支的源程序执行时间;
将所述应用程序代码的控制流分支组中每个控制流分支的源程序执行时间之和,作为所述应用程序代码的控制流分支的源程序执行时间;
其中,Time(Compute)为根据所述硬件平台参数信息所计算出的所述控制流分支的计算操作所耗费的时间,Time(MemAcc)为根据所述硬件平台参数信息所计算出的所述控制流分支的访存操作所耗费的时间。
15.根据权利要求10-14任一项所述的装置,其特征在于,还包括:
第二获取模块,用于通过硬件平台配置信息以及运行数据分析profiling获取所述硬件平台参数信息;
其中,所述硬件平台参数信息包括内核函数的创建管理开销、冗余计算开销、存储空间的管理开销、通信开销以及单位计算的开销。
16.根据权利要求9-15任一项所述的装置,其特征在于,所述确定模块具体用于:
判断所述应用程序代码是否满足至少有两个控制流分支的条件分支被同一个线程束Warp内的至少两个线程满足,并且,分别满足不同控制流条件分支的线程中至少有两个是不同的,若是,则确定所述应用程序代码为可变换代码。
17.一种编译系统,其特征在于,包括如权利要求9-16任一项所述的程序代码变换处理装置。
CN201711031826.4A 2017-10-30 2017-10-30 程序代码变换处理方法、装置及编译系统 Pending CN109725903A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711031826.4A CN109725903A (zh) 2017-10-30 2017-10-30 程序代码变换处理方法、装置及编译系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711031826.4A CN109725903A (zh) 2017-10-30 2017-10-30 程序代码变换处理方法、装置及编译系统

Publications (1)

Publication Number Publication Date
CN109725903A true CN109725903A (zh) 2019-05-07

Family

ID=66291270

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711031826.4A Pending CN109725903A (zh) 2017-10-30 2017-10-30 程序代码变换处理方法、装置及编译系统

Country Status (1)

Country Link
CN (1) CN109725903A (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130042090A1 (en) * 2011-08-12 2013-02-14 Ronny M. KRASHINSKY Temporal simt execution optimization
CN103150157A (zh) * 2013-01-03 2013-06-12 中国人民解放军国防科学技术大学 基于访存分歧的gpu核心程序重组优化方法
US20140164737A1 (en) * 2012-12-06 2014-06-12 Kalray Execution efficiency in a single-program, multiple-data processor
CN105389158A (zh) * 2014-08-28 2016-03-09 想象技术有限公司 组合路径
CN105867992A (zh) * 2016-03-28 2016-08-17 乐视控股(北京)有限公司 代码编译方法和装置
CN107038019A (zh) * 2015-10-02 2017-08-11 联发科技股份有限公司 单指令多数据计算系统中处理指令的方法及计算系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130042090A1 (en) * 2011-08-12 2013-02-14 Ronny M. KRASHINSKY Temporal simt execution optimization
US20140164737A1 (en) * 2012-12-06 2014-06-12 Kalray Execution efficiency in a single-program, multiple-data processor
CN103150157A (zh) * 2013-01-03 2013-06-12 中国人民解放军国防科学技术大学 基于访存分歧的gpu核心程序重组优化方法
CN105389158A (zh) * 2014-08-28 2016-03-09 想象技术有限公司 组合路径
CN107038019A (zh) * 2015-10-02 2017-08-11 联发科技股份有限公司 单指令多数据计算系统中处理指令的方法及计算系统
CN105867992A (zh) * 2016-03-28 2016-08-17 乐视控股(北京)有限公司 代码编译方法和装置

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
BRUNO COUTINHO ET AL.: "Divergence Analysis and Optimizations", 《INTERNATIONAL CONFERENCE ON PARALLEL ARCHITECTURES & COMPILATION TECHNIQUES》 *
FARZAD KHORASANI ET AL.: "Efficient Warp Execution in Presence of Divergence with Collaborative Context Collection", 《ACM》 *
刘素芹 等: "基于 CUDA 的 GPU 条件分支分歧聚合优化策略", 《中国石油大学学报》 *
卢兴敬 等: "ParaC:面向 GPU 平台的图像处理领域的编程框架", 《软件学报》 *
邵天骄: "基于GPU并行计算的性能优化研究", 《中国优秀硕士学位论文全文数据库信息科技辑》 *

Similar Documents

Publication Publication Date Title
KR102257028B1 (ko) 컴퓨팅 플랫폼 기반의 적응형 딥러닝 작업 할당 장치 및 방법
EP2656208B1 (en) Agile communication operator
US11579924B2 (en) Scheduling artificial intelligence model partitions based on reversed computation graph
CN103970602B (zh) 一种面向x86多核处理器的数据流程序调度方法
CN103617066A (zh) 一种工作流引擎及其实现方法
JPH0830561A (ja) プログラムの並列化実行方法及び並列化実行コンパイラ
CN104965761A (zh) 一种基于gpu/cpu混合架构的流程序多粒度划分与调度方法
CN111666071B (zh) 一种基于目标众核的对抗网络移植与优化的方法及系统
CN108134848B (zh) 一种基于图论k-分割的soa系统资源优化方法
CN113885871A (zh) 支持机器学习训练的专用后端代码生成方法及装置
Brown et al. Agricultural reform: more efficient farming using advanced parallel refactoring tools
Feljan et al. Task allocation optimization for multicore embedded systems
Pérez et al. Parallel/distributed implementation of cellular training for generative adversarial neural networks
CN108874547A (zh) 一种天文学软件Gridding的数据处理方法及装置
CN109725903A (zh) 程序代码变换处理方法、装置及编译系统
CN110012021B (zh) 一种移动边缘计算下的自适应计算迁移方法
CN116306424A (zh) 一种基于可调级数裕量改进的动态扩增逐层优化算法的pisa架构芯片资源排布方法
KR102376527B1 (ko) Dnn 프레임워크를 이용하는 단일 가속기용 프로그램을 복수의 가속기에서 처리하는 방법 및 컴퓨터 프로그램
CN117242457A (zh) 定位神经网络性能热点
Goli et al. Mapping parallel programs to heterogeneous CPU/GPU architectures using a Monte Carlo Tree Search
Jin et al. Adaptive and optimized agent placement scheme for parallel agent‐based simulation
CN102063308A (zh) 一种用于地震勘探资料处理流程控制的方法
CN107256158B (zh) 电力系统负荷削减量的检测方法和系统
CN115545188B (zh) 基于不确定性估计的多任务离线数据共享方法及系统
Khatami et al. Using hpx and op2 for improving parallel scaling performance of unstructured grid applications

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20190507

WD01 Invention patent application deemed withdrawn after publication