CN114924748A - 编译方法、装置及设备 - Google Patents
编译方法、装置及设备 Download PDFInfo
- Publication number
- CN114924748A CN114924748A CN202210613339.3A CN202210613339A CN114924748A CN 114924748 A CN114924748 A CN 114924748A CN 202210613339 A CN202210613339 A CN 202210613339A CN 114924748 A CN114924748 A CN 114924748A
- Authority
- CN
- China
- Prior art keywords
- intermediate representation
- instruction
- thread
- scalar
- input
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 43
- 230000006870 function Effects 0.000 claims description 8
- 230000001419 dependent effect Effects 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 9
- 238000004364 calculation method Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 238000013473 artificial intelligence Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000004590 computer program Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本公开实施例提供一种编译方法、装置、设备及存储介质。针对单指令多线程架构的芯片,如果这类芯片中包括用于执行标量指令的标量执行单元,以及用于执行向量指令的向量执行单元时,在将源程序编译成这类芯片执行的机器指令时,可以通过对该源程序的中间表示进行识别,筛选出线程束中各线程的处理数据完全一样的指令的中间表示,并将该中间表示编译成标量机器指令,以通过标量指令执行单元执行,从而无需利用向量执行单元中的各基本处理单元重复的对同样的数据进行处理,可以节省功耗和计算资源。另外,相比于将这类中间表示编译成向量机器指令,将这类中间表示编译成标量机器指令也以缩减执行时间。
Description
技术领域
本公开涉及人工智能技术领域,尤其涉及一种编译方法、装置及设备。
背景技术
类似于GPU的单指令多线程架构的芯片被广泛应用于人工智能技术领域。这一类的芯片的基本调度单元中可以包括多个基本处理单元(即多个内核),可以在每个基本处理单元中运行一个线程,从而可以利用一个基本调度单元中运行的多个线程并行的执行同指令中的多组数据。目前,在将源程序编程成可供这类芯片执行的机器指令时,还无法很好地基于这些芯片的结构特点确定适配该芯片的最优编译方案,从而影响该类芯片的处理效率或者利用率。
发明内容
本公开提供一种编译方法、装置、设备及存储介质。
根据本公开实施例的第一方面,提供一种编译方法,用于编译可供目标芯片执行的机器指令,所述目标芯片包括多个处理器,每个处理器包括多个基本处理单元,所述多个基本处理单元被划分为至少一个标量指令执行单元以及至少一个向量指令执行单元,每个向量指令执行单元对应一个线程束,所述方法包括:
获取待编译的源程序对应的中间表示;
在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的所述线程束中各线程的源操作数和执行结果均相同。
在一些实施例中,在判定所述中间表示不符合预设条件的情况下,将所述中间表示编译成向量机器指令,所述向量机器指令由所述向量执行单元执行。
在一些实施例中,每个处理器还包括共享寄存器,以及与每个所述基本处理单元对应的私有寄存器,所述共享寄存器可供所述标量指令执行单元以及所述向量指令执行单元中的各基本处理单元访问,所述私有寄存器可供与所述私有寄存器对应的基本处理单元访问,所述方法还包括:
在将所述中间表示编译成标量机器指令的情况下,为所述标量机器指令的源操作数和执行结果分配所述共享寄存器;和/或
在将所述中间表示编译成向量机器指令的情况下,为所述向量机器指令中各线程对应的源操作数和执行结果分配所述线程对应的私有寄存器。
在一些实施例中,所述判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和执行结果均相同,包括:
在判定用执行于执行所述中间表示对应的指令的线程束中的各线程不存在分支,且所述中间表示的输入以及输出均为所述线程束中的各线程的共享变量或常数的情况下,判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和目标操作执行结果均相同。
在一些实施例中,在所述中间表示的输入或输出为变量且不符合以下任一条件的情况下,判定所述中间表示的输入或输出是所述线程束中的各线程的共享变量:
所述中间表示的输入或输出依赖于所述线程束中的线程的私有变量;
所述中间表示的输入或输出被初始化为所述线程束中的线程的私有变量。
在一些实施例中,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出依赖于线程束中的线程的私有变量:
所述中间表示的输入或输出目标指令块中的变量,所述目标指令块依赖于所述私有变量。
在一些实施例中,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出被初始化为线程束中的线程的私有变量:
所述中间表示的输入或输出被初始化为获取线程束中的线程的执行结果;
所述中间表示的输入或输出被初始化为原子操作的执行结果;
所述中间表示的输入或输出被初始化为加载指令的执行结果,且所述加载指令对应的地址空间为线程束中线程的私有存储空间;
所述中间表示的输入或输出被初始化为设备端device函数中的参数。
在一些实施例中,所述将所述中间表示编译成标量机器指令,包括:
获取所述中间表示对应的指令的特征信息,所述特征信息包括指令类型、源操作数类型以及执行结果的类型;
基于所述特征信息将所述中间表示编译成标量机器指令。
根据本公开实施例的第二方面,提供一种编译装置,用于编译可供目标芯片执行的机器指令,所述目标芯片包括多个处理器,每个处理器包括多个基本处理单元,所述多个基本处理单元被划分为至少一个标量指令执行单元以及至少一个向量指令执行单元,每个向量指令执行单元对应一个线程束,所述装置包括:
获取模块,用于获取待编译的源程序对应的中间表示;
编译模块,用于在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的所述线程束中各线程的源操作数和执行结果均相同。
根据本公开实施例的第三方面,提供一种电子设备,所述电子设备包括处理器、存储器、存储在所述存储器可供所述处理器执行的计算机指令,所述处理器执行所述计算机指令时,可实现上述第一方面提及的方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,所述存储介质上存储有计算机指令,所述计算机指令被执行时实现上述第一方面提及的方法。
本公开实施例中,针对单指令多线程架构的芯片,如果这类芯片中包括用于执行标量指令的标量执行单元,以及用于执行向量指令的向量执行单元时,在将源程序编译成这类芯片执行的机器指令时,可以通过对该源程序的中间表示进行识别,筛选出线程束中各线程的处理数据完全一样的指令的中间表示,并将该中间表示编译成标量机器指令,以通过标量指令执行单元执行,从而无需利用向量执行单元中的各基本处理单元重复的对同样的数据进行处理,可以节省功耗和计算资源。另外,在某些场景,相比于将这类中间表示编译成向量机器指令,将这类中间表示编译成标量机器指令也可以节省执行时间。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。
图1是本公开实施例的一种GPU的架构示意图。
图2是本公开实施例的一种GPU的架构示意图。
图3是本公开实施例的一种目标芯片的架构示意图。
图4是本公开实施例的一种编译方法的流程图。
图5是本公开实施例的一种编译方法的示意图。
图6是本公开实施例的一种编译装置的逻辑结构示意图。
图7是本公开实施例的一种设备的逻辑结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
为了使本技术领域的人员更好的理解本公开实施例中的技术方案,并使本公开实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本公开实施例中的技术方案作进一步详细的说明。
类似于GPU的单指令多线程架构的芯片被广泛应用于人工智能技术领域。这一类的芯片的基本调度单元中可以包括多个基本处理单元(即多个内核),可以在每个基本处理单元中运行一个线程,从而可以利用一个基本调度单元中运行的多个线程并行的执行同一个指令中的多组数据。举个例子,假设要执行一条指令:Ci=Ai+Bi(i=0-31),一个基本调度单元中可以包括32个基本处理单元,因而可以利用该基本调度单元中的32个基本处理单元并行的处理这条指令中的32组数据的加法运算。
如图1所示,为一种GPU的示意图,该GPU中可以包括多个SM(StreamingMultiprocessor,流多处理器),每个SM中包括多个SP(Streaming Process,基本处理单元),即内核(core),可以将多个SP划分成一个或多个分组,每个分组中的多个SP作为一个基本调度单元,用于共同执行同一条指令。通常一个基本调度单元对应一个线程束(Warp),基本调度单元中的每个SP对应线程束中的一个线程。比如,一般可以将32个SP作为一个基本调度单元,该基本运调度单元中运行一个包括32个线程的线程束,线程束中的线程可以并行地对同一个指令中的多组数据进行处理。
当然,GPU之所以采用上述架构,是为了方便执行一些向量指令,比如同一条指令中对应多组数据,因而,可以分别利用基本调度单元中的各个SP分别计算一组数据,从而实现并行处理,提高处理效率。但是,在有些场景中,执行某个指令的线程束中的多个线程的源操作数和执行结果可能都是一样的。举个例子,假设要执行一条指令:Ci=Ai+Bi(i=0-31),其中,所有Ai一样,所述Bi也一样,计算结果Ci也一样。由于GPU中一个线程束中的线程必须执行同一条指令,这种情况下,相当于针对同样的计算,需要在多个线程中重复的执行,这样无疑会浪费计算资源。
此外,由于针对每个线程,均需在GPU中设置一个或多个与该线程对应的私有寄存器,用于存储该线程的私有变量,仅供运行该线程的SP访问。当指令的线程束中的多个线程的源操作数和执行结果都是一样的情况下,由于每个线程都需要存储相同的源操作数和执行结果,这无疑会增加每个线程占用寄存器的数量。然而GPU中的寄存器是有限的,每个线程占用的寄存器越多,那么一个GPU中可以活跃的线程数量就越少,导致GPU中的SP的利用率不高。
基于此,又提出一种GPU架构,其结构示意图如图2所示,每个SM中可以包括多个SP,这多个SP可以划分成至少一个标量指令执行单元和至少一个向量指令执行单元,其中,每个标量指令执行单元可以由一个SP构成,用于执行标量指令。向量指令执行单元可以由多个SP构成,这多个SP共同执行同一条向量指令。其中,向量指令执行单元是向量指令的基本调度单元,一个向量指令执行单元对应一个线程束,该向量指令执行单元中的每个SP对应线程束中的一个线程。针对线程束中各线程束的源操作数和执行结果均一致的这类指令,可以将其编译成标量机器指令,然后由该标量指令执行单元执行,无需利用向量指令单元中的各SP均执行一次。其中,在GPU中除了可以设置与每个线程对应的私有寄存器,还可以设置共享寄存器,共享寄存器为向量指令执行单元中的各SP,以及标量指令执行单元均可以访问的寄存器,用于存储线程束中各线程的共享变量。
很明显,在上述架构的GPU中,专门设置标量指令执行单元,用于执行上述线程束中各线程束的源操作数和执行结果均一致的指令,可以将线程束中各线程均要执行的同一操作统一由标量指令执行单元执行,再将执行结果存储于共享寄存器中,以便线程束的线程可以调用。相比于利用线程束中各线程均执行一次,可以大大节省功耗。此外,由于每个SM中的寄存器的数量有限,如果将线程束中各线程共享的变量统一存储到共享寄存器中,无需在每个线程的私有寄存器中均存储,那么每个线程占用的私有寄存器的数量会大大减小,从而一个SM中即可以存在更多活跃的线程,提高GPU的利用率。
针对类似上述架构的芯片,相关的一些技术方案中,在将源程序对应的中间表示编译成供上述架构的芯片执行的机器指令时,通常会逐一为各中间表示匹配所有可能的编译方式,比如,分别将中间表示编译成标量机器指令以及向量机器指令,然后基于确定的每种中间表示的编译方式对应的编译代价得到整个源程序的编译方案对应的编译代价,其中,编译代价可以用该编译方案中指令消耗的各类别的寄存器的数量来衡量。然后选择编译代价最小的编译方案作为这段源程序最终的编译方案。由于各中间表示对应的各种编译方式对应的编译代价是基于人为经验估计的,所以,难以衡量编译得到的机器指令在硬件上真正的执行时间和功耗,并不一定能给出最优的编译方案。
基于此,本公开实施例提供了一种编译方法,该编译方法可用于将源程序对应的中间表示编译成可供目标芯片执行的机器指令。其中,该目标芯片可以是单指令多线程架构的芯片,比如GPU,或者类似的芯片。如图3所示,该目标芯片包括多个处理器,每个处理器中包括多个各基本处理单元,其中,每个基本处理单元可以是芯片中的一个内核(core),这些基本处理单元可以划分成至少一个标量指令执行单元以及至少一个向量指令执行单元。每个标量指令执行单元可以包括一个基本处理单元,每个向量指令执行单元可以包括多个基本处理单元,即多个内核,每个向量执行单元对应一个线程束,每个向量指令执行单元中的每个基本处理单元对应线程束中的一个线程。其中,向量指令执行单元(或线程束)为向量指令的基本调度单元,每执行一个向量指令时,均调用一个向量指令执行单元执行,向量指令执行单元的所有基本处理单元均执行同一指令。
需要指出的是,每个目标芯片包括的处理器数量,以及每个向量指令执行单元中的基本单元数量不局限于图中示出的,这些均可以基于实际需求灵活设置。
该编译方法如图4所示,可以包括以下步骤:
S402、获取待编译的源程序对应的中间表示;
在步骤S402中,可以获取待编译的源程序对应的中间表示。编译器在将源程序编译成机器指令时,通常会先将源程序编译成中间表示,然后再将中间表示编译成机器指令。其中,中间表示可以是后缀表示、图形表示、三地址代码等,其中,图形表示可以是有向无环图等,具体的中间表示的方式可以根据实际需求设置,本公开实施例不做限制。
S404、在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的线程束中各线程的源操作数和执行结果均相同。
在步骤S404中,在获取源程序的中间表示后,可以判定该中间表示是否符合预设条件,其中,该预设条件可以是用于执行该中间表示对应的指令的线程束中各线程的源操作数和执行结果均相同,即各线程处理的数据完全一样。通常,在单指令多线程架构的芯片中,会为每个指令分配一个线程束,线程束中的所有线程都用于执行该指令。所以,如果确定该中间表示对应的指令的线程束中各线程的源操作数和执行结果都相同的话,就没有必要利用线程束去执行该指令,导致资源浪费。这种情况下,可以将该中间表示编译成标量机器指令,然后利用目标芯片中的标量执行单元去执行该标量机器指令。
通过对中间表示进行识别,筛选出线程束中各线程的处理数据完全一样的指令的中间表示,并将其编译成标量机器指令,以通过标量指令执行单元执行,从而无需利用向量执行单元中各基本单元重复对相同的数据进行处理,可以节省功耗和计算资源。另外,在某些场景,相比于将这类中间表示编译成向量机器指令,将这类中间表示编译成标量机器指令也可以缩减执行时间。
在一些实施例中,如果判定所述中间表示不符合预设条件,比如,假设执行该中间表示对应的指令的线程束中存在源操作数或执行结果不同的线程,则可以将该中间表示编译成向量机器指令,然后利用目标芯片中的向量执行单元执行该向量机器指令。当某条指令需要处理多组不同的数据,因而利用向量指令执行单元中的多个基本处理单元并行地处理这多组数据可以提高处理效率,因而,针对这类指令,可以优先将其编译成向量指令。
在一些实施例中,每个处理器还包括共享寄存器,以及与每个基本处理单元对应的私有寄存器,共享寄存器可供标量指令执行单元以及向量指令执行单元中的各基本处理单元访问,私有寄存器仅供与该私有寄存器对应的基本处理单元访问。比如,通常每个处理器中可以包括多个寄存器,因而可以将这多个寄存器中的一部分作为共享寄存器,共享寄存器用于存储线程束中各线程的共享变量或者常数,以便标量指令执行单元以及向量指令执行单元中的各基本处理单元均可以访问,并获取寄存器中存储的数据。同时,针对向量指令执行单元中的各基本处理单元(线程束中的各线程),可以为其分配一个或多个私有寄存器,比如,通常可以为每个基本处理单元分配64-256个寄存器,用于存储运行在该基本处理单元上的线程的私有变量,仅供该基本处理单元访问。
在一些实施例中,在确定将中间表示编译成标量机器指令的情况下,可以为该标量机器指令的源操作数和执行结果分配共享寄存器,从而该标量指令执行单元可以从共享寄存器中读取该标量机器指令的源操作数,并进行计算,然后将计算结果也存储到共享寄存器中。后续如果该计算结果是其他向量机器指令的源操作数的话,则向量指令执行单元中的各基本处理单元也可以从共享寄存器中获取该计算结果。
在一些实施例中,如果确定将该中间表示编译成向量机器指令,则为该向量机器指令中的各线程对应的源操作数和执行结果分配该线程对应的私有寄存器。比如,假设该向量机器指令中包括32组源操作数和对应的执行结果,分别由32个线程执行,则可以为每一个线程对应的源操作数和执行结果分配该线程的私有寄存器。
在一些实施例中,在判定用于执行该中间表示对应的指令的线程束中各线程的源操作数和执行结果是否均相同时,可以先判定该线程束中各线程是否存在分支,如果存在分支,则必然不符合条件。如果不存在分支,则进一步判定该中间表示的输入和输出是否为线程束中各线程的共享变量,或者判定该中间表示的输入和输出是否为常数(立即数),如果符合两者中的一个,则认为该指令对应的线程束中各线程的源操作数和执行结果相同,即可以编译成标量机器指令。其中,中间表示的输入为该中间表示对应的指令的源操作数,输出为该中间表示对应的指令的执行结果。
在一些实施例中,在判定中间表示的输入或输出是否为线程束中的各线程的共享变量时,由于共享变量不好直接判定,因此,可以判定该中间表示的输入或输出是否为线程的私有变量,如果不是私有变量,则认为其是共享变量。比如,如果该中间表示的输入或输出符合以下任一条件,则认为其是线程束中线程的私有变量。通常,中间表示的输入或输出为私有变量一般存在两种情况,一种情况是该中间表示的输入或输出依赖于线程束中的某个线程的私有变量,则该中间表示必然也是私有变量,其中,依赖于私有变量可以直接依赖,也可以间接依赖,举个例子,假设中间表示的输入为c,c=a+b,而a为线程束中某个线程的执行结果,即c直接依赖于私有变量a。再比如,假设中间表示的输入为c,c=a+b,a=e*f,而e为线程束中某个线程的执行结果,即c间接依赖于私有变量e。此外,由于变量存在一个初始化的过程,所以,另一种情况是该中间表示的输入或输出在初始化的过程中被初始化为私有变量。所以,在判定中间表示的输入或输出是否为私有变量,可以从以上两个角度进行考虑。
通常,如果一个指令块依赖于私有变量,那么该指令块中涉及的所有变量均为私有变量。所以,在一些实施例中,在判定中间表示的输入或输出是否依赖于线程束中的线程的私有变量时,如果中间表示对应的指令为目标指令块中的指令,而该目标指令块依赖于私有变量,那么可以判定该中间表示的输入和输出均为私有变量。
在判定中间表示的输入或输出在初始化的过程中是否被初始化为私有变量,则可以通过以下情形进行判定。比如,在一些场景,该中间表示的输入或输出被初始化为读取线程束中的线程的执行结果,则可以判定其为私有变量。通常,线程束中的各线程均有一个编号,因而可以将中间表示的输入或输出初始化为某个编号的线程对应的执行结果,这种情况下,则可以认为该中间表示为私有变量。
在一些场景,如果中间表示的输入或输出被初始化为原子操作的执行结果,则可以判定其为私有变量。
在一些场景,如果中间表示的输入或输出被初始化为加载指令(Load指令)的执行结果,且该加载指令对应的地址空间为线程束中线程的私有存储空间,则判定其为私有变量。
在一些实施例中,如果该中间表示的输入或输出被初始化为设备段函数,即device函数中的参数,则也可以判定其为私有变量。
当然,私有变量的判定的方式比较多,不局限于以上各种方式。
在一些实施例中,在将中间表示编译成标量机器指令时,可以获取该中间表示对应的指令的特征信息,该特征信息可以是指令类型,比如,指令是数据传输指令,还是运算类的指令;该特征信息也可以是源操作数类型或执行结果的类型,比如,源操作数或执行结果是整数,还是浮点数等。在确定指令的上述特征信息后,则可以基于该特征信息将中间表示编译成标量机器指令。
为了进一步解释本公开实施例提供的编译方法,以下结合一个具体的实施例加以解释。
如图2所示,为一种GPU的示意图,针对该种架构的GPU,在编译供该GPU执行的机器指令时,为了提升GPU的利用率,尽量减少线程束中每个线程占用寄存器的数量,提高GPU中每个SM中活跃线程的数量,从而节省执行时间,可以采用如图5所示的方法对源程序进行编译。
可以先确定待编译的源程序对应的中间表示,该中间表示可以是有向无环图。然后可以从这些中间表示中识别出可以编译成标量机器指令的中间表示,其中,当该中间表示对应的指令的线程束中各线程不存在分支,且该中间表示的输入和输出均匀线程束中各线程的共享变量或常数时,则认为其可以编译成标量机器指令。针对这一类中间表示,可以优先将这类中间表示编译成标量机器指令,并为该标量机器指令的源操作数和执行结果分配GPU的SM中的共享寄存器,然后利用GPU中的标量指令执行单元执行该标量机器指令。否则,可以将中间表示编译成向量机器指令,并为该向量机器指令中各线程对应的源操作数和执行结果分配该线程的私有寄存器。通过GPU中的向量指令执行单元执行该向量机器指令。
具体的,当某个中间表示的输入或输出如果是变量,在判定该中间表示的输入或输出是否为共享变量时,可以判定该中间表示的输入或输出是否符合以下条件,如果符合以下任一条件,则认为其是私有变量,否则其为共享变量:
(1)该中间表示的输入或输出是读取的某个线程的执行结果。
(2)该中间表示的输入或输出是原子操作的执行结果。
(3)该中间表示的输入或输出以数据依赖的方式,依赖于其他的私有变量。
(4)该中间表示的输入或输出是load指令的执行结果,同时load指令对应的地址空间是线程私有的地址空间。
(5)该中间表示的输入或输出是device函数的参数。
(6)该中间表示的输入或输出是某个指令块中的变量,该指令块依赖于私有变量。
通过这种方式对源程序进行编译,针对线程束中各线程的源操作数和执行结果均相同的指令的中间表示,可以编译成标量机器指令,由标量指令执行单元执行,相比于编译成向量机器指令,用向量指令执行单元执行,可以节省计算资源。并且利用共享寄存器存储该指令的操作数和执行结果,可以无需在每个线程私有寄存器存储相同的变量,可以减少每个线程对寄存器的消耗,增加SM中的活跃线程。
其中,不难理解,上述各实施例中的描述的方案在不存在冲突的情况,可以进行组合,本公开实施例中不一一例举。
相应的,本公开实施例还提供了一种编译装置,所述装置用于编译可供目标芯片执行的机器指令,所述目标芯片包括多个处理器,每个处理器包括多个基本处理单元,所述多个基本处理单元被划分为至少一个标量指令执行单元以及至少一个向量指令执行单元,每个向量指令执行单元对应一个线程束,如图6所示,所述装置60包括:
获取模块61,用于获取待编译的源程序对应的中间表示;
编译模块62,用于在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的所述线程束中各线程的源操作数和执行结果均相同。
在一些实施例中,在判定所述中间表示不符合预设条件的情况下,将所述中间表示编译成向量机器指令,所述向量机器指令由所述向量执行单元执行。
在一些实施例中,每个处理器还包括共享寄存器,以及与每个所述基本处理单元对应的私有寄存器,所述共享寄存器可供所述标量指令执行单元以及所述向量指令执行单元中的各基本处理单元访问,所述私有寄存器可供与所述私有寄存器对应的基本处理单元访问,所述编译装置还用于:
在将所述中间表示编译成标量机器指令的情况下,为所述标量机器指令的源操作数和执行结果分配所述共享寄存器;和/或
在将所述中间表示编译成向量机器指令的情况下,为所述向量机器指令中各线程对应的源操作数和执行结果分配所述线程对应的私有寄存器。
在一些实施例中,所述编译装置用于判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和执行结果均相同时,具体用于:
在判定用执行于执行所述中间表示对应的指令的线程束中的各线程不存在分支,且所述中间表示的输入以及输出均为所述线程束中的各线程的共享变量或常数的情况下,判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和目标操作执行结果均相同。
在一些实施例中,在所述中间表示的输入或输出为变量且不符合以下任一条件的情况下,判定所述中间表示的输入或输出是所述线程束中的各线程的共享变量:
所述中间表示的输入或输出依赖于所述线程束中的线程的私有变量;
所述中间表示的输入或输出被初始化为所述线程束中的线程的私有变量。
在一些实施例中,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出依赖于线程束中的线程的私有变量:
所述中间表示的输入或输出目标指令块中的变量,所述目标指令块依赖于所述私有变量。
在一些实施例中,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出被初始化为线程束中的线程的私有变量:
所述中间表示的输入或输出被初始化为获取线程束中的线程的执行结果;
所述中间表示的输入或输出被初始化为原子操作的执行结果;
所述中间表示的输入或输出被初始化为加载指令的执行结果,且所述加载指令对应的地址空间为线程束中线程的私有存储空间;
所述中间表示的输入或输出被初始化为设备端device函数中的参数。
在一些实施例中,所述编译模块用于将所述中间表示编译成标量机器指令时,具体用于:
获取所述中间表示对应的指令的特征信息,所述特征信息包括指令类型、源操作数类型以及执行结果的类型;
基于所述特征信息将所述中间表示编译成标量机器指令。
其中,上述装置执行编译方法的具体步骤可以参考上述方法实施例中的描述,在此不再赘述。
进一步的,本公开实施例还提供一种电子设备,如图7所示,所述设备包括处理器71、存储器72、存储于所述存储器72可供所述处理器71执行的计算机指令,所述处理器71执行所述计算机指令时实现上述实施例中任一项所述的方法。
本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述任一实施例所述的方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本公开实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本公开实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本公开实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本公开实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开实施例的保护范围。
Claims (11)
1.一种编译方法,其特征在于,用于编译可供目标芯片执行的机器指令,所述目标芯片包括多个处理器,每个处理器包括多个基本处理单元,所述多个基本处理单元被划分为至少一个标量指令执行单元以及至少一个向量指令执行单元,每个向量指令执行单元对应一个线程束,所述方法包括:
获取待编译的源程序对应的中间表示;
在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的所述线程束中各线程的源操作数和执行结果均相同。
2.根据权利要求1所述的方法,其特征在于,在判定所述中间表示不符合预设条件的情况下,将所述中间表示编译成向量机器指令,所述向量机器指令由所述向量执行单元执行。
3.根据权利要求1或2所述的方法,其特征在于,每个处理器还包括共享寄存器,以及与每个所述基本处理单元对应的私有寄存器,所述共享寄存器可供所述标量指令执行单元以及所述向量指令执行单元中的各基本处理单元访问,所述私有寄存器可供与所述私有寄存器对应的基本处理单元访问,所述方法还包括:
在将所述中间表示编译成标量机器指令的情况下,为所述标量机器指令的源操作数和执行结果分配所述共享寄存器;和/或
在将所述中间表示编译成向量机器指令的情况下,为所述向量机器指令中各线程对应的源操作数和执行结果分配所述线程对应的私有寄存器。
4.根据权利要求1-3任一项所述的方法,其特征在于,判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和执行结果均相同,包括:
在判定用于执行所述中间表示对应的指令的线程束中的各线程不存在分支,且所述中间表示的输入以及输出均为所述线程束中的各线程的共享变量或常数的情况下,判定用于执行所述中间表示对应的指令的线程束中各线程的源操作数和目标操作执行结果均相同。
5.根据权利要求4所述的方法,其特征在于,在所述中间表示的输入或输出为变量且不符合以下任一条件的情况下,判定所述中间表示的输入或输出是所述线程束中的各线程的共享变量:
所述中间表示的输入或输出依赖于所述线程束中的线程的私有变量;
所述中间表示的输入或输出被初始化为所述线程束中的线程的私有变量。
6.根据权利要求5所述的方法,其特征在于,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出依赖于线程束中的线程的私有变量:
所述中间表示的输入或输出目标指令块中的变量,所述目标指令块依赖于所述私有变量。
7.根据权利要求5所述的方法,其特征在于,在所述中间表示的输入或输出符合以下任一条件的情况下,判定所述中间表示的输入或输出被初始化为线程束中的线程的私有变量:
所述中间表示的输入或输出被初始化为获取线程束中的线程的执行结果;
所述中间表示的输入或输出被初始化为原子操作的执行结果;
所述中间表示的输入或输出被初始化为加载指令的执行结果,且所述加载指令对应的地址空间为线程束中线程的私有存储空间;
所述中间表示的输入或输出被初始化为设备端device函数中的参数。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述将所述中间表示编译成标量机器指令,包括:
获取所述中间表示对应的指令的特征信息,所述特征信息包括指令类型、源操作数类型以及执行结果的类型;
基于所述特征信息将所述中间表示编译成标量机器指令。
9.一种编译装置,其特征在于,用于编译可供目标芯片执行的机器指令,所述目标芯片包括多个处理器,每个处理器包括多个基本处理单元,所述多个基本处理单元被划分为至少一个标量指令执行单元以及至少一个向量指令执行单元,每个向量指令执行单元对应一个线程束,所述装置包括:
获取模块,用于获取待编译的源程序对应的中间表示;
编译模块,用于在判定所述中间表示符合预设条件的情况下,将所述中间表示编译成标量机器指令,所述标量机器指令由所述标量指令执行单元执行,其中,所述预设条件包括:用于执行所述中间表示对应的指令的所述线程束中各线程的源操作数和执行结果均相同。
10.一种电子设备,其特征在于,所述设备包括处理器、存储器、存储于所述存储器可供所述处理器执行的计算机指令,所述处理器执行所述计算机指令时实现如权利要求1-8任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述存储介质上存储有计算机指令,所述计算机指令被执行时实现如权利要求1-8任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210613339.3A CN114924748A (zh) | 2022-05-31 | 2022-05-31 | 编译方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210613339.3A CN114924748A (zh) | 2022-05-31 | 2022-05-31 | 编译方法、装置及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114924748A true CN114924748A (zh) | 2022-08-19 |
Family
ID=82812697
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210613339.3A Pending CN114924748A (zh) | 2022-05-31 | 2022-05-31 | 编译方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114924748A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115934102A (zh) * | 2022-12-29 | 2023-04-07 | 格兰菲智能科技有限公司 | 通用寄存器动态分配方法、装置、计算机设备和存储介质 |
CN115951936A (zh) * | 2023-01-17 | 2023-04-11 | 上海燧原科技有限公司 | 向量化编译程序的芯片适配方法、装置、设备及介质 |
-
2022
- 2022-05-31 CN CN202210613339.3A patent/CN114924748A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115934102A (zh) * | 2022-12-29 | 2023-04-07 | 格兰菲智能科技有限公司 | 通用寄存器动态分配方法、装置、计算机设备和存储介质 |
CN115934102B (zh) * | 2022-12-29 | 2023-12-12 | 格兰菲智能科技有限公司 | 通用寄存器动态分配方法、装置、计算机设备和存储介质 |
CN115951936A (zh) * | 2023-01-17 | 2023-04-11 | 上海燧原科技有限公司 | 向量化编译程序的芯片适配方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9477465B2 (en) | Arithmetic processing apparatus, control method of arithmetic processing apparatus, and a computer-readable storage medium storing a control program for controlling an arithmetic processing apparatus | |
US8782645B2 (en) | Automatic load balancing for heterogeneous cores | |
US11175920B2 (en) | Efficient work execution in a parallel computing system | |
US9672035B2 (en) | Data processing apparatus and method for performing vector processing | |
CN114924748A (zh) | 编译方法、装置及设备 | |
US20150193234A1 (en) | Register allocation for vectors | |
CN110308982B (zh) | 一种共享内存复用方法及装置 | |
CN112711478B (zh) | 基于神经网络的任务处理方法、装置、服务器和存储介质 | |
US20120331278A1 (en) | Branch removal by data shuffling | |
US9342282B2 (en) | Method and apparatus for dynamic data configuration | |
US20140257769A1 (en) | Parallel algorithm for molecular dynamics simulation | |
JP2019049843A (ja) | 実行ノード選定プログラム、実行ノード選定方法及び情報処理装置 | |
KR20150101870A (ko) | 메모리의 뱅크 충돌을 방지하기 위한 방법 및 장치 | |
Hochberg | Matrix multiplication with cuda-a basic introduction to the cuda programming model | |
CN108021563B (zh) | 一种指令间数据依赖的检测方法和装置 | |
CN116976432A (zh) | 一种支持任务并行处理的芯片模拟方法、装置和芯片模拟器 | |
US8959497B1 (en) | System and method for dynamically spawning thread blocks within multi-threaded processing systems | |
US11573777B2 (en) | Method and apparatus for enabling autonomous acceleration of dataflow AI applications | |
Zhao et al. | ISPA: Exploiting Intra-SM Parallelism in GPUs via Fine-Grained Resource Management | |
Kojecky et al. | CUDA-based analytic programming by means of SOMA algorithm | |
CN117591242B (zh) | 基于底层虚拟机的编译优化方法、系统、存储介质及终端 | |
Singh et al. | Snowpack: Efficient parameter choice for GPU kernels via static analysis and statistical prediction | |
CN117313595B (zh) | 用于功能验证的随机指令生成方法、设备及系统 | |
US20240248764A1 (en) | Efficient data processing, arbitration and prioritization | |
CN116301874A (zh) | 代码编译方法、电子设备及存储介质 |
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 |