首页> 中国专利> 面向异构SIMD扩展部件的自动向量化方法

面向异构SIMD扩展部件的自动向量化方法

摘要

本发明涉及高性能计算自动并行化领域,特别涉及一种面向异构SIMD扩展部件的自动向量化方法,适用于不同向量长度、不同向量指令集的异构SIMD扩展部件,设计一套虚拟指令集,能够在自动向量化统一架构下将输入的C和Fortran程序转化为虚拟指令的中间表示,通过向量长度解虚拟化和指令集解虚拟化,自动变换为面向异构SIMD扩展部件的向量化代码,使程序员从繁冗复杂的手工向量化编码中解脱出来,本发明将向量化方法与相关优化方法相结合,从不同粒度进行向量识别,通过常规优化和引用点优化,最大限度的发掘循环级和基本块级的混合并行性,通过分析跨越基本块的数据依赖,对生成后的代码进行冗余优化,有效提升了程序的执行效率。

著录项

  • 公开/公告号CN103279327A

    专利类型发明专利

  • 公开/公告日2013-09-04

    原文格式PDF

  • 申请/专利权人 中国人民解放军信息工程大学;

    申请/专利号CN201310155403.9

  • 申请日2013-04-28

  • 分类号G06F9/34(20060101);

  • 代理机构41111 郑州大通专利商标代理有限公司;

  • 代理人陈大通

  • 地址 450002 河南省郑州市俭学街7号

  • 入库时间 2024-02-19 20:03:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-06-16

    未缴年费专利权终止 IPC(主分类):G06F9/34 授权公告日:20151125 终止日期:20160428 申请日:20130428

    专利权的终止

  • 2015-11-25

    授权

    授权

  • 2013-10-09

    实质审查的生效 IPC(主分类):G06F9/34 申请日:20130428

    实质审查的生效

  • 2013-09-04

    公开

    公开

说明书

技术领域

本发明涉及高性能计算自动并行化领域,特别涉及一种面向异构SIMD扩 展部件的自动向量化方法。

背景技术

人类对计算能力无休止的需求,使得并行计算技术越来越受到人们的重视, 总体上并行硬件技术的发展要远远快于并行软件技术的发展。SIMD扩展部件为 提升程序性能提供了硬件支持,为充分发挥SIMD扩展的性能,需要充分发掘程 序中的并行性,开发具有良好可扩展性的向量化程序。

如今计算问题规模庞大、计算量大,手工编写向量化程序难度较大,自动 向量化技术通过分析程序中语句操作和数据的特征,识别出串行程序中可以向 量化的代码部分,不需要程序员对程序进行修改就可以在编译器下进行向量化 编译,使程序员摆脱繁琐及手工易错的向量化代码编写工作,提高代码的重用 性。

传统向量化技术是较早使用且较为成熟的技术,其基本思想是按照循环内 的数据依赖构造相应的语句依赖图,语句依赖中不在强连通分量的语句就是可 以向量执行的语句,该方法不用考虑向量长度的影响,但是其方法也可用于向 量长度有限的SIMD扩展。

超字并行向量化思想来源于指令级并行,以基本块为单位识别出相邻且连 续的访问语句,对其中的同构语句进行打包,然后根据定义使用关系进行包扩 展,最后生成比传统向量化更有效的打包方案。

模式匹配的向量化方法需要视目标程序的特征来确定匹配的模式,首先将 循环内的指令组进行划分,以数据存取指令为起始节点构建树形结构,然后识 别基本块内的公共子表达式,最后采用数据重组算法对其中的公共子表达式进 行优化。

以上三种典型向量化方法中,传统向量化对循环进行逐层分析,当依赖为 内层循环携带依赖环时无法向量化;超字并行向量化在包生成中有一定的随机 性,可能导致最终的向量化策略和理想的结果不一致;模式匹配向量化仅是上 述两种方法的补充。这些方法仅能对具有单一的向量长度的一种SIMD指令集 生成向量化代码,其可移植性和可扩展性不强,具有一定的局限性。

