一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于带掩码的向量指令的编译方法、电子设备和介质与流程

2022-11-13 23:45:18 来源:中国专利 TAG:


1.本发明涉及计算机技术领域,具体涉及一种用于带掩码的向量指令的编译方法、电子设备和介质。


背景技术:

2.电子设备中进行数据处理的过程如图1所示:首先用户将实现数据处理的程序代码输入电子设备10,编译器100会对接收到的程序代码进行编译,得到可执行指令或可执行文件,并将其存储至存储器200。电子设备10的操作系统会将编译后的、处理器300可以执行的可执行指令或可执行文件分配给处理器300,进行数据处理。
3.目前编译器100对接收到的包括带掩码的向量指令的程序代码进行编译时,需要通过一系列编译器内置(built-ins)接口实现带掩码的向量指令的编译。例如,对于带掩码的向量op1和向量op2的加法指令,对应的程序代码可以例如:op1=add_m(op1,op2,mask),其中mask为掩码,add_m为函数,用于调用对应合并(merge)模式的built-ins接口,其中,编译器在对该代码进行编译时,在编译后端,会确定该软件架构中,add_m函数对应的编译器内建函数(intrinsic)的编号,并根据该intrinsic编号生成对应的汇编指令或二进制指令,完成对程序代码的编译。
4.由于不同公司的编译器的软件架构不同,而不同软件架构中的intrinsic编号对应的函数不同,因此,用户在编程时需要记住不同软件架构中的各种built-ins接口对应的add_m函数,才能实现对该软件架构下对应built-ins接口的调用。用户输入的程序代码在不同软件架构中不具备通用性,导致用户编程效率低。并且为了支持带掩码的向量运算,编译器需要提供特定built-ins接口,包括merge模式的built-ins接口和zero模式的built-ins接口,软件系统开发人员需要大量时间维护这些特定built-ins接口。


技术实现要素:

