CN118092931A - 基于指导语句的函数向量化方法及系统 - Google Patents

基于指导语句的函数向量化方法及系统 Download PDF

Info

Publication number
CN118092931A
CN118092931A CN202410227797.2A CN202410227797A CN118092931A CN 118092931 A CN118092931 A CN 118092931A CN 202410227797 A CN202410227797 A CN 202410227797A CN 118092931 A CN118092931 A CN 118092931A
Authority
CN
China
Prior art keywords
vectorization
loop
instruction
function
statement
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
CN202410227797.2A
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.)
Information Engineering University of PLA Strategic Support Force
Original Assignee
Information Engineering University of PLA Strategic Support Force
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 Information Engineering University of PLA Strategic Support Force filed Critical Information Engineering University of PLA Strategic Support Force
Priority to CN202410227797.2A priority Critical patent/CN118092931A/zh
Publication of CN118092931A publication Critical patent/CN118092931A/zh
Pending legal-status Critical Current

Links

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Complex Calculations (AREA)

Abstract

本发明涉及计算机技术领域,特别涉及一种基于指导语句的函数向量化方法及系统,在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。本发明通过在调用语句所在循环上添加指导语句,实现循环中含有函数调用指令和全函数的向量化处理,能够为被调函数提供整体函数向量化版本,提高代码可读性和易用性,提升目标应用程序性能。

Description