发明内容

为克服现有技术中的不足,针对目前异构SIMD扩展部件具有不同向量长 度和不同指令集,本发明提供一种具有可扩展性、可移植性且灵活、高效的面 向异构SIMD扩展部件的自动向量化方法。

按照本发明所提供的设计方案,一种面向异构SIMD扩展部件的自动向量化 方法,与特定ISA(指令集架构)指令集无关的阶段包括预优化与分析、循环展开 与优化、超字并行向量化发掘,这些阶段将通过向量识别和并行性发掘,变换 为包含虚拟向量指令集信息的中间表示;向量长度解引用和指令集解虚拟化进 行虚实转换,变换得到包含特定SIMD指令集的中间表示,该自动向量化方法包 含如下步骤:

设计虚拟向量指令集,针对不同向量长度和不同向量指令集的异构SIMD扩 展部件,设计一套包括存取指令、算数运算指令、逻辑运算指令、移位指令、 选择指令、比较指令和整理指令在内的七类基本指令,且与指令集无关、与向 量长度无关、与数据类型无关的虚拟向量指令集,虚拟向量长度与具体平台指 令集架构的长度位数无关,其值

,其中Leni为不同平台的向量长度;

该值实际ISA向量长度按2n取整的最大值,由于当前大多SIMD硬件或向量 化方法支持stride(跨步)访问的向量操作,当stride为2n时具有一定的向量化收益, simd_gather和simd_scatter两种指令用来实现stride内存访问的虚拟操作,整理指 令中simd_shuffle通过掩码能够将两向量任意位置的元素进行重组,具体实现的 虚拟指令见表1,

表1虚拟向量指令集列表:

步骤2、预分析与优化,对能否进行基本块向量化进行可行性分析,首先

进行循环迭代次数分析,设置循环迭代次数阈值,分析语句向量化情况,

包含如下内容:

2.1、根据循环中语句可向量化指令个数与语句的指令总数的比例,首先判 断不同硬件平台上是否提供该条指令所对应的向量化指令,然后,对不同的指 令赋于不同的权值,通过计算语句中可向量化操作的权重,得到向量化后收益 值,当该收益值大于设定的阈值时,该语句向量化;

2.2、根据循环中可向量化语句占循环中语句总数的比例,通过步骤2.2得 到循环中可向量化语句占循环中语句总数的比例,当该值大于设定的阈值时, 该语句向量化;

2.3、根据循环中可向量化的操作个数占所有操作个数的比例,对不同的可 向量化操作赋予不同的权重,得到循环中可向量化的操作个数占所有操作个数 的比例,设定的阈值为从总体上判断循环中可向量化操作的数目,当得到的比 例值大于设定的阈值时,该语句向量化;

2.4、根据循环中访问存储器的操作个数占循环中所有操作个数的比例,设 定的阈值为从总体上判断循环访问存储器的操作数目,当得到的比例值大于设 定的阈值时,该语句向量化;

步骤3、引用点分析与优化,包含如下步骤:

3.1、数组引用点对齐分析,基本块向量化模块建立数组引用点的对齐信息, 计算循环外或者循环内数组引用点对齐信息,并建立引用点到对齐信息的映射;

3.2、确定循环展开因子,在循环内分析相邻地址引用,收集所有迭代间连 续的引用点连续地址偏移,通过虚拟向量长度确定展开因子:

unroll_factor=LenvGCD(Lenv,offset1,...,offseti,...),其中offseti为不同引用点的连续地 址偏移;

3.3、循环剥离,确定循环剥离因子,实施循环剥离变换;

3.4、循环展开,按照循环展开因子进行循环展开变换;

3.5、多版本优化,当引用点的数组首地址不可知,或数组某一维不可知,或 某一维线性下标中有符号量,通过多版本优化来确定其对齐信息;

步骤4:超字并行向量化发掘,包含:

4.1、将基本块中的语句进行三地址化,引入寄存器,每条语句转化为原子操 作,并更新定义-使用关系图和数组依赖图;

4.2、向量化发掘,向量化发掘的对象为基本块,采用使用定义链优先搜索的 超字并行发掘方式,按照虚拟向量长度对应的虚拟向量寄存器槽位数对同构 语句进行组合;

4.3、向量化发掘根据收益分析进行判断,构建代价模型,统计所有向量化操 作相比较对应的标量操作所节省的时延开销,同时减去数据重组所带来的时 延开销,并对产生收益的语句进行向量化打包,每个包及其间的操作分别与 虚拟向量和虚拟向量指令对应;

步骤5:向量长度解虚拟化,为保证虚拟向量长度能够转化为不同长度的物理向 量,打包进虚拟向量的基本操作数为打包进物理向量操作数的倍数,向量长度 解虚拟化包含如下步骤:

5.1、依据向量间、标量间和向量与标量间的依赖关系构建语句依赖图;

5.2、根据实际向量长度和虚拟向量长度对向量进行切分;

5.3、在语句依赖图的基础上按照拓扑顺序对向量操作进行切分;

5.4、基本块内的所有SIMD向量操作进行切分后,进行循环展开或压紧的反 变换;

5.5、通过步骤5.4反变换后得到具有特定向量长度的SIMD虚拟指令;

步骤6:指令集解虚拟化,由虚拟指令向具体平台指令集进行映射,具体步 骤如下:

6.1、在依赖关系图的基础上依次分析每条虚拟指令;

6.2、若能进行一对一向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,返回步骤6.1;若不能进行一对一向量指令映射,则进入步骤 6.3;

6.3、若能进行多对一向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,返回步骤6.1;若不能进行多对一向量指令映射,则进入步骤 6.4;

6.4、若能进行一对多向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,返回步骤6.1;若不能进行一对多向量指令映射,则进入步骤 6.5;

6.5、若能进行一对多标量指令映射和转换,返回步骤6.1;

6.6、对依赖关系图中的所有语句进行遍历后,得到具体平台向量ISA的实际 向量指令;

步骤7:向量化代码优化,针对基本块间的冗余操作,以基本块为单位构建 控制流图和数据流图,发掘基本块间的数据依赖,在基本块间建立各个变量打 包、拆包的收益模型,在相邻基本块间进行向量化代码优化。

所述具体平台为Intel,或AMD,或DSP,或申威。

所述步骤3.4还包含如果待展开循环中有归约操作且归约语句与循环内其 它语句无依赖时,对归约变量进行重命名,在该循环前加上归约初始化部分, 该循环后面加上归约结束处理。

本发明面向异构SIMD扩展部件的自动向量化方法的有益效果:

1.本发明面向异构SIMD扩展部件的自动向量化方法适用于不同向量长度和 不同向量指令集的异构SIMD扩展部件,通过设计一套虚拟指令集,能够 在自动向量化统一架构下将输入的C和Fortran程序转化为虚拟指令的中 间表示,通过向量长度解虚拟化和指令集解虚拟化,自动变换为面向异 构SIMD扩展部件的向量化代码,使程序员从繁冗复杂的手工向量化编码 中解脱出来。

2.本发明面向异构SIMD扩展部件的自动向量化方法将向量化方法与相关优 化方法相结合,从不同粒度进行向量识别,通过常规优化和引用点优化, 最大限度的发掘了循环级和基本块级的混合并行性,并通过分析跨越基 本块的数据依赖,对生成后的代码进行跨基本块冗余优化,有效提升了 程序的执行效率。

附图说明:

图1是本发明面向异构SIMD扩展部件的自动向量化方法架构示意图;

图2是本发明中向量长度解虚拟化流程;

图3是本发明中指令集解虚拟化流程。

具体实施方式:

参见图1~3,针对本发明予以详细描述,一种面向异构SIMD扩展部件的自 动向量化方法具体实施步骤如下:

1虚拟向量指令集

虚拟指令集包括存取指令、算数运算指令、逻辑运算指令、移位指令、选 择指令、比较指令和整理指令共七类基本指令,这些指令是从不同长度、不同 SIMD指令集中抽象出来的基本向量操作,可看作原子指令,特定SIMD指令集 架构中的特殊指令可以通过虚拟指令的序列组合实现。实际指令集中具有128 位、160位、256位、320位和512位等多种不同的向量长度,非2n位数的向量长度 一般含有符号位扩展,虚拟向量长度与具体指令集架构的长度位数无关,其值

,其中Leni为不同平台的向量长度。

该值实际ISA向量长度按2n取整的最大值。由于当前大多SIMD硬件或向 量化方法支持stride(跨步)访问的向量操作,当stride为2n时具有一定的向量化收 益,simd_gather和simd_scatter两种指令用来实现stride内存访问的虚拟操作。 整理指令中simd_shuffle将重组操作抽象到一般,通过掩码能够将两向量任意位 置的元素进行重组。

2预分析与优化

对循环向量化时会耗费一定的编译时间用于程序分析和代码生成,如基本 块向量化指令的打包策略需要在全空间搜索同构指令的组成策略,循环展开与 优化时需要对循环体部分确定对齐信息和优化等。因此并不是所有的循环都适 合进行向量化变换,通过在对循环作基本块向量化分析和变换之前进行循环可 向量化的预分析,可以减少编译时间、避免盲目优化。

主要从下面五个方面,对循环进行基本块向量化预分析。

(1)循环迭代次数。如果循环迭代次数过少,其执行时间所占程序运行时 间比例很低,即使采用最佳的向量化策略,对于整个程序性能的提高也是有限 的,因此通过设置循环迭代次数阈值,可以避免对执行迭代次数少的循环进行 向量化,从而降低程序编译时间。

(2)语句中可向量化指令个数与语句中指令总数的比例。一条指令首先判 断不同硬件平台上是否提供相应的向量化指令。然后,对不同的指令赋于不同 的权值,用来区别向量化后得到的收益。通过计算语句中可向量化操作的权重, 得到向量化后收益值。当该值大于设定的阈值时,就认为该语句值得向量化。

(3)循环中可向量化语句占循环中语句总数的比例。通过第二条标准可以 得到循环中可向量化语句占循环中语句总数的比例,当该值大于某个阈值时, 可以预测出该循环向量化后收益的大致趋势。

(4)循环中可向量化的操作个数占所有操作个数的比例。该阈值是从总体 上判断循环中可向量化操作的数目,同样采用对不同可向量化操作赋予不同权 重的方法。

(5)循环中访存操作个数占循环中所有操作个数的比例。该阈值可以从总 体上判断循环访存的操作数目。这是因为,在一般情况下与标量运算相比,向 量访存操作带宽利用率更高,局部性更好;而标量的软流水对非内存操作的优 化更高。

3引用点分析与优化

分析引用点的对齐信息,并进行相关的程序优化来静态确定更多引用点的 数据对齐信息。对循环中的每个引用点计算出其相对于向量因子的数据偏移, 根据循环中数组引用的起始地址是否对齐来判断该循环是否需要进行多版本变 换,从而可以产生更为高效的向量化代码。其主要目的是通过循环展开,发掘 更大力度的并行性。

引用点分析与优化主要从以下五个方面展开:

(1)数组引用点对齐分析。为基本块向量化模块建立数组引用点的对齐信 息,计算循环外或者循环内数组引用点对齐信息,并且建立引用点到对齐信息 的映射。

(2)确定循环展开因子。在循环内通过相邻地址分析尽大限度的发掘相邻 的地址引用,在收集所有在迭代间连续的引用点连续地址偏移的基础上,通过 虚拟向量长度确定展开因子:

unroll_factor=LenvGCD(Lenv,offset1,...,offseti,...),其中offseti为不同引用点的连续地址 偏移。

确定展开因子后,便于后期处理做循环展开变换。

(3)循环剥离。确定循环剥离因子,实施循环剥离变换,便于后续生成对 齐访存代码。

(4)循环展开。按照该循环展开因子进行循环展开变换,如果待展开循环 中有归约操作且归约语句与循环内其它语句无依赖时,对归约变量进行重命名, 在该循环前加上归约初始化部分,后面加上归约结束处理。

(5)多版本优化。对于引用点的数组首地址不可知,数组某一维不可知, 或某一维线性下标中有符号量的情况,通过多版本优化来确定其对齐信息。在 多版本优化之后,把版本条件信息传到对齐分析模块并重新做一次对齐分析。

4超字并行向量化发掘

对于基本块内部的向量化发掘,在预优化的基础上应用基本块向量化技术进 行基本块内的向量化指令选择,确定基本块中各个操作是向量还是标量执行; 对于向量执行方式,还应确定各个操作数在向量寄存器中的顺序。

基本块向量化发掘时,包大小为虚拟向量长度Lenv,先根据地址的相邻和对 齐关系建立初始pack集,然后沿依赖图的遍历顺序通过使用定义链实现包扩展, 采用搜索树的方法,以目标机上的SIMD向量化收益模型为基础进行启发式的搜 索和扩展,最后选择收益最大的包生成方法从而确定一条完整的最优路径,并 在包生成之后删除冗余的装载包和对三地址化的语句进行恢复。在向量化发掘 的后续优化中,根据数据使用的上下文对向量化发掘结果进行调整,如将某些 标量执行语句转换为向量执行语句以减少重组操作。

5.向量长度解虚拟化

进行超字并行向量化发掘后得到了具有虚拟向量长度的虚拟向量指令,为将 虚拟向量长度能够转化特定SIMD架构的向量长度,需要进行向量长度的解虚拟 化,其步骤如下。

5.1201依据向量间、标量间和向量与标量间的依赖关系构建语句依赖图;

5.2202根据实际向量长度和虚拟向量长度对向量进行切分;

5.3203在语句依赖图的基础上按照拓扑顺序对向量操作进行切分,206虚拟 向量长度为Lenv,207实际向量长度为Lens,存在关系Lenv=2n*Lens, 一条连续的SIMD装载操作将被切分为Lenv/Lens条长度为Lens的连续 的SIMD装载操作;

5.4204在对基本块内的所有SIMD向量操作进行切分后,对其适合于进行循 环展开与压紧反变换;

5.5205为在204变换后得到具有特定向量长度Lens的SIMD虚拟指令。

6.指令集解虚拟化

指令集解虚拟化是由虚拟指令向特定平台指令集进行映射,具体步骤如下:

6.6301在语句依赖图的基础上依次分析每条虚拟指令;

6.7302若能进行一对一向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,转6.1;若不能进行一对一向量指令映射,则转6.3;

6.8303若能进行多对一向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,转6.1;若不能进行多对一向量指令映射,则转6.4;

6.9304若能进行一对多向量指令映射,则直接将虚拟向量指令转化为实际向 量指令,转6.1;若不能进行一对多向量指令映射,则转6.5;

6.10305进行一对多标量指令映射和转换,转6.1。

对依赖关系图中的所有语句进行遍历后,生成得到在特定向量ISA的实际向 量指令。

7向量化代码优化

生成特定平台向量指令后,在基本块边界可能产生大量冗余操作,其主要 原因是超字并行的向量化发掘针对基本块展开,未对跨基本块间的打包、拆包 的冗余操作进行分析。针对基本块间的冗余操作,以基本块为单位构建控制流 图和数据流图,发掘基本块间的数据依赖,在基本块间建立各个变量打包、拆 包的收益模型,在相邻基本块间进行向量化代码优化,避免生成低效、冗余的 向量化代码。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号