5.为解决上述代码不具备通用性、编程效率低的问题,本技术实施例提供了一种用于带掩码的向量指令的编译方法、电子设备和可读存储介质。
6.第一方面,本技术实施例提供了一种用于带掩码的向量指令的编译方法,应用于电子设备,所述电子设备上安装有编译器;
7.所述方法包括:
8.所述编译器获取待编译程序;
9.所述编译器确定所述待编译程序中包括第一程序代码,且所述第一程序代码的代码形式符合预设的条件运算符表达式的形式,其中,所述第一程序代码中包括带掩码的向量指令的第一掩码、向量运算表达式和运算模式,并且所述运算模式为合并模式或置零模式;
10.所述编译器根据所述第一程序代码的所述第一掩码和所述向量运算表达式生成第一向量指令,所述第一向量指令用于表征所述第一程序代码对应的向量运算;
11.所述编译器确定所述第一程序代码的所述运算模式为置零模式,则生成第二向量指令,所述第二向量指令用于表征所述第一程序代码对应的运算模式为所述置零模式。
12.本技术实施例提供的用于带掩码的向量指令的编译方法,用户在向编译器输入程序代码时,只需要按照条件运算表达式的形式输入第一程序代码,不需要在编程时记住并调用与运算模式相关的内置接口,用户可以像普通编程那样对向量指令进行编程,提高程序代码的通用性以及编程的易用性,编程效率提高。并且编译器不需要提供关于匹配于向量指令的内置接口,编译器的接口数量减少,对于内置接口的维护成本降低。
13.此外,由于本技术实施例中不需要内置接口来进行向量运算,可以不限定向量运算的运算结果对应的变量为参与向量运算的输入变量之一。
14.在上述第一方面的一种可能的实现方式中,所述预设的条件运算符表达式中包括第一表达式、第二表达式和第三表达式,所述第二表达式位于所述第一表达式和所述第三表达式之间;
15.所述第一表达式对应所述第一程序代码中的所述第一掩码,所述第二表达式对应所述第一程序代码中的所述向量运算表达式,所述第三表达式对应所述第一程序代码中的运算模式。
16.在上述第一方面的一种可能的实现方式中,预设的条件运算符表达式中包括第一表达式、第二表达式和第三表达式,所述第二表达式位于所述第一表达式和所述第三表达式之间;
17.所述第一表达式对应所述第一程序代码中的所述第一掩码,所述第二表达式对应所述第一程序代码中的所述运算模式,所述第三表达式对应所述第一程序代码中的所述向量运算表达式。
18.在上述第一方面的一种可能的实现方式中,上述方法还包括:
19.所述编译器对所述第一掩码进行按位取反得到第二掩码;
20.所述编译器生成第二程序代码,所述第二程序代码包括所述第二掩码、所述向量运算表达式和所述运算模式;
21.所述编译器根据所述第二程序代码的所述第二掩码和所述向量运算表达式,生成第三向量指令。
22.在上述第一方面的一种可能的实现方式中,上述方法还包括:
23.若所述第一掩码不匹配于布尔向量类型,则确定所述掩码与零向量的比较结果为所述第一表达式对应的第三掩码;
24.所述方法还包括:
25.所述编译器根据所述第一程序代码的所述第三掩码和所述向量运算表达式生成第四向量指令。
26.在上述第一方面的一种可能的实现方式中,所述编译器确定所述第一程序代码的所述运算模式为置零模式,则生成第二向量指令,包括:
27.所述编译器确定所述第一程序代码的所述运算模式为置零模式;
28.所述编译器生成置零操作指令。
29.在上述第一方面的一种可能的实现方式中,上述方法还包括:
30.所述编译器确定所述第一向量指令的执行顺序位于所述第二向量指令的执行顺
序之前。
31.在上述第一方面的一种可能的实现方式中,上述方法还包括:
32.所述编译器确定所述第一程序代码的所述运算模式为归并模式;
33.所述编译器确定所述第一程序代码的返回变量与所述运算模式对应的变量不同,所述编译器生成拷贝操作指令。
34.在上述第一方面的一种可能的实现方式中,上述方法还包括:
35.所述编译器确定所述第一向量指令的执行顺序位于所述拷贝操作指令的执行顺序之后。
36.在上述第一方面的一种可能的实现方式中,上述方法还包括:
37.所述编译器确定所述待编译程序中包括第三程序代码,并且所述第三程序代码为预拷贝指令的代码或后拷贝指令的代码。
38.在上述第一方面的一种可能的实现方式中,所述编译器确定所述第一程序代码的所述运算模式为置零模式,则生成第二向量指令,包括:
39.若所述第三程序代码为所述预拷贝指令的代码,并且所述运算模式为置零模式,则生成所述第二向量指令;
40.若所述第三程序代码为所述后拷贝指令的代码,并且所述运算模式为合并模式,则生成所述第二向量指令。
41.在上述第一方面的一种可能的实现方式中,上述方法还包括:
42.所述编译器对利用指令标识对所述第二向量指令进行标识;
43.所述编译器根据所述指令标识,生成包括所述第一向量指令和所述第二向量指令的第一向量指令包。
44.第二方面,本技术实施例提供了一种用于带掩码的向量指令的编译装置,应用于电子设备,所述电子设备上安装有编译器;该装置包括:
45.程序获取模块,用于所述编译器获取待编译程序;
46.代码分析模块,用于所述编译器确定所述待编译程序中包括第一程序代码,且所述第一程序代码的代码形式符合预设的条件运算符表达式的形式,其中,所述第一程序代码中包括带掩码的向量指令的第一掩码、向量运算表达式和运算模式,并且所述运算模式为合并模式或置零模式;
47.第一指令生成模块,用于所述编译器根据所述第一程序代码的所述第一掩码和所述向量运算表达式生成第一向量指令,所述第一向量指令用于表征所述第一程序代码对应的向量运算;
48.第二指令生成模块,用于所述编译器确定所述第一程序代码的所述运算模式为置零模式,则生成第二向量指令,所述第二向量指令用于表征所述第一程序代码对应的运算模式为所述置零模式。
49.第三方面,本技术实施例提供了一种电子设备,一个或多个处理器;一个或多个存储器;一个或多个存储器存储有一个或多个程序,当一个或者多个程序被一个或多个处理器执行时,使得电子设备执行上述用于带掩码的向量指令的编译方法。
50.第四方面,本技术实施例提供了一种计算机可读存储介质,存储介质上存储有指令,指令在计算机上执行时使所述计算机执行上述用于带掩码的向量指令的编译方法。
51.第五方面,本技术实施例提供了一种计算机程序产品,计算机程序产品包括指令,该指令在执行时使计算机执行上述用于带掩码的向量指令的编译方法。
附图说明
52.图1所示为本技术实施例提供的一种应用场景示意图;
53.图2所示为本技术实施例提供的带掩码的向量指令的计算的操作过程示意图;
54.图3所示为本技术实施例提供的一种编译器100的编译流程示意图;
55.图4所示为本技术实施例提供的一种用于带掩码的向量指令的编译方法的流程图;
56.图5所示为本技术实施例提供的另一种用于带掩码的向量指令的编译方法的流程图;
57.图6所示为本技术实施例提供的一种电子设备的系统结构示意框图;
58.图7所示为本技术实施例提供的一种soc的结构示意图;
59.图8所示为本技术实施例提供的一种用于带掩码的向量指令的编译装置的程序模块示意图。
具体实施方式
60.本技术的说明性实施例包括但不限于一种数据处理方法、电子设备和可读存储介质。下面将结合附图对本技术的实施例作进一步地详细描述。
61.在以下的叙述中,为了使读者更好地理解本发明而提出了许多技术细节。但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本发明各权利要求所要求保护的技术方案。
62.为了更好地理解本技术实施例的方案,下面先对本技术实施例可能涉及的相关术语和概念进行介绍。
63.编译:编译是将用户程序(通常高级源语言编写的,或称源文件)转换成中间表示(intermediate representation,ir),并在ir上进行多次转换,最终生成对应的目标语言代码(通常是面向目标体系结构的汇编码或者二进制可执行码)。
64.编译器:是将用一种编程语言(源语言)编写的计算机代码翻译成另一种语言(目标语言)的软件。它一般分为三部分:前端、中端、后端。
65.向量寄存器:用于完成向量计算和/或存储向量数据的寄存器。
66.掩码寄存器:用于存储掩码数据,并且掩码数据的多位掩码与向量寄存器的数据元素对应。掩码数据中的各个掩码位的值用于控制向量寄存器对应的数据元素是否参与向量运算。
67.合并(merge)模式:不参与向量运算的向量寄存器的对应位置,在向量运算完成后,该位置的数据保留原值的运算模式。
68.置零(zero)模式:不参与向量运算的向量寄存器的对应位置,在向量运算完成后,该位置的数据置为零的运算模式。
69.内建函数(intrinsic):编译器提供的、可以预先定义或自定义的非标准编译器函数。
70.指令下降(lowering):将ir指令派发给实际处理的函数。例如,在底层虚拟机(low level virtual machine,llvm)架构中,指令下降将ir转换为selectiondag的过程,其中selectiondag可以用来描述输入的编程代码的程序流,即在指令下降前用ir表示输入的程序代码,在指令下降后,用selectiondag来描述该程序代码。
71.下面结合图1,结合电子设备10对数据处理的过程进行进一步描述。
72.如图1所示,电子设备10可以包括编译器100、存储器200和处理器300。其中,编译器100为电子设备10的硬件结构,编译器100用于对接收到的程序进行编译。存储器200和处理器300为电子设备10的硬件结构,存储器200用于存储程序,程序编译后的可执行指令等,处理器300用于进行数据处理,例如进行向量操作等。
73.可以理解,处理器300可以包括应用处理器(application processor,ap),调制解调处理器,图形处理器(graphics processing unit,gpu),图像信号处理器(image signal processor,isp),控制器,视频编解码器,数字信号处理器(digital signal processor,dsp),基带处理器,和/或神经网络处理器(neural-network processing unit,npu)等。
74.可以理解,电子设备10可以包括但不限于:膝上型计算机、台式计算机、平板计算机、手机、服务器、可穿戴设备、头戴式显示器、移动电子邮件设备、便携式游戏机、阅读器设备、电视机等。
75.具体地,当程序输入电子设备10时,编译器100会对接收到的程序进行编译,得到可执行指令或可执行文件,并将其存储至存储器200。电子设备10的系统会将编译后的、处理器300可以执行的可执行指令或可执行文件分配为处理器300,进行数据处理。
76.可以理解,处理器300可以包括执行单元301。其中,执行单元301用于执行指令,例如编译后的带掩码的向量指令,可以包括用于执行指令的电路。
77.可以理解,处理器300还可以包括寄存器组302。寄存器组302可以包括一组或多组向量寄存器311和一组或多组掩码寄存器312。其中每个向量寄存器311可以是512位、256位或128位宽,或者可以使用不同的向量宽度。每个掩码寄存器312可以包含多个掩码位,每个掩码位对应于向量寄存器311中的一个数据元素。例如,64位掩码寄存器可以用于掩码512位寄存器的64个8位数据元素。对于具有不同宽度(例如256位或128位)的向量寄存器和不同长度(例如16位、32位或64位)的数据元素,可以结合向量操作,使用不同数量的掩码位。
78.处理器300执行带掩码的向量指令,具体可以为:执行单元301可以从存储器200中读取向量指令,并获取该向量指令对应的掩码和向量操作数。执行单元301可以将读取到的掩码赋值给掩码寄存器312,将向量操作数赋值给向量寄存器311。在执行单元301执行向量指令时,可以通过掩码寄存器312中的掩码,控制向量寄存器311中对应数据元素参与向量指令中的向量运算。
79.下面结合附图,对处理器300执行带掩码的向量指令的计算的操作过程示意图。为了便于说明,图2中的每个向量寄存器311被示为具有八个数据元素。在其他实施例中,向量寄存器311中可以具有不同数量的数据元素。向量寄存器311可以是128位、256位、或512位宽,或者可以使用不同宽度。由于每个向量寄存器中有八个数据元素,结合每个向量寄存器,仅使用八个掩码位。并且,以向量运算为加法运算为例进行介绍。
80.图2所示为本技术实施例提供的一种带掩码的向量指令的计算的操作过程示意图。
81.如图2所示,向量寄存器311中可以包括向量寄存器t1和向量寄存器t2,其中,向量寄存器t1用于存储向量数据a,以及向量数据a和向量数据b的加法运算结果向量数据c,向量寄存器t2用于存储向量数据b,aj、bj的下标j用于指示向量数据中数据元素的编号。掩码寄存器k用于存储掩码,并且掩码位的值为1表示该掩码位对应的数据元素参与加法运算,掩码位的值为0表示该掩码位对应的数据元素不参与加法运算。进而,在执行a b后,向量寄存器t1、向量寄存器t2和掩码寄存器k中各数据位的数据如图2所示。
82.其中,掩码寄存器k的掩码位6、掩码位2和掩码位1对应的掩码值为0,则表示向量寄存器t1中数据元素a6、数据元素a2和数据元素a1不参与加法运算,可以根据对应的运算模式,即合并模式或置零模式确定执行加法运算后,向量寄存器t1对应数据位的取值。
83.当运算模式为合并模式,则执行加法运算后,向量寄存器t1中的数据元素c6、数据元素c2和数据元素c1保留原值不变。
84.当运算模式为置零模式,则执行加法运算后,向量寄存器t1中的数据元素c6、数据元素c2和数据元素c1的取值为零。
85.为了便于理解本技术实施例中的方法,下面结合图3对编译器100的编译过程进行介绍。
86.图3所示为本技术实施例提供的一种编译器100的编译流程示意图。
87.如图3所示,编译器100的编译过程包括三个阶段:
88.(1)前端
89.前端可以包括词法分析321、语法分析322和语义分析323。
90.其中,词法分析321可以包括:通过词法分析器逐行扫描源程序的字符,识别出源程序中的各个单词,确定各单词的类型,将识别出的单词转换成统一的机内表示,即转换成词法单元(token)形式,得到各单词的种别码及属性值。例如,源程序代码中的关键字单词,其种别码为一词一码,属性值为关键字。例如,源程序代码中的常量单词,其种别码为一型一码,属性值为常量。
91.其中,语法分析322可以包括:通过语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)。语法分析树的根节点可以为“句子”,子节点可以为组成该“句子”的各类短语、各类单词,叶子节点对应该“句子”中各单词的语法类型,例如“介词”、“冠词”、“名词”等。
92.其中,语义分析323可以包括:对语法分析树进行类型检查,比如类型绑定,类型推导,变量消解等语义相关操作。
93.(2)中端
94.中端可以包括中间表示324、代码优化325等。
95.其中,中间表示324可以包括编译器将前端的处理结果,转换成内部表示,代表源程序的语义和语法结构,编译器的各个阶段都在中间表示上进行分析或优化变换。中间表示可以为抽象语法树、反向波兰符号或3地址码等。在一些实施例中,条件运算表达式在中间表示时,可以通过(vselect)指令表示。
96.其中,代码优化325可以包括:优化改进中间表示结果,以便生成更好的目标代码,“更好”可能是以更快、更短或者能耗更低为目标。
97.(3)后端
98.后端可以包括指令选择326、寄存器分配327、指令重排328,进而生成最终的可执行指令的文件。
99.其中,指令选择326可以包括:根据代码优化的结果或优化等级,在处理器300可执行的多个指令集合中选择匹配于中端输出的指令。
100.其中,寄存器分配327可以包括:将中间表示过程中,分配到虚拟寄存器上的变量、指令等分配至物理寄存器上。其中,虚拟寄存器是抽象意义上的寄存器,即没有对应的硬件结构,物理寄存器是处理器1300上实际存在的寄存器。可以理解,图1中的处理器300的寄存器组302上的向量寄存器311和掩码寄存器312为物理寄存器。
101.其中,指令重排328可以包括:对指令选择中选择的多个指令进行分析,指令之间的数据依赖,将不具有数据依赖关系的指令设置为并行指令,具有数据依赖关系的指令按照其依赖关系设置指令执行顺序。
102.如前文所述,在目前的方案中,对于带掩码的向量指令,一般需要用户熟悉并调用向量运算对应的built-ins接口,并且由于不同软件架构的内置接口不同,用户需要记住不同软件架构的各种内置接口,实现向量运算的编程,用户编程繁琐,代码通用性低。并且软件架构需要特定built-ins接口,实现对应的向量运算,built-ins接口的维护需要耗费大量时间成本。
103.为了解决上述问题,本技术实施例提供了一种用于带掩码的向量指令的编译方法。具体地,在本技术实施例中,编译器100在对输入的程序进行编译时,对于程序代码中的向量指令代码部分,若确认该向量指令代码部分为满足条件运算表达式形式的代码,编译器100可以根据向量指令代码部分中的掩码以及向量运算生成表征带掩码的向量运算的第一向量指令,并且在条件运算表达式中的运算模式为置零模式时,可以生成用于表征运算模式的第二向量指令。其中条件运算表达式可以包括掩码、向量运算以及对应的运算模式,例如,条件运算表达式的形式是“mask?(op1 op2):a”,其中mask表示掩码,op1 op2表示向量运算,a表示运算模式。
104.本技术实施例提供的用于带掩码的向量指令的编译方法,用户在向编译器100输入程序代码时,只需要按照条件运算表达式输入程序代码中带掩码的向量指令的代码部分,不需要在编程时记住并调用与运算模式相关的内置接口,用户可以像普通编程那样对向量指令进行编程,提高程序代码的通用性以及编程的易用性,编程效率提高。并且编译器不需要提供关于匹配于向量指令的内置接口,编译器的接口数量减少,对于内置接口的维护成本降低。
105.此外,由于本技术实施例中不需要内置接口来进行向量运算,可以不限定向量运算的运算结果对应的变量为参与向量运算的输入变量之一。
106.可以理解,掩码为表示向量运算中的操作数(即前文中的向量数据)的对应位置是否参与向量运算,每个掩码位可以对应操作数的一个数据元素,即一个掩码位可以对应操作数中的1位数据,此时数据元素为1位数据,也可以对应8位数据,此时数据元素为8位数据,此对应关系与操作数的数据类型相关。在一些实施例中,掩码可以为一个二进制序列,其中0可以表示操作数中对应位置的数据元素不参与向量运算,1表示操作数中对应位置的数据参与向量运算;也可以为,0表示操作数中对应位置的数据参与向量运算,1表示操作数中对应位置的数据元素不参与向量运算,本技术对此不作限制。
107.可以理解,向量运算可以为对输入的操作数执行的逻辑运算,例如加法运算、乘法运算、移位运算、乘累加运算、累加运算等。向量运算中可以包括单种运算类型,也可以包括多种运算类型组成的混合运算,本技术对此不作限制。
108.在一些实施例中,向量运算可以为编译器链接的库文件中支持的运算,也可以为非标准编译器支持的运算,即内建函数,本技术对此不作限制。
109.可以理解,条件运算表达式可以表示为“表达式1?表达式2:表达式3”的形式,其中表达式1可以表征掩码,表达式2可以表征向量运算,表达式3可以表征运算模式,在另一些实施例中,表达式2可以表征运算模式,表达式3可以表征向量运算,表达式1可以表征掩码,本技术对此不作限制。
110.可以理解,第一向量指令为根据掩码和向量运算生成的指令,例如对于程序代码“op3=mask?(op1 op2):0”,编译器编译后生成的汇编语言的第一向量指令可以为“add.w t3,t1,t2,p0”,其中t3对应操作数op3所在的向量寄存器,t1对应操作数op2所在的向量寄存器,p0对应掩码mask所载的掩码寄存器。
111.可以理解,运算模式即前文中的置零模式和合并模式,用于指示不参与向量运算的数据位的值。进而,对于运算模式为置零模式,第二向量指令可以为赋零操作指令,用于将向量数据中不参与运算的数据位的值赋值为零,作为向量运算结果中对应数据位的值。
112.例如,对于程序代码“op3=mask?(op1 op2):0”,生成的第二向量指令可以为赋零操作指令,对应的汇编语言代码可以例如“movz.post t3”,用于将操作数op3所在的向量寄存器t3中对应于结果操作数op3中不参与向量运算的数据元素的数据位赋值为0。
113.在一些实施例中,对于运算模式为合并模式,可以生成拷贝操作指令也可以不生成拷贝操作指令,具体需要根据条件运算表达式的返回值与运算模式的参数确定。
114.例如,对于程序代码“op3=mask?(op1 op2):op4”,可以生成拷贝操作指令,对应的汇编语言代码可以例如“mov.pre t3,t4”,用于将操作数op4所在的向量寄存器t4中对应于操作数op1中不参与向量运算的数据元素的数据位的值拷贝至操作数op3所在的向量寄存器t3的对应数据位。
115.可以理解,上述示例中,对于程序代码以及汇编语言代码的举例仅作为本技术实施例的一种示例,本领域技术人员可以根据不同的高级程序语言、汇编语言进行是适应性的改变,本技术对此不作限制。
116.编译器根据条件运算符中的掩码以及向量运算生成表征带掩码的向量运算的第一向量指令,并且在条件运算表达式中的运算模式为置零模式时,可以生成用于表征运算模式的第二向量指令,具体可以包括:编译器在编译中端,即图3中的中间表示324阶段,编译器可以根据条件运算表达式生成该条件运算表达式的中间表示的vselect指令,在编译后端的指令下降过程中,即图3中的指令选择326阶段,编译器可以对vselect指令进行特定处理,即根据条件运算表达式中的向量运算、掩码,生成第一向量指令,并在条件运算表达式中的运算模式为置零模式时,生成第二向量指令。具体地,对于运算模式为置零模式,第一向量指令在第二向量指令之前。进而,处理器300在执行编译器100编译后的可执行程序时,当运算模式为置零模式时,处理器300可以先执行第一向量指令,再执行第二向量指令。
117.下面结合图4对本技术实施例中的一种用于带掩码的向量指令的编译方法进行详细介绍。
118.可以理解,由于本技术实施例中的条件运算表达式的编译,需要进行真假值的判断,即需要编译器100支持(bool)向量,因此,为了更好的实现本技术实施例中的方法,对于不支持bool向量的编程语言,需要对其进行拓展,实现对bool向量的支持。例如,opencl语言的编译器支持整型(int)向量,不支持bool向量,因此需要对opencl语言的编译器进行拓展,以实现opencl语言的编译器对bool向量的支持。
119.图4所示为本技术实施例提供的一种用于带掩码的向量指令的编译方法的流程图。
120.如图4所示,本技术实施例中的用于带掩码的向量指令的编译方法包括:
121.401:编译器100获取用户输入的程序代码。
122.可以理解,编译器获取到的程序代码可以为高级编程语言,例如c语言、c 语言、opencl语言等,本技术对此不作限制。
123.402:编译器100确定程序代码中包括表征为条件运算表达式的带掩码的向量指令的代码。
124.可以理解,条件运算表达式的形式可以表示为“表达式1?表达式2:表达式3”。其中,表达式1为bool类型数据,具有两种取值可能,0(false)和1(true),可以用来判断条件是否成立。条件成立则表达式1取值为1,条件不成立则表达式1取值为0。条件运算符“表达式1?表达式2:表达式3”可以理解为,当表达式1的取值为1时,条件运算表达式的返回值为表达式2的值;当表达式1的取值为0时,条件运算表达式的返回值为表达式3的值。
125.可以理解,表征为条件运算表达式形式的带掩码的向量指令的代码可以为“掩码变量?向量运算表达式:运算模式变量”。该带掩码的向量指令的代码可以理解为,当掩码变量的掩码位的值为1时,对应向量运算表达式中,参与向量运算的操作数中对应该掩码位的数据元素参与向量运算表达式对应的向量运算;当掩码变量的掩码位的值为0时,对应向量运算表达式中,参与向量运算的操作数中对应该掩码位的数据元素不参与向量运算表达式对应的向量运算。并且,可以根据运算模式变量,确定当掩码变量的掩码位的值为0时,该条件运算表达式的返回值中该掩码位对应的值。具体地,当运算模式变量表征运算模式为合并模式,则当掩码变量的掩码位的值为0时,条件运算表达式的返回值中该掩码位对应的值保留原向量运算表达式中的操作数对应数据元素的值不变;当运算模式变量表征运算模式为置零模式,则当掩码变量的掩码位的值为0时,条件运算表达式的返回值中该掩码位对应的值赋值为零。
126.可以理解,掩码变量的数据类型为布尔向量类型、向量运算表达式中的操作数的数据类型为向量类型,运算模式变量的数据类型为向量类型。
127.可以理解,向量运算表达式对应的向量运算可以为对输入的操作数执行的逻辑运算,例如加法运算、乘法运算、移位运算、乘累加运算、累加运算等。向量运算中可以包括单种运算类型,也可以包括多种运算类型组成的混合运算,本技术对此不作限制。
128.在一些实施例中,向量运算可以为编译器链接的库文件中支持的运算,也可以为非标准编译器支持的运算,即内建函数,本技术对此不作限制。
129.可以理解,向量运算表达式中参与向量运算的变量对应的数据存储于向量寄存器311上,掩码变量对应的数据为掩码寄存器312上。
130.在一些实施例中,表征为条件运算表达式形式的带掩码的向量指令的代码可以为“掩码变量?运算模式变量:向量运算表达式”。则编译器100在执行步骤403和步骤404之前,可以先对表达式1对应的掩码变量的向量数据进行按位取反,并且交换表达式2和表达式3中的内容。例如,对于程序代码“op3=mask?0:(op1 op2)”,编译器100判断表达式2对应运算模式向量0,则编译器100在执行步骤403和步骤404生成第一向量指令和第二向量指令之前,会生成一个关于“mask”的按位取反指令,将掩码向量中的0和1进行反转。例如,将图2中掩码寄存器k的掩码由“10111001”按位取反,得到掩码“01000110”。并且,编译器100将表达式2对应的0向量和表达式3对应的加法运算表达式进行交换,即对该条件运算表达式进行修改,得到条件运算符表达式“op3=mask?(op1 op2):0”,此时,mask为按位取反后的掩码向量。
131.在一些实施例中,若编译器100判断条件运算表达式中的向量运算表达式对应的函数为编译器的intrinsic函数,则编译器100可以确定该软件架构中,intrinsic函数与intrinsic编号的对应关系,确定该intrinsic函数对应的built-ins接口和生成的指令。进而编译器可以执行下述步骤404和步骤404。
132.在一些实施例中,编译器100执行步骤402之后,可以对条件运算表达式中的表达式1,即掩码变量进行判断,判断该掩码变量是否为bool向量。若为bool向量,则继续执行步骤403和步骤404;否则,需要将掩码变量与0向量进行比较,比较结果返回值即为掩码变量对应的bool向量。例如,输入的程序代码中的条件运算表达式中的掩码变量为整型向量,则编译器100判断该掩码变量为非bool向量,则编译器100可以生成将该整型向量与0向量进行比较的比较指令,并将该比较指令的返回值作为条件运算表达式中的表达式1。
133.在一些实施例中,编译器100在执行步骤403之前,可以经过编译前端和编译中端,将程序代码进行中间表示以及优化。其中,在编译中端,编译器100可以在例如图3中的中间表示324阶段,根据条件运算表达式生成该条件运算表达式的中间表示的vselect指令。
134.可以理解,对于条件运算符表达式,编译器100可以对其进行中间表示,得到vselect指令。
135.403:编译器100根据带掩码的向量指令的代码中的掩码变量、向量运算表达式,生成第一向量指令。
136.可以理解,第一向量指令为根据掩码和向量运算生成的指令。该第一向量指令中可以包括向量运算返回值对应的向量寄存器、向量运算指令、向量运算对应的向量寄存器、掩码对应的掩码寄存器。
137.在一些实施例中,步骤403中根据带掩码的向量指令的代码中的掩码变量、向量运算表达式,生成第一向量指令,具体包括:编译器在编译后端,即在编译后端的指令下降过程中,即图3中的指令选择326阶段,编译器可以对中间表示阶段根据条件运算表达式生成的vselect指令进行处理。即编译器100可以根据条件运算表达式中的向量运算、掩码,生成包括向量运算返回值对应的向量寄存器、向量运算指令、向量运算对应的向量寄存器、掩码对应的掩码寄存器的第一向量指令。
138.例如,对于程序代码“op3=mask?(op1 op2):0”,编译器编译后生成的汇编语言中的第一向量指令可以为“add.w t3,t1,t2,p0”,其中t3对应操作数op3所在的向量寄存器,t1对应操作数op2所在的向量寄存器,p0对应掩码mask所载的掩码寄存器,add.w表示对长度为32位的向量数据进行加法运算。
139.404:编译器100确定带掩码的向量指令的代码中的运算模式为置零模式,则生成第二向量指令。
140.可以理解,运算模式即前文中的置零模式和合并模式,用于指示不参与向量运算的数据位的值。进而,对于运算模式为置零模式,第二向量指令可以为赋零操作指令,用于将向量数据中不参与运算的数据位的值赋值为零,作为向量运算结果中对应数据位的值。
141.例如,对于程序代码“op3=mask?(op1 op2):0”,生成的第二向量指令可以为赋零操作指令,对应的汇编语言代码可以例如“movz.post t3”,用于将操作数op3所在的向量寄存器t3中对应于结果操作数op3中不参与向量运算的数据元素的数据位赋值为0。
142.在一些实施例中,对于运算模式为合并模式,可以生成拷贝操作指令也可以不生成拷贝操作指令,具体需要根据条件运算表达式的返回值与运算模式的参数确定。
143.例如,对于程序代码“op3=mask?(op1 op2):op4”,可以生成拷贝操作指令,对应的汇编语言代码可以例如“mov.pre t3,t4”,用于将操作数op4所在的向量寄存器t4中对应于操作数op1中不参与向量运算的数据元素的数据位的值拷贝至操作数op3所在的向量寄存器t3的对应数据位。例如,对于程序代码“op3=mask?(op1 op2):op3”,则可以不生成拷贝操作指令。
144.在一些实施例中,步骤404具体包括:在编译后端的指令下降过程中,即图3中的指令选择326阶段,编译器可以对vselect指令进行特定处理,在确定条件运算表达式中的运算模式为置零模式时,生成第二向量指令。
145.在一些实施例中,编译器100可以在指令重排阶段,对第一向量指令和第二向量指令的执行顺序进行排序。具体地,对于运算模式为置零模式,第一向量指令在第二向量指令之前。进而,处理器300在执行编译器100编译后的可执行程序时,当运算模式为置零模式时,处理器300可以先执行第一向量指令,再执行第二向量指令。
146.在一些实施例中,对于基于运算模式为合并模式生成的拷贝操作指令,第一向量指令在拷贝操作指令之后。进而,处理器300在执行编译器100编译后的可执行程序时,处理器300可以先执行第二向量指令,再执行第一向量指令。
147.在一些实施例中,编译器100可以将第一向量指令和第二向量指令进行打包。例如,对于程序代码“op3=mask?(op1 op2):0”,可以生成如下第一向量指令和第二向量指令:
148.{add.w t3,t1,t2,p0;
149.movz.post t3;}
150.其中,各参数的含义在前文中已作说明,在此不作赘述。
151.再例如,对于程序代码“op3=mask?(op1 op2):op3”,可以生成如下第一向量指令,不需要生成第二向量指令:
152.{add.w t3,t1,t2,p0;}
153.其中,各参数的含义在前文中已作说明,在此不作赘述。
154.再例如,对于程序代码“op3=mask?(op1 op2):op4”,可以生成如下第一向量指令和第二向量指令:
155.{mov.pre t3,t4;
156.add.w t3,t1,t2,p0;}
157.其中,各参数的含义在前文中已作说明,在此不作赘述。
158.本技术实施例提供的用于带掩码的向量指令的编译方法,用户在向编译器100输入程序代码时,只需要按照条件运算表达式输入程序代码中带掩码的向量指令的代码部分,不需要在编程时记住并调用与运算模式相关的内置接口,用户可以像普通编程那样对向量指令进行编程,提高程序代码的通用性以及编程的易用性,编程效率提高。并且编译器不需要提供关于匹配于向量指令的内置接口,编译器的接口数量减少,对于内置接口的维护成本降低。
159.此外,由于本技术实施例中不需要内置接口来进行向量运算,可以不限定向量运算的运算结果对应的变量为参与向量运算的输入变量之一。
160.下面结合图5对本技术实施例提供的另一种用于带掩码的向量指令的编译方法进行。介绍。可以理解,在本实施例中,编译器100对应的超长指令字(very long instruction word,vlim)架构包括预拷贝(pre-move)指令和后拷贝(post-move)指令,并且编译器100支持bool向量类型。
161.图5所示为本技术实施例提供的另一种用于带掩码的向量指令的编译方法的流程图。
162.如图5所示,本技术实施例中的用于带掩码的向量指令的编译方法包括:
163.501:编译器100获取用户输入的程序代码。其中,步骤501与步骤401相同,在此不作赘述。
164.502:编译器100确定程序代码中包括表征为条件运算表达式的带掩码的向量指令的代码以及目标拷贝代码。
165.可以理解,表征为条件运算表达式形式的带掩码的向量指令的代码与步骤402相似,其区别在于,本实施例中运算模式变量固定不变,可以为0向量或条件运算表达式的返回值对应的变量。即在本实施例中,编译器100具有默认的运算模式,默认为置零模式或默认为合并模式,用户不需要对该表达式进行更改设置。
166.可以理解,目标拷贝代码可以为预拷贝指令的代码,也可以为后拷贝指令的代码。用户可以通过目标指令代码,对编译器100的默认运算模式进行修改。具体将在下面的步骤504中进行介绍,在此不作赘述。
167.503:编译器100根据带掩码的向量指令的代码中的掩码变量、向量运算表达式,生成第一向量指令。其中,步骤503与步骤403相同,在此不作赘述。
168.504:编译器100根据目标拷贝代码和带掩码的向量指令的代码中的运算模式变量,确定带掩码的向量指令的目标运算模式。
169.可以理解,第二向量指令可以为预拷贝指令或后拷贝指令。其中,预拷贝指令用于保持默认运算模式不变,后拷贝指令用于改变默认运算模式。
170.例如,当条件运算表达式中的运算模式变量表征编译器100的默认运算模式为合并模式时,并且程序代码中的目标拷贝代码为预拷贝指令的代码时,生成的预拷贝指令对应的目标运算模式为合并模式;当条件运算表达式中的运算模式变量表征编译器100的默认运算模式为合并模式时,并且程序代码中的目标拷贝代码为后拷贝指令的代码时,生成的后拷贝指令对应的目标运算模式为置零模式。
171.505:编译器100确定目标运算模式为置零模式时,生成第二向量指令,并对第二向
量指令通过指令标识进行标记。其中,步骤505与步骤404中生成的第二向量指令与生成方法相同,在此不作赘述。
172.可以理解,对第二向量指令通过指令标识进行标记,具体可以包括:编译器100在指令描述中,对第二向量指令进行标记。
173.在一些实施例中,对于运算模式为合并模式,可以生成拷贝操作指令也可以不生成拷贝操作指令,具体需要根据条件运算表达式的返回值变量与运算模式的变量确定。
174.例如,对于程序代码“op3=mask?(op1 op2):op4”,可以生成拷贝操作指令,对应的汇编语言代码可以例如“mov.pre t3,t4”,用于将操作数op4所在的向量寄存器t4中对应于操作数op1中不参与向量运算的数据元素的数据位的值拷贝至操作数op3所在的向量寄存器t3的对应数据位。例如,对于程序代码“op3=mask?(op1 op2):op3”,则可以不生成拷贝操作指令。
175.506:编译器100根据第二向量指令的指令标识,生成包括第一向量指令和第二向量指令的向量指令包。
176.可以理解,步骤506为编译器100根据指令标识,将第一向量指令和第二向量指令进行打包,例如通过中括号将第一向量指令和第二向量指令包括在一个指令包里。步骤501中输入的程序代码可以对应多个指令包。每个指令包中可以包括至少两条指令。
177.图6所示为本技术实施例提供的一种应用于本技术实施例中的方法的电子设备的系统结构示意框图。
178.电子设备600可以包括耦合到系统控制逻辑603的一个或多个处理器601。对于至少一个实施例,系统控制逻辑603经由诸如前端总线(fsb)之类的多分支总线、诸如快速通道互连(qpi)之类的点对点接口、或者类似的连接与处理器601进行通信。处理器601执行控制一般类型的数据处理操作的指令。在一些实施例中,系统控制逻辑603包括,但不局限于,图形存储器系统控制逻辑(gmch)(未示出)和输入/输出中枢(ioh)(其可以在分开的芯片上)(未示出),其中gmch包括存储器和图形控制器并与ioh耦合。
179.电子设备600还可包括耦合到系统控制逻辑603的协处理器602和存储器604。或者,存储器和gmch中的一个或两者可以被集成在处理器内(如本技术中所描述的),存储器604和协处理器602直接耦合到处理器601以及系统控制逻辑603,系统控制逻辑603与ioh处于单个芯片中。存储器604可以是例如动态随机存取存储器(dram)、相变存储器(pcm)或这两者的组合。在一个实施例中,协处理器602诸如例如高吞吐量mic处理器、网络或通信处理器、图形处理器、gpgpu、或嵌入式处理器等等。具体地,本技术实施例中的用于带掩码的向量指令的编译方法应用于图6中的协处理器602或处理器601,可以理解,协处理器602或处理器601即为图1中的处理器300。
180.在一个实施例中,电子设备600可以进一步包括网络接口(nic)606。网络接口606可以包括收发器,用于为电子设备600提供无线电接口,进而与任何其他合适的设备(如前端模块,天线等)进行通信。在各种实施例中,网络接口606可以与电子设备600的其他组件集成。网络接口606可以实现上述实施例中的通信单元的功能。
181.电子设备600可以进一步包括输入/输出(i/o)设备605。i/o 605可以包括:用户界面,该设计使得用户能够与电子设备600进行交互;外围组件接口的设计使得外围组件也能够与电子设备600交互;和/或传感器设计用于确定与电子设备600相关的环境条件和/或位
置信息。
182.值得注意的是,图6仅是示例性的。即虽然图6中示出了电子设备600包括处理器601、系统控制逻辑603、存储器604等多个器件,但是,在实际的应用中,使用本技术各方法的系统,可以仅包括电子设备600各器件中的一部分器件,例如,可以仅包含处理器601和nic 606。图6中可选器件的性质用虚线示出。
183.图7所示为本技术实施例提供的一种soc的结构示意图。在图7中,相似的部件具有同样的附图标记。另外,虚线框是更先进的soc的可选特征。在图7中,soc 700包括:互连单元705,其被耦合至处理器701;系统代理单元707;总线控制器单元708;集成存储器控制单元704;一组或一个或多个协处理器702,其可包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(sram)单元703;直接存储器存取(dma)单元706。在一个实施例中,协处理器701包括专用处理器,诸如例如网络或通信处理器、gpgpu、高吞吐量mic处理器、或嵌入式处理器等等。其中的处理器701和协处理器702可对应于图1中的处理器300。
184.图8所示为本技术实施例提供的一种用于带掩码的向量指令的编译装置800的程序模块示意图,可以用于执行本技术实施例提供的用于带掩码的向量指令的编译方法,例如执行前述步骤401至步骤404,本技术实施例提供了一种用于带掩码的向量指令的编译装置,应用于电子设备,电子设备上安装有编译器;该装置包括:
185.程序获取模块801,用于编译器获取待编译程序;
186.代码分析模块802,用于编译器确定待编译程序中包括第一程序代码,且第一程序代码的代码形式符合预设的条件运算符表达式的形式,其中,第一程序代码中包括带掩码的向量指令的第一掩码、向量运算表达式和运算模式,并且运算模式为合并模式或置零模式;
187.第一指令生成模块803,用于编译器根据第一程序代码的第一掩码和向量运算表达式生成第一向量指令,第一向量指令用于表征第一程序代码对应的向量运算;
188.第二指令生成模块804,用于编译器确定第一程序代码的运算模式为置零模式,则生成第二向量指令,第二向量指令用于表征第一程序代码的运算模式为置零模式。
189.本技术公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本技术的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
190.可将程序代码应用于输入指令,以执行本技术描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本技术的目的,处理系统包括具有诸如例如数字信号处理器(dsp)、微控制器、专用集成电路(asic)或微处理器之类的处理器的任何系统。
191.程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。包括但不局限于opencl、c语言、c 、java等。而对于c 、java之类语言,由于其会将存储进行转换,基于对于本技术实施例中的数据处理方法的应用会有些差异,本领域技术人员可以基于具体地高级语言进行变换,均不脱离本技术实施例的范围。
192.在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所
公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、只读存储器(cd-roms)、磁光盘、只读存储器(rom)、随机存取存储器(ram)、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如,计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
193.在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
194.需要说明的是,本技术各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本技术所提出的技术问题的关键。此外,为了突出本技术的创新部分,本技术上述各设备实施例并没有将与解决本技术所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
195.需要说明的是,在本专利的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
196.虽然通过参照本技术的某些优选实施例,已经对本技术进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本技术的精神和范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献