基于指导语句的函数向量化方法及系统
技术领域
本发明涉及计算机技术领域,特别涉及一种基于指导语句的函数向量化方法及系统。
背景技术
随着计算机技术的发展和处理器性能的不断提升,利用现代处理器的并行性能进行高效计算已经成为计算机科学研究的重要方向。其中,SIMD(Single InstructionMultiple Data)技术是一种广泛应用于现代处理器中的并行计算技术,它可以在一个指令中同时处理多个数据元素,从而显著提高计算性能。自动向量化是一种编译器优化技术,它可以将SIMD指令应用于连续的数据序列,从而实现高效的并行计算。
然而,自动向量化的研究大多在循环和基本块层面上,很少有对全函数向量化的研究。全函数向量化是一种将整个函数转换为可同时处理多个数据元素的SIMD指令的技术,以提高计算效率。这种方法不同于传统的循环向量化,全函数向量化的优点在于它可以将整个函数的计算效率最大化,包括控制流和变量使用等方面,可以更好地利用SIMD指令的优势,其代码具有较高的可读性和易用性。除此之外,函数向量化比传统的基于循环的操作更快,特别是在处理大型数据集时效果明显。随着多核处理器和GPU等并行计算平台的出现,全函数向量化技术在许多领域都得到了广泛的应用,如图像处理、数据处理、机器学习、深度学习等。
现有程序向量化方法中,如名为Parsimony的SPMD编程方法,旨在通过高效地利用CPU的SIMD/vector单元来实现高计算性能,并与标准编程模型、语言和编译器工具链兼容,可以对含有函数调用的循环进行很好的向量化,然而这种编译方式对于函数调用采取内联的方式对其进行向量化;又如,partial linearization的if-conversion算法,可以有效地处理SIMD程序中的分支,通过将非发散分支进行if-conversion,从而避免了在SIMD程序中执行多个目标的问题,提高了SIMD的利用率,可以处理break,return等发散控制流,对含有函数调用等复杂情况也能够很好的支持,并在外层循环向量化进行实现,然而,它对于函数调用依然采用内联的方式进行向量化,没有对调用点进行处理。若强制不内联,也会因没有对被调函数进行提前预处理而不能向量化;又如,CHORσuS(C Higher-Order VectorSemantics)的C语言扩展,它是一种轻量级的静态扩展,允许程序员将计算表示为应用于标量内核的可组合向量操作,直接在C语言中实现全函数向量化,通过使用map和fold函数来表示向量操作,它要求程序员在C语言中编写含有map和fold函数表示的向量化代码,为程序员增加负担,有些偏离自动向量化;又如,在多核SIMD处理器上编译C/C++SIMD扩展以实现函数和循环向量化,利用新的C/C++高级向量扩展和扩展的Intel C++产品编译器,将这些向量扩展转换为优化的SIMD指令序列,以实现向量化的函数和循环,然而其扩展字句过多,有些繁琐,对程序员来说并不友好;也有通过在循环向量化pass之前添加一个名为VecCLONE的pass来实现函数级的向量化,其没有引入新的向量化方式,只是在循环向量化pass之前将待向量化的函数进行处理,向量化的主要过程还是在循环向量化pass中,并没有生成一个向量化的函数,而是将其转化为一个等效的循环,相当于循环向量化并非真正的函数向量化;再如,基于控制流图(CFG)的SSA形式的低级中间代码的整体函数向量化代码转换方法,利用openmp指导语句,需要同时对调用点所在的for循环和被调函数都加上指导语句来对其进行向量化,并且对函数名的前缀等还有一定的要求,较为繁琐。因此,亟需一种全函数向量化手段来较好利用SIMD指令优势,以达到目标应用程序性能提升的目的。
发明内容
本发明提供一种基于指导语句的函数向量化方法及系统,解决现有向量化处理多集中在循环和基本块上、向量化效果有待提升等问题,通过在调用语句所在循环上添加指导语句,实现循环中含有函数调用指令和全函数的向量化处理,能够为被调函数提供整体函数向量化版本,提高代码可读性和易用性,提升目标应用程序性能。
按照本发明所提供的设计方案,一方面,提供一种基于指导语句的函数向量化方法,包含:
在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;
利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;
对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;
按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
作为本发明基于指导语句的函数向量化方法,进一步地,在目标程序中调用语句所在循环处添加编译指导语句,包含:
设置编译指导语句中的启用向量化指令及向量寄存器宽度定义指令,以在目标程序开发过程中依据代码结构在调用语句所在循环处添加相应循环标识符和编译指导语句。
作为本发明基于指导语句的函数向量化方法,进一步地,利用编译器并根据编译指导语句确定目标程序中待向量化的循环,包含:
编译器前端识别调用语句所在循环中的启用向量化指令,并将其转换为对应的中间表达式形式,将循环中元数据信息进行更新并生成启用向量化指令的元数据节点和定义向量寄存器宽度的元数据节点,并对其对应元数据节点进行赋值;
编译器终端通过循环标识符获取调用语句所在循环的启用向量化指令的元数据节点值,以确定当前循环是否需要向量化,将需要向量化的循环添加至向量化任务列表中。
作为本发明基于指导语句的函数向量化方法,进一步地,对元数据节点进行赋值,包含:
将启用向量化指令的元数据节点赋值为待向量优化标识,将定义向量寄存器宽度的元数据节点赋值为指定向量寄存器宽度,且所述指定向量寄存器宽度依据处理器性能设置。
作为本发明基于指导语句的函数向量化方法,进一步地,对向量化任务列表中的各循环进行预转换和向量化分析,包含:
对循环进行简化,以确保每个循环仅有一个入边和一个回边,将循环中指定操作函数转换为基本指令,其中,指定操作函数包括程序状态修改操作函数和系统调用操作函数;并对循环中的代码进行静态分析,以跟踪确定循环中变量的向量形状。
作为本发明基于指导语句的函数向量化方法,进一步地,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,包含:
将循环的入口掩码设定为循环所有入边掩码的析取,以利用掩码变量确定循环中各分支的有效性,其中,针对循环头部,设定入口掩码为Ф函数,其输入值来自循环的预头部和尾部;离开一个循环块的控制流边的掩码由循环块的入口掩码、该循环块的进入掩码和潜在的出口掩码决定,如果出口分支是条件性的,则真边的出口掩码为其入口掩码和分支条件的合取,假边的出口掩码为其入口掩码和否定分支条件的合取。
作为本发明基于指导语句的函数向量化方法,进一步地,通过向量化代码转换获取目标程序的向量数据,包括:
针对向量化任务列表各循环基本块,将标量指令一对一转换为SIMD版本指令;保持向量形状统一的变量为标量形式;将函数调用指令中被调函数重新进行预转换和向量化分析,在被调函数的控制流图CFG使用掩码变量显式传递控制流边有效分支,利用选择指令对控制流边中的有效分支和无效分支进行合并,并按照指定顺序对基本块进行拓扑排序,通过控制流线性化来实现被调函数数据流向量编码;通过标量到向量的一对一映射对函数体进行向量化编码;通过获取调用指令参数及函数名生成调用指令的向量化编码。
进一步地,本发明还提供一种基于指导语句的函数向量化系统,包含:指导注释模块、任务获取模块、任务分析模块和任务执行模块,其中,
指导注释模块,用于在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;
任务获取模块,用于利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;
任务分析模块,用于对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;
任务执行模块,用于按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
本发明的有益效果:
本发明通过解析指导语句确定向量化循环、预转换、向量化分析、掩码生成、选择生成、控制流图线性化和向量化代码生成七个阶段来实现全函数向量化,能够为循环中调用的函数提供向量化的版本,而不是对其内联处理,能够处理向量版本的函数调用点,并可对含有函数的循环体进行向量化,可在向量化过程中充分利用SIMD指令的优势,以提高应用程序的性能。并进一步从ISPC基准测试和SIMD库基准测试中选取了10个基准测试来进行方案评估,实验结果表明本案方案与标量相比,平均加速比达到了6.949倍,在保证性能开销的同时,能够节约时间成本,具有较好的应用前景。
附图说明:
图1为实施例中基于指导语句的函数向量化流程示意;
图2为实施例中函数向量化示例;
图3为实施例中添加指导语句的循环示例;
图4为实施例中函数调用点处理过程示意;
图5为实施例中掩码规约和掩码统一真检测示意;
图6为实施例中Benckmark加速比示意。
具体实施方式:
为使本发明的目的、技术方案和优点更加清楚、明白,下面结合附图和技术方案对本发明作进一步详细的说明。
随着处理器技术的不断发展,SIMD(Single Instruction Multiple Data单指令多数据流)向量化已经在各个领域得到了广泛的应用。然而,过去的研究主要集中在循环和基本块上,SIMD扩展部件可在不同的粒度向量化,主要包括基本块级向量化、循环级向量化和函数级向量化。全函数向量化可以更好地利用SIMD指令的优势,从而提高应用程序的性能。
基本块级向量化是一种针对基本块的向量化技术,旨在将相似的独立指令组合成向量指令。这种技术可以应用于内存访问、算术运算、比较运算和PHI节点。基本块向量化与循环向量化不同,它更关注于迭代内基本块中的向量化机会。基本块向量化的过程大致分为识别相邻内存引用、扩充打包列表、合并打包列表和生成向量代码四个步骤。首先,识别相邻内存引用是SLP向量化过程中的关键步骤。算法会遍历基本块中的任意语句对,检查它们是否访问了相邻的内存地址。如果满足条件,并且这两个语句可以打包在一起,那么它们将被添加到同一个向量中。接着,扩充打包列表,利用已经识别出的相邻内存引用,进一步扩充打包列表。这意味着算法会查找与已打包语句相关的其他语句,并检查它们是否也可以打包在一起。然后,合并打包列表,算法会尝试将一些打包列表合并起来,以生成更长的向量。这可以通过识别两个打包列表中共有的元素来实现。最后一步是生成向量代码,根据数据依赖关系,将打包列表中的语句整理成向量指令。如,基本块向量化技术,即超字并行(SLP,superword level parallelism),利用基本块内数据的连续内存访问和复用信息,将多条相似且可并行执行的语句组合成一个向量指令,从而提高代码的执行效率。又如,基于表达式等价变换的SLP向量化方法——LSLP(Left-to-Right Superword LevelParallelism)和SN-SLP(Superword-Level Parallelism with Non-IsomorphicStatements),通过调整非同构语句的操作顺序或利用等价关系和等价扩展关系,将操作数顺序不同的非同构语句转换为操作数顺序相同的同构语句,从而实现向量化。又如,针对操作数数目不同的非同构语句的向量化问题的名为SLP-E的方法,将操作数数目不同的非同构语句转换为操作数数目相同的同构语句,从而实现向量化。
循环向量化主要包括循环结构分析、依赖分析、向量指令的生成和尾部循环处理四个部分。首先,循环结构分析,编译器会分析循环的结构,以确定是否适合向量化。循环的结构必须能够被有效地分解成一系列可以并行执行的操作,排除无法向量化循环,如含有函数调用、跳转语句等。接着,依赖分析识别循环中的数据相关关系,包括读取和写入变量的依赖关系,通过构建语句依赖图,求解强连通分量,确定能够向量化的语句。只有当语句依赖图中所有真依赖环上的依赖距离之和小于或等于向量化因子时,才能进行向量量化。其他依赖形式可通过循环分布、节点分裂、标量扩展等技术解决。然后进行代码生成,标量操作转换为向量操作,以便同时处理多个数据元素,以利用硬件上的SIMD功能。最后,处理尾循环,如果循环的迭代次数不能被向量宽度整除,编译器可能需要处理尾循环。这可能包括使用标量指令处理剩余的迭代。如,基于循环的自动向量化方法,通过对内层循环的迭代空间进行操作,将整个数组视为一个向量单元,通过进行依赖关系分析,能够将在不同迭代之间并且彼此之间不会形成依赖环的多条语句转换为向量形式。又如,针对最内层循环存在依赖环、归约或数组引用与循环索引不连续等情况时,向量化代价较大或无法实现的情况,提出循环交换可将某外层循环交换至最内层以实现向量化。又如,为充分利用跨外层循环迭代的数据并行性或直线代码中的数据并行性,利用SLP(Loop-Aware SLP)方法,将循环向量化与SLP向量化结合使用,寻找迭代间的向量化机会。
函数级向量化从函数粒度识别程序中的数据级并行,发展到过程间分析。函数的参数为向量,返回值也为向量.它需要将多次标量函数调用转换为一次向量函数调用。一般情况下连续多次函数调用一般仅出现在循环体内,所以函数向量化一般与循环向量化配合使用。如图2所示,(a)为标量函数,(b)是图(a)的向量化函数,其传入参数a,b和返回值c都是向量。目前,在循环中存在函数调用一般采取不向量化或将其内联的方式进行向量化,然而这并不是真正的函数向量化。如,在静态单赋值表示形式(SSA)下,利用基于SSA形式的全函数向量化变换,通过数据流分析和变换利用掩码和选择指令解决函数向量化中运行操作不一致的问题。又如,通过分析程序中操作和基本块的SIMD特性,利用基于SIMD特性实现全函数向量化的代码优化,包括实例多版本、实例重组和向量化指令优化。
本案实施例中,为通过全函数向量化来充分利用SIMD指令优势,提供一种基于指导语句的函数向量化方法,参见图1所示,包含如下内容:
S101、在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征。
具体地,在目标程序中调用语句所在循环处添加编译指导语句,可设计为包含如下内容:
设置编译指导语句中的启用向量化指令及向量寄存器宽度定义指令,以在目标程序开发过程中依据代码结构在调用语句所在循环处添加相应循环标识符和编译指导语句。
在C/C++语言中,通过使用指导语句来告诉编译器需要进行向量化优化,本案实施例中,可采用LLVM编译器的clang指导语句,如图3所示。vectorize(enable)表示启用向量化,vectorize_width(W)表示设置向量寄存器的宽度为W。这些指令会被编译器前端解析,并告诉编译器进行向量化优化。
S102、利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中。
具体地,利用编译器并根据编译指导语句确定目标程序中待向量化的循环,可设计为包含:
编译器前端识别调用语句所在循环中的启用向量化指令,并将其转换为对应的中间表达式形式,将循环中元数据信息进行更新并生成启用向量化指令的元数据节点和定义向量寄存器宽度的元数据节点,并对其对应元数据节点进行赋值;
编译器终端通过循环标识符获取调用语句所在循环的启用向量化指令的元数据节点值,以确定当前循环是否需要向量化,将需要向量化的循环添加至向量化任务列表中。
其中,可将启用向量化指令的元数据节点赋值为待向量优化标识,将定义向量寄存器宽度的元数据节点赋值为指定向量寄存器宽度,且所述指定向量寄存器宽度依据处理器性能设置。
在编译过程中,编译器前端会识别循环体中的#pragma clang loop vectorize(enable)指令,并将其转换为对应的中间表达式形式,将循环元数据中的信息进行更新,生成一个名为llvm.loop.vectorize.enable的元数据节点和一个名为llvm.loop.vectorize.width的元数据节点,其值将被设置为true和W,表示该循环已经被指示进行向量化优化,并且指定向量寄存器宽度为W。需要注意的是,vectorize_width的具体取值应根据目标硬件架构进行选择。常见的向量寄存器宽度包括128位(如SSE指令集中的xmm寄存器)和256位(如AVX指令集中的ymm寄存器)。在选择向量寄存器宽度时,应根据目标处理器的支持程度和性能需求进行综合考虑。
接着,编译器中端通过循环标识符(LoopID)获取循环的llvm.loop.vectorize.enable元数据节点的值,以确定该循环需要进行向量化。如果该循环需要进行向量化,则将其加入向量化任务列表中,以便后续对其进行向量化处理。在向量化过程中,编译器会针对循环体内的操作进行优化,生成相应的向量指令,从而实现并行计算。
通过采用指导语句进行函数向量化的方式,编译器能够根据开发者的指导和代码结构来判断哪些循环适合进行向量化优化,并生成相应的优化指令,从而提高程序的执行效率。
S103、对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并。
具体地,对向量化任务列表中的各循环进行预转换和向量化分析,可设计为包含:
对循环进行简化,以确保每个循环仅有一个入边和一个回边,将循环中指定操作函数转换为基本指令,其中,指定操作函数包括程序状态修改操作函数和系统调用操作函数;并对循环中的代码进行静态分析,以跟踪确定循环中变量的向量形状。
在向量化之前,需要对循环基本块进行一些准备性的转换。其中,最重要的是对循环进行简化,以确保每个循环都只有一个入边和一个回边。这样可以确保存在唯一的循环header、唯一的循环preheader(循环进入的块)和唯一的循环锁存器(一个从循环后端返回到循环头部的块)。除此之外,运行时函数通常涉及一些对程序状态的修改或系统调用等操作,无法直接进行向量化处理。因此,将这些函数进行运行时函数降低处理,降低为基本指令可以使得编译器能够更好地进行代码优化。
为充分利用指令集架构的并行性,加速程序的执行速度,在向量化前需要对代码进行向量化分析,通过对代码进行静态分析来跟踪确定变量的向量形状,对不同的向量化形状进行不同的向量化处理或标量处理。
形状分析试图跟踪单个变量在SIMD寄存器上的特性。如表1所示。
表1向量形状描述
如果一个变量在每个实例中都包含相同的值,那么它的向量化形状就是统一的(Uniform)。统一值可以存储在标量寄存器中,并通过标量指令进行操作,这可以改善许多CPU架构中的延迟、吞吐量和寄存器压力。如果所有实例共同的基值加上每个实例的偏移量,那么它的向量化形状就是跨步的(Strided)。如果跨步为1,那么它的向量化形状就是连续的(Contiguous)。对于连续的和跨步的变量,可只需要存储其基值,偏移量可以后续使用的时候根据跨步大小生成相应的向量。如果SIMD实例的结果是自然数,并且第一个实例的结果是向量宽度的倍数,那么它的向量化形状就是对齐的(Alignment)。SIMD硬件通常提供更有效的向量内存操作来访问对齐的内存位置。对于还没有进行计算的变量形状设为未定的(Undef),后续对其进分析计算。对于在不同的实例持有不同的值且这些值没有任何规律的变量,将其向量化形状设为变化的(Varying)。Varying的变量就需要变成相应的向量的变量,进行向量的运算操作。
向量化形状传播过程中,首先初始化迭代变量形状,迭代变量的形状一般是是跨步的或者变化的,跨步为1即为连续。其次,向量形状从不依赖于其他的值开始传播,如没有参数的调用,使用常数作为输入值的phi节点,Alloca指令等。最后,根据指令的操作数和操作符等信息,计算指令的向量形状。如对于一个加法指令,先获取其两个加法操作数的向量化形状。检查形状是否已定义,如果其中一个未定义(Undef),则返回一个未定义(Undef)的形状。然后检查形状是否具有常量步长(即每个元素之间的固定偏移量)。如果其中一个操作数形状不具有常量步长,则指令的形状为变化的(Varying)形状,且对齐为两个操作数对齐及其跨步的最大公约数。如果两个操作数形状都具有常量步长,则此加法指令的向量形状是跨步的(跨长为两个操作数形状的跨步之和),且对齐为两个操作数对齐的最大公约数。关于函数调用指令的形状计算,通过计算其函数体内各个指令及变量的形状,最后计算出来的返回值的形状即为函数调用指令的向量化形状。
具体地,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,可设计为包括包含:
将循环的入口掩码设定为循环所有入边掩码的析取,以利用掩码变量确定循环中各分支的有效性,其中,针对循环头部,设定入口掩码为Ф函数,其输入值来自循环的预头部和尾部;离开一个循环块的控制流边的掩码由循环块的入口掩码、该循环块的进入掩码和潜在的出口掩码决定,如果出口分支是条件性的,则真边的出口掩码为其入口掩码和分支条件的合取,假边的出口掩码为其入口掩码和否定分支条件的合取。
在控制流中,条件分支的存在可能会导致控制流发散,即这些分支可能会导致不同的执行路径,因为分支的条件可能对某些实例为真,而对其他实例为假。因此,所有代码都会执行,为避免副作用的产生,通过在控制流边上使用掩码(也经常称为谓词)来显式地传递控制。一个块的入口掩码是所有入边的掩码的析取。对于循环头部而言,入口掩码是一个Ф函数,其输入值来自循环的预头部和尾部。离开一个块的控制流边的掩码由块的入口掩码和该块的进入掩码和潜在的出口掩码决定。如果出口分支是条件性的,则真边的出口掩码是其入口掩码和分支条件的合取。假边的出口掩码是其入口掩码和否定的分支条件的合取。
只有当不活动实例的结果被丢弃时,控制流的线性化才是可能的。在上一节中使用掩码变量可以表示哪些分支是有效的,哪些分支是无效的。为了将无效分支的结果与有效分支的结果进行合并,从而产生一个线性指令序列,还需要在控制流连接点和循环锁存器处插入选择操作。原始CFG中的φ-函数表示在控制流图中,多个分支可能会合并为一个分支。为了将φ-函数转换为线性指令序列,可以使用选择指令来替换φ-函数。具有n个输入值的φ-函数可以被转换为n-1个连接的选择指令序列。此外,每个循环都需要结果向量,以保留那些提前离开循环的实例的循环活跃值。循环活跃值是指那些在循环迭代之间保持活动状态的值。这些值可以在循环的后续迭代中使用,或者在循环之外使用。
S104、按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
具体地,通过向量化代码转换获取目标程序的向量数据,可设计为包括:
针对向量化任务列表各循环基本块,将标量指令一对一转换为SIMD版本指令;保持向量形状统一的变量为标量形式;将函数调用指令中被调函数重新进行预转换和向量化分析,在被调函数的控制流图CFG使用掩码变量显式传递控制流边有效分支,利用选择指令对控制流边中的有效分支和无效分支进行合并,并按照指定顺序对基本块进行拓扑排序,通过控制流线性化来实现被调函数数据流向量编码;通过标量到向量的一对一映射对函数体进行向量化编码;通过获取调用指令参数及函数名生成调用指令的向量化编码。
在插入所有掩码和选择操作后,可以通过数据流表示所有的控制流,因此可以删除这些控制流。为了实现这个目标,需要按照原始CFG中的执行顺序对基本块进行排序。在G的每个可能执行过程中,如果A在B之前执行,那么在扁平化的CFG G0中,A必须在B之前。如果CFG分为两条路径,将首先执行一条路径,然后执行另一条路径。这个顺序通过递归地对G的循环树进行拓扑排序来确定。
在线性化之后,便可以开始进行实际的向量化代码转换。单个指令向量化基本上是将标量指令一对一地转换为它们的SIMD版本,例如:一个标量的add指令转换为一个向量的add指令。特别的,对于向量形状为Uniform的变量保持其标量形式,必要时可将其广播为向量。但是对于函数调用指令,需要做另外的处理。具体步骤,如图4所示,因循环向量化时并没有将循环中被调函数进行内联,所以对循环已经进行的预转换,形状分析和线性化都没有包含被调函数。因此,对于被调函数需要重新进行向量化的分析和转化等步骤,每个步骤内容可描述如下:
首先,获取被调函数,对其进行clone,为向量化被调函数做准备。在向量化之前,要对函数体内的代码进行一些准备性的转换。如,被调函数中如果还含有循环,需要对循环被简化,以确保每个循环都只有一个入边和一个回边。
接着,对被调函数声明进行向量化,包括:创建一个向量的函数名,对参数和返回值(如果有)进行向量化。然后,根据指令的操作数和操作符等信息,计算函数体内各个指令和变量的向量形状。
随后进行掩码生成确定每个基本块的入口掩码和出口掩码。选择生成阶段将原始控制流图(CFG)中的φ函数替换为选择指令,将所有的掩码和选择操作插入到代码中,并按照特定的顺序对基本块进行拓扑排序,可以对控制流进行线性化,从而实现数据流有效编码。
函数体向量化代码的生成,即为标量到向量的一对一映射,对于不能向量化的标量代码,也要对其结果打包成向量。若不能向量化的标量存在发散分支那么还要加入级联块(Cascade blocks)来实现条件分支和掩码操作。
最后,对调用指令进行向量化,获取向量的参数值和向量化函数名,生成向量化调用指令。因调用指令或许并非被所有实例执行,所以还要考虑到向量化函数调用的保护机制,以确保向量化函数的调用不会造成副作用。如果对于向量化函数调用指令,每个实例都执行或都不执行,那么可以生成更高效的代码,即在调用指令之前对其谓词进行规约。规约结果为真说明含有需要执行此基本块的实例,那么需要再检查其谓词是否是统一真(即全部需要执行),统一真那么不需要掩码判断所有实例全部执行,不是统一真那么需要根据掩码判断是否执行。规约结果为假则说明没有实例需要执行此基本块则跳到退出块。如图5所示,(a)为添加指导语句的C代码,(b)为循环体的控制流图,(c)表示对(b)中的CFG图进行if转换,将条件cond生成的掩码m1应用于BB1基本块,(d)中Reduce表示对掩码规约,通过All检测统一真谓词,BB1(nomask)基本块没有谓词。
进一步地,基于上述的方法,本发明实施例还提供一种基于指导语句的函数向量化系统,包含:指导注释模块、任务获取模块、任务分析模块和任务执行模块,其中,
指导注释模块,用于在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;
任务获取模块,用于利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;
任务分析模块,用于对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;
任务执行模块,用于按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
为验证本案方案有效性,下面结合实验数据做进一步解释说明:
在LLVM编译器基础设施中对基于指导语句的函数向量化进行实现,从ISPC基准测试和SIMD库基准测试中选取了10个基准测试对其进行评估,如表2所示。
表2选择的测试程序用例介绍表
ISPC(Intel SPMD Program Compiler)基准测试是由Intel公司开发的一种针对SIMD指令集的基准测试套件。ISPC测试主要针对图像处理算法进行优化,包括图像滤波、缩放、旋转等操作。ISPC基准测试中的程序都是基于真实世界的应用场景设计的,这样可以更好地评估不同向量编程技术在实际应用中的性能表现。Simd库(C++图像处理库)基准测试是由Yermalayeu Ihar开发的一种基准测试套件,它主要针对一些基本的数学运算进行优化。SIMD基准测试包括了各种基本的数学运算,如加法、乘法、除法、浮点数运算、卷积、矩阵乘法、排序等。SIMD基准测试的优点是它们涵盖了各种基本的数学运算,因此它们可以很好地评估自动向量化的性能。
如图6所示的加速比示意,实验结果表明,10个基准测试与标量代码相比,基于指导语句的函数向量化实现了6.949倍的平均加速比。其中,AbsDifference基准测试和AbsGradientSaturatedSum基准测试加速比高达26.259和12.125倍,通过对其源码分析,不难发现这两个基准测试中都含有嵌套for循环,对于标量的顺序执行来说,需要花费很多时间来执行。而基于指导语句的函数向量化将控制流由数据流表示,将节省大部分时间。
AbsGradientSaturatedSum基准测试中还存在函数调函数再掉函数的情况,虽然会产生一些调用开销,不过,函数之间传递的参数也是向量,返回值也是向量,中间不再需要向量转标量等转换,所以性能还是很高的。而Float32基准测试含有多个同级循环,且循环中含有较多同级函数调用,使其产生较多的开销,所以导致最终性能并没有很高的提升。
通过以上实验数据能够进一步验证,本案方案在实现全函数向量化时,可兼顾性能开销和时间成本,能够在图像处理、数据处理、机器学习、深度学习等领域中进行部署实施。
除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对步骤、数字表达式和数值并不限制本发明的范围。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的各实例的单元及方法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已按照功能一般性地描述了各示例的组成及步骤。这些功能是以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不认为超出本发明的范围。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如:只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现,相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本发明不限制于任何特定形式的硬件和软件的结合。
最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

Claims (10)

1.一种基于指导语句的函数向量化方法,其特征在于,包含:
在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;
利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;
对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;
按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
2.根据权利要求1所述的基于指导语句的函数向量化方法,其特征在于,在目标程序中调用语句所在循环处添加编译指导语句,包含:
设置编译指导语句中的启用向量化指令及向量寄存器宽度定义指令,以在目标程序开发过程中依据代码结构在调用语句所在循环处添加相应循环标识符和编译指导语句。
3.根据权利要求2所述的基于指导语句的函数向量化方法,其特征在于,利用编译器并根据编译指导语句确定目标程序中待向量化的循环,包含:
编译器前端识别调用语句所在循环中的启用向量化指令,并将其转换为对应的中间表达式形式,将循环中元数据信息进行更新并生成启用向量化指令的元数据节点和定义向量寄存器宽度的元数据节点,并对其对应元数据节点进行赋值;
编译器终端通过循环标识符获取调用语句所在循环的启用向量化指令的元数据节点值,以确定当前循环是否需要向量化,将需要向量化的循环添加至向量化任务列表中。
4.根据权利要求3所述的基于指导语句的函数向量化方法,其特征在于,对元数据节点进行赋值,包含:
将启用向量化指令的元数据节点赋值为待向量优化标识,将定义向量寄存器宽度的元数据节点赋值为指定向量寄存器宽度,且所述指定向量寄存器宽度依据处理器性能设置。
5.根据权利要求1所述的基于指导语句的函数向量化方法,其特征在于,对向量化任务列表中的各循环进行预转换和向量化分析,包含:
对循环进行简化,以确保每个循环仅有一个入边和一个回边,将循环中指定操作函数转换为基本指令,其中,指定操作函数包括程序状态修改操作函数和系统调用操作函数;并对循环中的代码进行静态分析,以跟踪确定循环中变量的向量形状。
6.根据权利要求1所述的基于指导语句的函数向量化方法,其特征在于,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,包含:
将循环的入口掩码设定为循环所有入边掩码的析取,以利用掩码变量确定循环中各分支的有效性,其中,针对循环头部,设定入口掩码为Ф函数,其输入值来自循环的预头部和尾部;离开一个循环块的控制流边的掩码由循环块的入口掩码、该循环块的进入掩码和潜在的出口掩码决定,如果出口分支是条件性的,则真边的出口掩码为其入口掩码和分支条件的合取,假边的出口掩码为其入口掩码和否定分支条件的合取。
7.根据权利要求1所述的基于指导语句的函数向量化方法,其特征在于,通过向量化代码转换获取目标程序的向量数据,包括:
针对向量化任务列表各循环基本块,将标量指令一对一转换为SIMD版本指令;保持向量形状统一的变量为标量形式;将函数调用指令中被调函数重新进行预转换和向量化分析,在被调函数的控制流图CFG使用掩码变量显式传递控制流边有效分支,利用选择指令对控制流边中的有效分支和无效分支进行合并,并按照指定顺序对基本块进行拓扑排序,通过控制流线性化来实现被调函数数据流向量编码;通过标量到向量的一对一映射对函数体进行向量化编码;通过获取调用指令参数及函数名生成调用指令的向量化编码。
8.一种基于指导语句的函数向量化系统,其特征在于,包含:指导注释模块、任务获取模块、任务分析模块和任务执行模块,其中,
指导注释模块,用于在目标程序中调用语句所在循环处添加编译指导语句,所述编译指导语句用于描述循环中函数调用指令向量化特征;
任务获取模块,用于利用编译器并根据编译指导语句确定目标程序中待向量化的循环,并将待向量化的循环添加至向量化任务列表中;
任务分析模块,用于对向量化任务列表中的各循环进行预转换和向量化分析,在目标程序的控制流图CFG使用掩码变量显式传递控制流边有效分支,并利用选择指令对控制流边中的有效分支和无效分支进行合并;
任务执行模块,用于按照目标程序控制流图中的执行顺序对向量化任务列表中各循环基本块进行排序,并通过向量化代码转换获取目标程序的向量数据。
9.一种电子设备,其特征在于,包括:
至少一个处理器,以及与所述至少一个处理器耦合连接的存储器;
其中,所述存储器存储有计算机程序,所述计算机程序能够被所述至少一个处理器执行,以实现如权利要求1~7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,
当计算机程序被执行时,能够实现如权利要求1~7任一项所述的方法。
CN202410227797.2A 2024-02-29 2024-02-29 基于指导语句的函数向量化方法及系统 Pending CN118092931A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410227797.2A CN118092931A (zh) 2024-02-29 2024-02-29 基于指导语句的函数向量化方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410227797.2A CN118092931A (zh) 2024-02-29 2024-02-29 基于指导语句的函数向量化方法及系统

Publications (1)

Publication Number Publication Date
CN118092931A true CN118092931A (zh) 2024-05-28

Family

ID=91149022

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410227797.2A Pending CN118092931A (zh) 2024-02-29 2024-02-29 基于指导语句的函数向量化方法及系统

Country Status (1)

Country Link
CN (1) CN118092931A (zh)

Similar Documents

Publication Publication Date Title
Du et al. A cost-driven compilation framework for speculative parallelization of sequential programs
Karrenberg et al. Improving performance of OpenCL on CPUs
JP3896087B2 (ja) コンパイラ装置およびコンパイル方法
US6113650A (en) Compiler for optimization in generating instruction sequence and compiling method
Dehnert et al. Compiling for the Cydra
US8171464B2 (en) Efficient code generation using loop peeling for SIMD loop code with multile misaligned statements
US8245208B2 (en) SIMD code generation for loops with mixed data lengths
US8201159B2 (en) Method and apparatus for generating data parallel select operations in a pervasively data parallel system
Allen et al. A framework for determining useful parallelism
EP0843257A2 (en) Improved code optimiser for pipelined computers
US9015688B2 (en) Vectorization of scalar functions including vectorization annotations and vectorized function signatures matching
Diamos et al. Translating GPU binaries to tiered SIMD architectures with Ocelot
Lavery et al. Modulo scheduling of loops in control-intensive non-numeric programs
Prokesch et al. A generator for time-predictable code
Sun et al. WCCV: Improving the vectorization of IF-statements with warp-coherent conditions
Hohenauer et al. A SIMD optimization framework for retargetable compilers
US20030126589A1 (en) Providing parallel computing reduction operations
CN118092931A (zh) 基于指导语句的函数向量化方法及系统
Bocchino Jr et al. Vector LLVA: a virtual vector instruction set for media processing
Rapaport et al. Streamlining whole function vectorization in C using higher order vector semantics
Rotem et al. Block unification if-conversion for high performance architectures
Haine et al. Exploring and evaluating array layout restructuring for SIMDization
Mustafa et al. Just-in-time compilation-inspired methodology for parallelization of compute intensive java code
JP4721975B2 (ja) コンパイラ装置およびコンパイル方法
Latifis et al. A Retargetable MATLAB-to-C Compiler Exploiting Custom Instructions and Data Parallelism

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination