CN117348935A - 指令处理方法、装置、计算机设备和存储介质 - Google Patents

指令处理方法、装置、计算机设备和存储介质 Download PDF

Info

Publication number
CN117348935A
CN117348935A CN202311322456.5A CN202311322456A CN117348935A CN 117348935 A CN117348935 A CN 117348935A CN 202311322456 A CN202311322456 A CN 202311322456A CN 117348935 A CN117348935 A CN 117348935A
Authority
CN
China
Prior art keywords
instruction
dependency
body structure
information
instructions
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
CN202311322456.5A
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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202311322456.5A priority Critical patent/CN117348935A/zh
Publication of CN117348935A publication Critical patent/CN117348935A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • 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

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请涉及一种指令处理方法、装置、计算机设备、存储介质和计算机程序产品。所述方法包括:获取属于循环体结构的多个指令之间的指令依赖信息;所述指令依赖信息中包括所述多个指令之间的指令执行依赖关系;当确定所述循环体结构满足依赖关系更新条件,将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;基于所述更新后的指令依赖信息中的指令执行依赖关系对所述多个指令的并行执行方式进行重建,得到针对所述多个指令的指令调度信息;所述指令调度信息,用于按照重建后的并行执行方式调度所述多个指令进行并行执行。采用本方法能够提高指令级并行度。

Description

指令处理方法、装置、计算机设备和存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种指令处理方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
随着人工智能技术的不断发展和应用,从智能家居设备延伸到广告推送、仓库机器人、自动驾驶等领域,极大地改变了人们的日常生活。为了提高处理器性能,计算机往往会同时调度多条指令并行执行,以满足人们越来越重要的实时性需要。对于调度多条指令的并行执行处理,可以通过指令级并行度描述正在并行或同时执行的指令数量,从而量化处理器性能提升效果。
然而,由于各种指令之间存在依赖关系,对各种指令并行执行产生了约束,如某一指令的执行触发依赖于另一指令的执行结束,导致大量指令无法调度并行执行,使得指令级并行度较低。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高指令级并行度的指令处理方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
第一方面,本申请提供了一种指令处理方法,包括:
获取属于循环体结构的多个指令之间的指令依赖信息;指令依赖信息中包括多个指令之间的指令执行依赖关系;
当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;
基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到针对多个指令的指令调度信息;指令调度信息,用于按照重建后的并行执行方式调度多个指令进行并行执行。
第二方面,本申请还提供了一种指令处理装置,包括:
指令依赖信息获取模块,用于获取属于循环体结构的多个指令之间的指令依赖信息;指令依赖信息中包括多个指令之间的指令执行依赖关系;
指令依赖信息更新模块,用于当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;
指令调度信息获得模块,用于基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到针对多个指令的指令调度信息;指令调度信息,用于按照重建后的并行执行方式调度多个指令进行并行执行。
第三方面,本申请还提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以上指令处理方法的各步骤。
第四方面,本申请还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以上指令处理方法的各步骤。
第五方面,本申请还提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以上指令处理方法的各步骤。
上述指令处理方法、装置、计算机设备、存储介质和计算机程序产品,获取循环体结构的多个指令之间的指令依赖信息,在确定循环体结构满足依赖关系更新条件的情况下,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,并基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到用于按照重建后的并行执行方式调度多个指令进行并行执行的指令调度信息。对于满足依赖关系更新条件的循环体结构,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,减少了循环体结构中各指令执行之间的依赖关系,从而减少了调度循环体结构的多个指令进行并行执行的约束,为指令调度提供了更大的操作空间,提高了指令级并行度。
附图说明
图1为一个实施例中指令处理方法的应用环境图;
图2为一个实施例中指令处理方法的流程示意图;
图3为一个实施例中更新指令依赖信息的流程示意图;
图4为一个实施例中编译器处理的示意图;
图5为一个实施例中基于别名分析解决内存依赖的流程示意图;
图6为一个实施例中编译优化的流程示意图;
图7为一个实施例中指令调度优化的流程示意图;
图8为一个实施例中未优化的有向无环图的示意图;
图9为一个实施例中节点搜索的示意图;
图10为一个实施例中优化后有向无环图的示意图;
图11为一个实施例中指令处理装置的结构框图;
图12为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例提供的指令处理方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以单独设置,也可以集成在服务器104上,也可以放在云上或其他服务器上。终端102可以向服务器104发送指令执行请求,如终端102可以向服务器104发送样本数据,以由服务器104基于样本数据进行人工神经网络的训练处理,在进行人工神经网络的训练处理过程中,服务器104可以涉及到对各种指令的处理,如可以基于编译器进行源代码的编译处理。在针对执行处理过程中,服务器104获取循环体结构的多个指令之间的指令依赖信息,在确定循环体结构满足依赖关系更新条的情况下,服务器104将指令依赖信息中属于待解除类型的指令执行依赖关系解除,并基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到用于按照重建后的并行执行方式调度多个指令进行并行执行的指令调度信息。进一步地,服务器104可以基于指令调度信息调度多个指令按照重建后的并行执行方式进行并行执行,从而实现多指令的并行执行处理。
其中,终端102可以但不限于是各种台式计算机、笔记本电脑、智能手机、平板电脑、物联网设备和便携式可穿戴设备,物联网设备可为智能音箱、智能电视、智能空调、智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
在一个实施例中,如图2所示,提供了一种指令处理方法,该方法由计算机设备执行,具体可以由终端或服务器等计算机设备单独执行,也可以由终端和服务器共同执行,在本申请实施例中,以该方法应用于图1中的服务器为例进行说明,包括以下步骤:
步骤202,获取属于循环体结构的多个指令之间的指令依赖信息;指令依赖信息中包括多个指令之间的指令执行依赖关系。
其中,指令是控制计算机从事某一特殊运算的代码,如可以包括但不限于包括数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令或处理器控制指令等各种指令。循环体结构是指包括循环执行指令的结构,循环体结构中可以包括至少一个指令,在每次执行循环体结构时,可以执行循环体结构中包括的至少一个指令。通过循环体结构可以实现针对某一处理的反复迭代运算,如在各种机器学习模型的算子(Operator)中,存在大量的循环体结构,以循环执行循环体结构所包括的指令。例如,在编程语言中可以以“for”语句实现loop循环体结构的循环指令处理。循环体结构的数量可以包括至少一个,在包括多个循环体结构时,各个循环体结构之间还可以存在层级关系,形成循环体结构的嵌套,如循环体结构A中可以嵌套有循环体结构B和循环体结构C,而循环体结构C中还可以嵌套有循环体结构D,从而形成了三层的循环体结构。对于每个循环体结构,其中可以包括至少一个指令,而在包括多个指令时,各个指令之间可以存在指令执行的依赖关系。
指令依赖信息可以用于描述循环体结构的多个指令之间各自的依赖关系,如指令A的执行依赖于指令B的执行,指令C的执行依赖于指令A和指令B的执行等。指令依赖信息可以有不同的表现形式,如具体可以以图的形式表现指令执行依赖关系,还可以以文本的形式描述指令执行依赖关系。指令依赖信息中包括多个指令之间的指令执行依赖关系,指令执行依赖关系可以反映不同指令之间的执行先后顺序。例如,指令A需要基于数据B进行计算,而数据B经过指令C得到,那么指令A的执行依赖于指令C的执行,即指令C的执行应当在指令A之前,在指令C执行结束得到数据B后,指令A可以基于数据B进行计算。对于不同的指令之间可以具有不同的指令执行依赖关系,指令之间也可以没有指令执行依赖关系,即指令各自可以独立执行。指令依赖信息中包括的是原始的指令执行依赖关系,具体可以是初始的、未针对进行优化的指令执行依赖关系。
具体地,对于循环体结构中的多个指令,服务器可以确定各个指令之间的指令依赖信息,指令依赖信息可以用于描述循环体结构中各个指令之间的指令执行依赖关系。例如,指令依赖信息可以包括指令依赖图,指令依赖图中可以以节点表征指令,以连接节点的边表征不同指令之间的指令执行依赖关系,服务器可以根据指令依赖图中的节点和连接节点的边,直观地确定循环体结构的多个指令之间的指令执行依赖关系。在具体应用中,每个循环体结构的指令依赖信息可以单独设置,即每个循环体结构对应于各自的指令依赖信息,指令依赖信息中仅包括所对应循环体结构中指令的指令执行依赖关系;此外,也可以针对多个循环体结构综合构建指令依赖信息,从而可以通过指令依赖信息记录多个循环体结构各自指令之间的指令执行依赖关系。
步骤204,当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息。
其中,依赖关系更新条件用于判定是否需要针对循环体结构关联的指令依赖信息中指令执行依赖关系进行更新,在满足依赖关系更新条件时,可以触发针对循环体结构关联的指令依赖信息中指令执行依赖关系进行更新。依赖关系更新条件可以根据实际需要进行设置,如可以是确定循环体结构中包括特定待解除类型的指令执行依赖关系时,可以认为满足依赖关系更新条件。待解除类型的指令执行依赖关系是指解除后能够确保相应指令正常执行的指令执行依赖关系,具体可以是Alias(别名)的内存依赖关系。多个指令之间的指令执行依赖关系可以具有不同的类型,如内存依赖、数据依赖、读后写依赖、屏障依赖等,待解除类型的指令执行依赖关系可以根据实际应用场景进行确定。更新后的指令依赖信息中不包括待解除类型的指令执行依赖关系约束,即在利用更新后的指令依赖信息中指令执行依赖关系执行各指令时,可以不再考虑待解除类型的指令执行依赖关系。
具体地,服务器可以针对循环体结构进行判定,具体通过预先设定的满足依赖关系更新条件对循环体结构进行判定,如可以利用循环体结构的元数据判定是否满足依赖关系更新条件。在确定循环体结构满足依赖关系更新条件,如根据循环体结构的元数据,确定循环体结构关联的指令依赖信息中包括属于待解除类型的指令执行依赖关系时,服务器可以将指令依赖信息中属于待解除类型的指令执行依赖关系解除,从而实现对指令依赖信息的更新,得到更新后的指令依赖信息。在具体应用中,服务器可以确定循环体结构的多个指令之间各指令执行依赖关系的依赖关系类型,在各依赖关系类型中包括待解除类型时,如包括可解除的内存依赖类型时,服务器可以确定循环体结构满足依赖关系更新条件,以针对循环体结构对应的指令依赖信息进行更新,具体可以将指令依赖信息中属于待解除类型的指令执行依赖关系解除,从而释放待解除类型的指令执行依赖关系的约束,得到更新后的指令依赖信息。
步骤206,基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到针对多个指令的指令调度信息;指令调度信息,用于按照重建后的并行执行方式调度多个指令进行并行执行。
其中,并行执行方式是指针对循环体结构中多个指令进行并行执行的方式,具体可以包括执行时划分的时钟周期(Cycle)数量,每个时钟周期对应执行的指令等。指令依赖信息中包括多个指令之间的指令执行依赖关系,基于指令依赖信息可以针对多个指令的并行执行方式进行构建,而更新后的指令依赖信息中剔除了待解除类型的指令执行依赖关系,减少了指令执行依赖关系的约束条件,针对更新后的指令依赖信息可以重新构建更合理的并行执行方式,从而提高指令级并行度。指令调度信息可以描述重建后的并行执行方式,从而能够按照重建后的并行执行方式调度多个指令进行并行执行。例如,指令调度信息可以包括在每次循环处理中时钟周期划分数量,以及每个时钟周期所对应执行的指令。
具体地,服务器可以利用更新后的指令依赖信息中的指令执行依赖关系,针对循环体结构的多个指令重新构建并行执行方式,并基于重建的并行执行方式得到针对多个指令的指令调度信息。在针对循环体结构的多个指令触发执行时,服务器可以按照指令调度信息中重建后的并行执行方式调度各个指令进行并行执行。进一步地,服务器调度循环体结构进行执行时,服务器可以按照重建后的并行执行方式调度循环体结构中的各个指令进行并行执行。例如,服务器基于更新后的指令依赖信息中的指令执行依赖关系,重建的并行执行方式包括将循环体结构A划分成4个时钟周期,序号分别是时钟周期0、时钟周期1、时钟周期2和时钟周期3;其中,时钟周期0执行循环体结构A中的指令1和指令2,时钟周期1执行循环体结构A中的指令3,时钟周期2执行循环体结构A中的指令4、指令5和指令6,时钟周期3执行循环体结构A中的指令7和指令8。在具体应用于编译器的编译处理过程中时,可以在构建指令依赖信息并进行寄存器分配后,针对循环体结构的多个指令调度进行优化处理。
上述指令处理方法中,获取循环体结构的多个指令之间的指令依赖信息,在确定循环体结构满足依赖关系更新条件的情况下,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,并基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到用于按照重建后的并行执行方式调度多个指令进行并行执行的指令调度信息。对于满足依赖关系更新条件的循环体结构,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,减少了循环体结构中各指令执行之间的依赖关系,从而减少了调度循环体结构的多个指令进行并行执行的约束,为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,如图3所示,更新指令依赖信息的处理,即当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:
步骤302,获取循环体结构的元数据。
其中,元数据(Metadata)是一种用于携带与编译过程相关的额外信息的机制,元数据本身并不直接影响程序的语义,但可以用于优化、调试、代码覆盖率分析等目的。元数据可以携带针对循环体结构的额外信息,如可以携带表征循环体结构是否满足依赖关系更新条件的额外信息,从而可以预先确定是否依赖关系更新条件,并将表征循环体结构是否满足依赖关系更新条件的额外信息存储到元数据中,从而可以基于元数据对循环体结构进行快速判定。
具体地,服务器可以获取循环体结构的元数据,元数据与相应的循环体结构绑定,携带有相应循环体结构的额外信息。在具体实现中,服务器根据循环体结构的标识信息查询到对应的元数据。此外,在编译的应用场景中,服务器可以在编译器前端获取多阶中间表示IR(Intermediate Representation),从而从中间表示IR代码中确定循环体结构的元数据。
步骤304,当元数据中包括调试标识符,从指令依赖信息中确定属于待解除类型的指令执行依赖关系。
其中,调试标识符是预先设定的表征循环体结构满足依赖关系更新条件的标识信息。调试标识符的具体形式可以根据实际需要进行设置,如可以设置成“tiaoshibiaoshifu1”、“!llvm.loop”等。
具体地,服务器可以对循环体结构的元数据进行解析,以确定循环体结构的元数据中是否包括表征循环体结构是否满足依赖关系更新条件的额外信息,在服务器确定元数据中包括调试标识符时,可以认为循环体结构满足依赖关系更新条件,服务器可以从指令依赖信息中确定属于待解除类型的指令执行依赖关系。具体服务器可以查询待解除类型,并在从指令依赖信息中确定属于待解除类型的指令执行依赖关系。例如,在编译器的编译应用场景下,待解除类型的指令执行依赖关系可以包括可解除内存依赖关系。
步骤306,将属于待解除类型的指令执行依赖关系从指令依赖信息中删除,得到更新后的指令依赖信息。
具体地,对于确定出的待解除类型的指令执行依赖关系,服务器可以将待解除类型的指令执行依赖关系从指令依赖信息中删除,从而减少指令依赖信息中的指令执行依赖关系约束,基于更少的指令执行依赖关系约束进行指令调度,有利于提高指令级并行度。在具体应用中,对于确定出的待解除类型的指令执行依赖关系,服务器可以将待解除类型的指令执行依赖关系中的全部进行删除,也可以进行部分删除。
在具体实现时,服务器可以现将指令依赖信息中待解除类型的指令执行依赖关系全部删除,并针对删除全部待解除类型的指令执行依赖关系得到的指令依赖信息进行评估,以确定是否能够确保循环体结构中各指令的正常执行,若可以确保各指令正常执行,则服务器可以基于删除全部待解除类型的指令执行依赖关系得到的指令依赖信息,针对循环体结构中各指令进行并行调度。若删除全部待解除类型的指令执行依赖关系得到的指令依赖信息后,无法确保各指令正常执行,则服务器可以再恢复部分待解除类型的指令执行依赖关系后返回进行评估,若仍然无法确保各指令正常执行,则继续恢复部分待解除类型的指令执行依赖关系,直至能够确保循环体结构中各指令正常运行时,得到对应更新后的指令依赖信息。例如,服务器可以首先删除全部100%的待解除类型的指令执行依赖关系,若无法确保循环体结构的各种指令正常执行,则可以恢复20%,即删除80%待解除类型的指令执行依赖关系进行评估,若仍然无法确保循环体结构的各种指令正常执行,则可以再恢复20%,即删除60%待解除类型的指令执行依赖关系进行评估,若此时能够确保循环体结构的各种指令正常执行,则可以根据删除60%待解除类型的指令执行依赖关系的指令依赖信息,得到更新后的指令依赖信息。
本实施例中,在循环体结构的元数据中包括调试标识符时,服务器确定循环体结构依赖关系更新条件,从指令依赖信息中确定属于待解除类型的指令执行依赖关系,并从指令依赖信息中删除待解除类型的指令执行依赖关系,得到更新后的指令依赖信息,从而可以基于循环体结构的元数据对循环体结构是否满足依赖关系更新条件进行准确判定,有利于确保指令依赖信息更新的准确性,从而确保指令的正常执行。
在一个实施例中,当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:获取更新节点集;更新节点集包括从循环体结构关系图中基于节点的元数据搜索得到的满足依赖关系更新条件的节点;循环体结构关系图中的各节点用于表征各层级的循环体结构;当更新节点集中存在表征循环体结构的节点,从指令依赖信息中确定属于待解除类型的指令执行依赖关系;将属于待解除类型的指令执行依赖关系从指令依赖信息中删除,得到更新后的指令依赖信息。
其中,更新节点集包括基于节点的元数据从循环体结构关系图中搜索得到的满足依赖关系更新条件的节点,循环体结构关系图中的各节点用于表征各层级的循环体结构。循环体结构关系图根据各层级的循环体结构构建得到,具体可以通过将循环体结构映射成节点,将循环体结构之间的层级关系映射成连接节点的边得到。循环体结构关系图中不同的节点可以表征不同的循环体结构,而循环体结构之间的层级关系,可以通过不同节点之间的有向边表示。例如,节点A通过有向边1指向节点B,则可以表示在循环体结构关系图,节点B属于节点A的下一层级,即节点B所表征的循环体结构嵌套在节点A所表征的循环体结构中。节点的元数据即为节点所表征循环体结构的元数据,更新节点集中包括循环体结构关系图中的更新节点,更新节点是循环体结构关系图中所表征循环体结构满足依赖关系更新条件的节点。更新节点集可以预先遍历循环体结构关系图中各个节点以构建得到,如可以遍历每个节点所表征循环体结构的元数据,以根据元数据确定相应节点是否满足依赖关系更新条件,若满足则可以认为是更新节点,可以更新到更新节点集中。
具体地,服务器可以获取预先建立的更新节点集,更新节点集中包括更新节点,更新节点是循环体结构关系图中所表征循环体结构满足依赖关系更新条件的节点。服务器可以基于循环体结构在更新节点集进行匹配,以确定更新节点集中是否存在循环体结构对应的节点,即确定更新节点集中是否存在表征循环体结构的节点。若存在,则可以认为循环体结构满足依赖关系更新条件,服务器可以从指令依赖信息中确定属于待解除类型的指令执行依赖关系,具体服务器可以查询待解除类型,并在从指令依赖信息中确定属于待解除类型的指令执行依赖关系。对于确定出的待解除类型的指令执行依赖关系,服务器可以将待解除类型的指令执行依赖关系从指令依赖信息中删除,从而减少指令依赖信息中的指令执行依赖关系约束,有利于提高指令级并行度。
本实施例中,服务器基于预先构建的更新节点集确定是否存在表征循环体结构的节点,以对循环体结构是否满足依赖关系更新条件进行快速、准确判定,有利于确保指令依赖信息更新的准确性和处理效率。
在一个实施例中,获取更新节点集,包括:确定基于各层级的循环体结构构建的循环体结构关系图;在循环体结构关系图中进行节点搜索,得到所表征循环体结构满足依赖关系更新条件的更新节点;根据各更新节点得到更新节点集。
其中,循环体结构关系图基于各层级的循环体结构构建得到,具体循环体结构关系图中的节点用于表征循环体结构,循环体结构关系图中的有向边表征各循环体结构之间的层级关系,各循环体结构之间的层级关系可以根据各循环体结构之间的嵌套关系确定。更新节点是所表征循环体结构满足依赖关系更新条件的节点,具体更新节点所表征循环体结构的元数据中包括调试标识符,调试标识符用于标识循环体结构满足依赖关系更新条件。
具体地,服务器可以预先构建更新节点集,构建更新节点集的处理可以在基于源代码进行编译前实现,而获取更新节点集进行处理可以在完成寄存器分配后,针对指令调度进行优化的过程中实现。具体服务器可以获得基于各层级的循环体结构构建的循环体结构关系图,服务器针对循环体结构关系图中的各个节点进行搜索,如可以采用深度优先搜索算法、广度优先算法等各种算法进行节点搜索,从各个节点中确定更新节点,更新节点所表征循环体结构满足依赖关系更新条件。在具体实现时,针对循环体结构关系图中的各节点,服务器可以获取节点所表征循环体结构的元数据,并基于元数据判定循环体结构是否满足依赖关系更新条件,如可以确定元数据中是否携带有调试标识符,若元数据中携带有调试标识符,则可以确定循环体结构满足依赖关系更新条件,表征该循环体结构的节点属于更新节点。服务器遍历循环体结构关系图进行搜索后,可以得到各个更新节点,并基于各个更新节点构建得到更新节点集。
本实施例中,服务器针对循环体结构关系图进行节点搜索,以搜索确定所表征循环体结构满足依赖关系更新条件的更新节点,并根据搜到得到的各更新节点构建更新节点集,基于更新节点集可以以对循环体结构是否满足依赖关系更新条件进行快速、准确判定,从而有利于在确保指令依赖信息更新的准确性同时,提高指令的处理效率。
在一个实施例中,指令处理方法还包括:当循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在循环体结构中增加针对循环体结构整体的编译指示信息;针对编译指示信息配置指示信息元数据;指示信息元数据中包括用于标识编译指示信息的调试标识符;将指示信息元数据更新到循环体结构的元数据中。
其中,针对循环体结构可以预先针对进行指令执行依赖关系识别,以针对循环体结构是否满足依赖关系更新条件进行标记,从而可以在指令处理时快速对循环体结构进行判定。如可以在循环体结构的编译解析处理中,针对循环体结构进行指令执行依赖关系识别,以确定循环体结构的多个指令之间是否包括属于待解除类型的指令执行依赖关系。编译指示信息可以添加到循环体结构中,以对循环体结构整体进行指示,具体指示循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在针对循环体结构的多个指令进行调度并行执行时,可以针对循环体结构的多个指令之间的指令执行依赖关系进行更新。指示信息元数据是编译指示信息的元数据,用于携带编译指示信息的额外信息,在指示信息元数据中可以包括标识编译指示信息的调试标识符,调试标识符标识了循环体结构中增加了编译指示信息,从而反应出了循环体结构满足依赖关系更新条件。
具体地,服务器可以预先对循环体结构的多个指令之间的指令执行依赖关系类型进行识别,在确定循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系时,服务器可以确定循环体结构满足依赖关系更新条件,为了将该信息进行传递,服务器可以在循环体结构中增加针对循环体结构整体的编译指示信息,即通过编译指示信息针对循环体结构整体进行编译指示。编译指示信息添加的处理可以在编译器针对源代码进行前端处理的过程中实现,而基于元数据针对循环体结构进行判定的处理,可以在针对指令调度进行优化的过程中实现。服务器针对编译指示信息配置指示信息元数据,使得指示信息元数据中包括标识编译指示信息的调试标识符。服务器将指示信息元数据更新到循环体结构的元数据中,从而可以从循环体结构的元数据中查询得到调试标识符,在循环体结构的元数据中包括调试标识符时,可以确定循环体结构满足依赖关系更新条件,即需要针对指令依赖信息中的指令执行依赖关系进行更新处理。
本实施例中,在确定循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系时,服务器在循环体结构中增加针对循环体结构整体的编译指示信息,针对编译指示信息配置包括调试标识符的指示信息元数据,并将指示信息元数据更新到循环体结构的元数据中,从而可以预先针对循环体结构是否满足依赖关系更新条件进行判定,并在循环体结构满足依赖关系更新条件时通过元数据进行有效传递,有利于提高循环体结构判定的准确性,确保准确将指令依赖信息中属于待解除类型的指令执行依赖关系解除,从而减少了调度循环体结构的多个指令进行并行执行的约束,为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,当循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在循环体结构中增加针对循环体结构整体的编译指示信息,包括:确定循环体结构的多个指令各自的指令类型;当根据指令类型确定循环体结构包括至少两个属于向量操作类型的待检测指令,确定待检测指令之间的指令关系;向量操作类型包括向量加载和向量存储中的至少一种;当指令关系包括可解除内存依赖关系,在循环体结构中增加针对循环体结构整体的编译指示信息。
其中,指令类型是指相应指令的操作分类类型,如可以包括运算类型、加载类型、存储类型等各种类型,此外还可以基于所针对的操作数据类型进行划分,如可以包括针对向量的操作类型,针对数值数据的操作类型等。向量操作类型包括向量加载和向量存储中的至少一种,向量加载用于针对向量数据的加载操作,如可以包括SIMD(SingleInstruction Multiple Data,单指令多数据)指令集中的VLD指令;向量存储用于针对向量数据的存储操作,如可以包括SIMD指令集中的VST指令。待检测指令是需要针对指令关系进行进一步检测的指令。指令关系是指待检测指令之间存在的关联关系,可解除内存依赖关系是指待检测指令之间的内存依赖关系是属于可解除的,解除后仍可以保证相应指令的正常执行。例如,可解除内存依赖关系可以包括VLD指令和VST指令之间的May-Alias(可能存在别名)内存依赖关系。循环体结构的不同指令之间存在可解除内存依赖关系,表明循环体结构满足依赖关系更新条件。
具体地,对于循环体结构的多个指令,服务器可以分别确定各个指令各自的指令类型,并针对各个指令的指令类型进行比较,确定是否属于向量操作类型,向量操作类型可以包括向量加载和向量存储中的至少一种。在遍历各个指令的指令类型比较后,若服务器确定循环体结构包括至少两个属于向量操作类型的待检测指令,即循环体结构中指令类型属于向量操作类型的待检测指令的数量包括至少两个,则服务器确定各待检测指令之间的指令关系。服务器基于各待检测指令之间的指令关系类型确定,在确定各待检测指令之间的指令关系中包括可解除内存依赖关系,如包括May-Alias(可能存在别名)内存依赖关系时,服务器可以确定循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,即确定循环体结构满足依赖关系更新条件,服务器可以在循环体结构中增加针对循环体结构整体的编译指示信息。
本实施例中,服务器根据多个指令各自的指令类型,确定属于向量操作类型的至少两个待检测指令,并在待检测指令之间的指令关系包括可解除内存依赖关系的情况下,在循环体结构中增加针对循环体结构整体的编译指示信息,从而可以预先针对循环体结构是否满足依赖关系更新条件进行判定,并在循环体结构满足依赖关系更新条件时通过元数据进行有效传递,有利于提高循环体结构判定的准确性,确保准确将指令依赖信息中属于待解除类型的指令执行依赖关系解除,从而减少了调度循环体结构的多个指令进行并行执行的约束,为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,指令依赖信息包括指令依赖图,指令依赖图中的节点用于表征多个指令,指令依赖图中的有向边用于表征多个指令之间的指令执行依赖关系;待解除类型的指令执行依赖关系包括可解除内存依赖关系;将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:从指令依赖图的各有向边中,确定表征可解除内存依赖关系的目标有向边;将指令依赖图中的目标有向边删除,得到更新后的指令依赖图,根据更新后的指令依赖图得到更新后的指令依赖信息。
其中,指令依赖信息包括指令依赖图,即指令依赖信息以图的形式进行表现。指令依赖图中的节点用于表征多个指令,指令依赖图中的有向边用于表征多个指令之间的指令执行依赖关系。待解除类型的指令执行依赖关系包括可解除内存依赖关系,具体可以包括May-Alias内存依赖关系。目标有向边是指令依赖图中用于表征可解除内存依赖关系的有向边。
具体地,指令依赖信息包括指令依赖图,即指令依赖信息以图的形式进行展现,服务器可以确定指令依赖图的各有向边,并确定各有向边分别表征的指令执行依赖关系,以从各个有向边中确定表征可解除内存依赖关系的目标有向边。目标有向边表征可解除内存依赖关系,服务器可以在指令依赖图中,将目标有向边删除,从而对指令依赖图实现更新,得到更新后的指令依赖图,服务器根据更新后的指令依赖图得到更新后的指令依赖信息。
本实施例中,服务器将指令依赖图中表征可解除内存依赖关系的目标有向边删除,以实现对指令依赖信息的快速更新,有利于提高针对指令的处理效率。
在一个实施例中,基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到针对多个指令的指令调度信息,包括:基于更新后的指令依赖信息中的指令执行依赖关系,对多个指令之间进行依赖性分析,得到依赖性分析结果;通过依赖性分析结果重建多个指令的并行执行方式;根据并行执行方式得到针对多个指令的指令调度信息。
其中,依赖性分析是基于各个指令之间的指令执行依赖关系,针对各个指令的并行执行的分析,根据依赖性分析结果可以对循环体结构中各个指令的并行执行方式进行重新构建,从而得到针对多个指令的指令调度信息。
具体地,服务器可以基于更新后的指令依赖信息中的指令执行依赖关系,对多个指令之间进行依赖性分析,如可以根据指令执行依赖关系的类型,确定循环体结构中各指令之间的执行顺序、并行执行逻辑、时钟周期分配等。依赖性分析结果可以包括各指令之间的执行顺序、并行执行逻辑、时钟周期分配等。服务器通过依赖性分析结果对循环体结构的各个指令的执行策略进行重新构建,以获得循环体结构中各个指令的并行执行方式。服务器根据该并行执行方式得到针对多个指令的指令调度信息。
本实施例中,服务器对更新后的指令依赖信息中的指令执行依赖关系进行依赖性分析,通过依赖性分析结果重建循环体结构中各指令的并行执行方式,并根据重建的并行执行方式得到针对多个指令的指令调度信息,从而可以利用解除了待解除类型的指令执行依赖关系的指令依赖信息重建并行执行方式,减少了指令执行依赖关系约束条件,为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,获取属于循环体结构的多个指令之间的指令依赖信息,包括:获取循环体结构的源代码,对源代码进行解析,得到循环体结构的指令序列;确定指令序列中多个指令之间的指令执行依赖关系;基于指令序列和指令执行依赖关系得到指令依赖信息。
其中,源代码可以是包括循环体结构的代码文件,指令序列包括循环体结构中的各个指令。具体地,服务器可以获取循环体结构的源代码,如可以是采用编程语言编写的源代码。服务器可以针对源代码进行解析,得到循环体结构的指令序列,指令序列中可以包括循环体结构中的各个指令,即指令序列可以由循环体结构中的各个指令组合得到。服务器确定指令序列中多个指令之间的指令执行依赖关系,并基于指令序列和指令执行依赖关系得到指令依赖信息。如服务器可以基于指令序列中的各个指令和各个指令之间的指令执行依赖关系,构建得到指令依赖图,基于指令依赖图可以得到指令依赖信息;此外,服务器也可以基于指令序列中的各个指令和各个指令之间的指令执行依赖关系,构建得到指令依赖描述文本,基于指令依赖描述文本可以得到指令依赖信息。
本实施例中,服务器通过对循环体结构的源代码进行解析,得到循环体结构的指令序列,并利用指令序列中的各个指令和各个指令之间的指令执行依赖关系得到指令依赖信息,从而可以通过指令依赖信息描述各个指令之间的指令执行依赖关系,以便针对指令依赖信息更新,减少调度循环体结构的多个指令进行并行执行的约束,能够为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,基于指令序列和指令执行依赖关系得到指令依赖信息,包括:将指令序列中的各个指令分别映射为节点;将指令执行依赖关系分别映射为节点之间的有向边;基于各节点和各有向边构建指令依赖图,根据指令依赖图得到指令依赖信息。
其中,将指令映射为节点,以通过节点表征相应的指令;将指令执行依赖关系映射为节点之间的有向边,以通过有向边表征相应的指令执行依赖关系;指令依赖图根据节点和有向边构建得到。
具体地,服务器可以将指令序列中的各个指令分别进行映射,以映射成不同的节点,每个指令可以映射对应的节点。服务器可以将指令执行依赖关系映射分别进行映射,具体映射成为节点之间的有向边,从而通过有向边可以表征节点所表征指令之间的指令执行依赖关系。服务器基于各节点和各有向边构建指令依赖图,如可以在同一范围内将各节点基于各有向边连接,形成指令依赖图,服务器可以根据指令依赖图得到指令依赖信息。
本实施例中,服务器将指令映射为节点,将指令执行依赖关系映射为有向边,基于各个节点和各个有向边构建指令依赖图,从而可以通过指令依赖图直观地展现各个指令之间的指令执行依赖关系,以便针对指令执行依赖关系更新,减少调度循环体结构的多个指令进行并行执行的约束,能够为指令调度提供了更大的操作空间,提高了指令级并行度。
在一个实施例中,指令处理方法还包括:根据指令调度信息包括的重建后的并行执行方式,从多个指令中确定至少一个待执行指令;按照并行执行方式调度至少一个待执行指令进行并行执行。
其中,待执行指令是需要调度进行执行的指令。具体地,服务器可以基于指令调度信息确定并行执行方式,并根据并行执行方式从循环体结构的多个指令中确定至少一个待执行指令,服务器按照并行执行方式调度至少一个待执行指令进行并行执行,如可以将至少一个待执行指令在指定的时钟周期内进行并行执行。
本实施例中,服务器根据指令调度信息包括的重建后的并行执行方式,调度循环体结构的多个指令进行并行执行,重建后的并行执行方式是基于更大的操作空间确定的,指令级并行度高,按照重建后的并行执行方式调度指令进行并执行,可以有效提高指令的执行效率。
本申请还提供一种应用场景,该应用场景应用上述的指令处理方法。具体地,该指令处理方法在该应用场景的应用如下:
近年来,随着人工智能(AI,Artificial Intelligence)技术的不断发展和应用,几乎无处不在地改变人们的日常生活,从智能家居设备延伸到广告推荐、仓库机器人、自动驾驶等领域。其中,人工智能的定义是指能够通过普通电脑程序来呈现人类智能的技术,另外一种定义是AI是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。AI编译器在人工智能领域发挥了至关重要的作用,它能有效地提高计算性能和模型训练的效率。国内外也涌现了一批先进的AI编译器,例如Apache TVM、Meta Glow、Intel PlaidML、MindSpore、PaddlePaddle等。AI编译器的通用设计架构主要包含两部分:编译器前端和编译器后端,具体来说,如图4所示,输入的机器学习模型可以是基于各种模型结构构建的,输入的机器学习模型在AI编译器中被转换为多阶IR(Intermediate Representation,中间表示),其中高阶中间表示(高阶IR)在编译器前端被解析,低阶中间表示(低阶IR)在编译器后端被解析。在编译器前端,依次针对输入的机器学习模型进行模型解析、高阶中间表示以及前端优化;在编译器后端,依次针对编译器前端的输出进行低阶中间表示、后端优化,生成可执行模型。高阶IR捕获和表达不同的机器学习模型,然后进行计算图优化,例如算子下沉、算子融合等,最后将优化的计算图传递给后编译器端。低阶IR是基于目标相关的优化,例如内存分配和获取、并行化、自动调优等。最后进入代码生成阶段,生成可执行模块,编译器后端生成的可执行模块可以在不同目标平台上运行,平台具体可以包括X86、ARM、RISC-V、NVIDIA、AMD等不同的CPU处理器,还可以包括TPU、NNP、Inferentia等各种ASIC(Application Specific Integrated Circuit,专用集成电路)。
在AI编译器的后端优化过程中,指令级并行度(ILP,Instruction-LevelParallelism)优化是一种提高处理器性能的关键技术,它利用现代处理器的SIMD指令集,将AI应用中的数据并行操作转换为向量化指令,通过指令调度的方式同时执行多条指令来提升计算性能。但随着向量指令在AI算子中的使用频率越来越高,尤其是用于向量加载和存储的VLD/VST指令出现在Loop循环中时,当这些指令没有内存重叠时,由于存在的May-Alias内存依赖造成大量的指令无法调度,导致最终指令级并行度优化的结果非常差。
对于Loop级别的向量加法处理,如下所示。
void restrictTest(float*x_ptr,float*y_ptr,int loopNum){//定义指针x_ptr和y_ptr
int bias=64;//为bias赋值
vf32 vSrc,vDst;//vSrc存储加载结果,vDst存储加法计算结果
#pragma unroll 2//预处理包括循环展开
for(int i=0;i<loopNum;i++){
vSrc=vld(x_ptr,0);//加载x_ptr的指针存储到vSrc中
vDst=vadds(vSrc,float(1.0));//针对vSrc进行加法计算
vst(vDst,y_ptr,0);//将加法计算结果存储到vst中
x_ptr+=bias;y_ptr+=bias;//针对x_ptr和y_ptr进行指针跳转}}
其中,x_ptr和y_ptr是分别用来加载/存储向量的指针,vSrc是存取从x_ptr加载的向量,vDst用来存储经过加法计算后的向量结果,最后将结果存入y_ptr指向的地址中。当VLD/VST等向量加载/存储指令出现在AI算子的Loop循环结构中,指令调度的结果非常差,为了解决这个问题,通常需要配合编译器的循环展开技术,即为核心循环添加unroll,unroll 2循环展开后效果如下。
void restrictTest(float*x_ptr,float*y_ptr,int loopNum){//定义指针x_ptr和y_ptr
int bias=64;//为bias赋值
vf32 vSrc,vDst;//vSrc存储加载结果,vDst存储加法计算结果
for(int i=0;i<loopNum;i+=2){
//第一循环loop 1
vSrc=vld(x_ptr,0);//加载x_ptr的指针存储到vSrc中
vDst=vadds(vSrc,float(1.0));//针对vSrc进行加法计算
vst(vDst,y_ptr,0);//将加法计算结果存储到vst中
x_ptr+=bias;y_ptr+=bias;//针对x_ptr和y_ptr进行指针跳转
//第二循环loop 2
vSrc=vld(x_ptr,0);//加载x_ptr的指针存储到vSrc中
vDst=vadds(vSrc,float(1.0));//针对vSrc进行加法计算
vst(vDst,y_ptr,0);//将加法计算结果存储到vst中
x_ptr+=bias;y_ptr+=bias;//针对x_ptr和y_ptr进行指针跳转}}
可以看到Loop Body从原先的5条指令扩大到10条,为指令调度提供了更大的空间,有利于指令重排。但是,由于VST是store(存储)指令,VLD是load(加载)指令,它们都属于memory(内存)指令。编译器在构造依赖图(Dependency Graph)时,会在这两条指令间加上一条依赖边(Dependency Edge),以表示这两条指令之间存在May-Alias的内存依赖,指令的执行顺序无法被打破,从而导致指令调度失效。因此,在指令调度阶段,编译器无法将loop2以及其后面的所有指令给调度到loop 1之前,影响后续内存折叠、软流水等优化。
目前,可以使用C或C++编程语言自带的关键字(属性)_restrcit修饰指针,在C语言中,restrict是一个关键字,由C99标准引入,可以在指针声明中使用。通过添加此类型限定符,可以向编译器提示,在指针的生命周期内,不会使用其他指针来访问它指向的对象,这允许编译器进行原本不可能进行的优化,例如向量化。C++没有对restrict的标准支持,但主流编译器在C++和C中都可以使用等效项__restrict进行替代。restrict(限制)方法具体如下所示。
void restrictTest(float*__restrict x_ptr,float*_restrict y_ptr,intloopNum){//定义指针x_ptr和y_ptr包括_restrcit属性
int bias=64;//为bias赋值
vf32 vSrc,vDst;//vSrc存储加载结果,vDst存储加法计算结果
#pragma unroll 2//预处理包括循环展开
for(int i=0;i<loopNum;i++){
vSrc=vld(x_ptr,0);//加载x_ptr的指针存储到vSrc中
vDst=vadds(vSrc,float(1.0));//针对vSrc进行加法计算
vst(vDst,y_ptr,0);//将加法计算结果存储到vst中
x_ptr+=bias;y_ptr+=bias;//针对x_ptr和y_ptr进行指针跳转}}
在C/C++编程语言中,restrict关键字能够指明该指针是唯一访问对应内存区域的方式。指针是一种常见的数据类型,程序中可能存在多个指针同时指向同一个内存地址的情况,因此编译器在优化过程中需要为每一个指针分配一个别名,以此来区别不同的指针操作。restrict的实现原理基于编译器的别名分析技术,如图5所示,对于待编译的源代码,通过底层虚拟机(LLVM,Low Level Virtual Machine)进行前端解析,得到底层虚拟机中间表示(LLVM IR),针对进行中间优化,包括别名分析(Alias Analysis)、常量折叠等,并进一步构建有向无环图(Directed Acyclic Graph,DAG),基于有向无环图进行指令选择和寄存器分配,并进行指令调度,以执行相应指令编译得到相应的目标代码。即LLVM的别名分析是在LLVM编译器的中间表示阶段进行,当使用restrict关键字修饰指针时,编译器会假设该指针是唯一访问对应内存区域的方式,即不存在别名,从而可以打破May-Alias依赖。
然而,AI算子在不同的SIMD指令集中进行向量化计算中,使用现有方案进行指令调度的效果不佳,从而影响指令级并行度。主要体现在:AI算子存在大量inline(内联)优化,用C/C++自带的restrict在inline过程中会失效;多目标平台的泛化性较差,难以针对性地优化不同SIMD指令集向量的内存依赖,导致指令级并行度优化的效果不明显。其中,SIMD指令集是一组特定于处理器的指令,它们允许在单个指令中对多个数据元素执行相同的操作,它通常是SIMD架构的一部分,它们共同实现了高效的并行计算。
基于此,本实施例提供了新型的Loop级别的restrict Pragma(预处理标识),通在过Loop级别添加restrict pragma的方式,针对特定的SIMD指令集能消除May-Alias内存依赖,一方面在粒度更小的Loop级别添加restrict pragma,防止函数inline(内联)后将原有的restrict属性取消;另一方面,消除与向量加载/存储指令计算无关的内存依赖,为指令调度提供更大的操作空间,从而提高指令级并行度。本实施例主要用于AI编译器工具链,位于AI编译器的后端代码生成模块中。典型的应用场景包括在AI芯片配套的AI编译器中,能够优化指令并行度,明显地提升AI算子在执行向量计算时的执行效率和性能。其中,#pragma是C++中的一种预处理指令,用于向编译器传递特定的指示或指令,用于控制编译器的行为或提供一些编译器相关的指示。它可以用于开启或关闭编译器选项,设置编译器的优化级别,或者指定特定的编译器指令等。例如#pragma unroll 2表示循环展开2次。
本实施例主要作用于编译器前端和寄存器分配后的指令调度阶段,系统框架如图6,对于待编译的源代码,在编译器前端添加一个Loop级别的restrict Pragma,并为循环体添加元数据的调试标识;通过底层虚拟机进行前端解析,得到底层虚拟机中间表示,即得到LLVM IR,针对进行中间优化,包括常量折叠等处理;并进一步构建有向无环图,即DAG图,基于DAG图进行指令选择和寄存器分配,并进行指令调度,以执行相应指令编译得到相应的目标代码。具体地,为编译器新增一个Loop级别的restrict pragma,命名为restrict_loop,并为其添加metadata调试标识符(!”llvm.loop.restrict”)。
在指令调度阶段,如图7所示,输入有向无环图,并搜索有向无环图的元数据信息,判断是否含有元数据标识;具体可以对输入的DAG(Directed Acyclic Graph,有向无环图)图的机器循环指令进行搜索,如基于DFS算法进行搜索,判断DAG图中是否含有restrict的元数据meatadata;当DAG图中含有restrict的元数据meatadata,则删除无用内存依赖,并进行指令依赖性分析;当DAG图中不含元数据meatadata,则直接进行指令依赖性分析;基于依赖性分析结果构建指令表,按照构建的指令表选择指令,并将选择的指令发射,通过指令调度进行指令执行处理。当DAG图中含有restrict的元数据meatadata则删除无关的内存依赖,使能指令重排,提升指令级并行度。此外,当程序结构较简单、逻辑关系不复杂且不需要函数inline的情况下,可以采用函数级别的restrict attribute(限制属性)的方式来替代,该方案同样需要删除所在函数中的VLD/VST指令间的May-Alias内存依赖,区别是粒度相对较大、不需要作用于核心循环,而需要在函数名旁加一个restrict attribute,进一步由编译器前端基于上述指令处理方法实现。
具体来说,本实施例的方案主要由两部分构成,第一步是在编译器前端clang添加新的restrcit pragma,第二步在指令调度阶段进行内存依赖优化。
对于编译器前端添加restrict_loop pragma的处理。AI算子通常需要配合AI编译器的循环展开进行优化,在Loop循环中,当向量加载和存储的VLD/VST指令存在内存May-Alias依赖时,需要首先对其进行捕获。针对Loop循环中确定的May-Alias依赖,本实施例采用#pragma(预处理命令)编译指示的方法,为AI算子的整个核心循环(Loop Body,循环体)添加编译指示。同时将元数据meatadata调试标识符(!”llvm.loop.restrict”)与当前循环体Loop Body绑定,将指令调度所需要的标识符信息传递给中间表示IR,为后续删除内存依赖做保证。具体在针对当前循环体的指令调度优化过程中,判断当前循环体是否含有restrict的meatadata调试标识符,若有则删除当前循环体中VLD/VST指令存在内存May-Alias依赖,使能指令重排,提升指令级并行度。如下所示,给出了restrict_loop pragma的使用以及IR和metadata标识。
void restrictTest(float*x_ptr,float*y_ptr,int loopNum){//定义指针x_ptr和y_ptr
int bias=64;//为bias赋值
vf32 vSrc,vDst;//vSrc存储加载结果,vDst存储加法计算结果
#pragma clang loop restrict_loop(enable)//定义loop级别的restrict_loop生效
#pragma unroll 2//预处理包括循环展开
for(int i=0;i<loopNum;i++){
vSrc=vld(x_ptr,0);//加载x_ptr的指针存储到vSrc中
vDst=vadds(vSrc,float(1.0));//针对vSrc进行加法计算
vst(vDst,y_ptr,0);//将加法计算结果存储到vst中
x_ptr+=bias;y_ptr+=bias;//针对x_ptr和y_ptr进行指针跳转}}
进一步地,在核心循环Loop Body外层加了restrict_loop的编译指示,并且给出了enable(使生效)的标志以开启restrict pragma。在IR代码中,由于unroll(循环展开)的作用loop body被扩大成了两份,并在terminal(最终)指令br中添加了“!llvm.loop!6”metadata,具体如下所示。
!6=distinct!{!6,!7,!8,!9}
!7=!i!"llvm.loop.mustprogress"}
!8=!{!"llvm.loop.restrict"}
!9=!!"llvm.loop.unroll.disable"}
其中“!llvm.loop”是LLVM中用于表示循环属性的metadata元数据,所有与循环相关的调试标识信息都包含于此,其中!6表示循环的属性存储在ID为6的metadata节点中,同时!6存在4个不同的子节点,第一个子节点默认为自己,!7为C++特性之一,表示该循环是有限循环即存在终止条件,!9为#pragma unroll 2的编译标识,!8即为添加的restrictmetadata,用来绑定与restrict相关的loop body。
针对指令调度优化的处理中,算子用例的核心循环,经过指令调度后的指令序列如下所示。
{$vr0=VLD$r10,0//加载寄存器$r10数据到寄存器$vr0
$vr0=VADDS$vr0,$r12//基于寄存器$r12的数据和$vr0的数据进行向量相加计算
VST$vr0,$r11,0//调用寄存器$vr0、$r11进行存储
$vr1=VLD$r10,8//加载寄存器$r10的数据
$vr1=VADDS$vr1,$r12//基于寄存器$r1的数据和$vr12的数据进行向量相加计算
$r9=ADDI$r11,512//针对寄存器$r11的数据进行相加
VST$vr1,$r9,0//调用寄存器$vr1、$r9进行存储
$r10=ADDI$r10,1024//针对寄存器$r10的数据进行相加
$r9=ADDI$r9,1024//针对寄存器$r9的数据进行相加
$r7=ADDI$r7,-1//针对寄存器$r7的数据进行相加
BRANCH_NE$r7,$r5//跳转寄存器}
其中,指令名称用大写字串表示,例如VLD,VST等;寄存器用“$”字符加小写字串和数字表示,例如$vr0,$r10等,常数直接用数字表示;输出数据到寄存器的指令用“=”将输出寄存器和指令名称链接起来;输入寄存器、常数紧跟在指令名后面,用“,”分开。
在上述指令序列中,数据通过寄存器在指令之间、指令和内存间传递。未做指令调度优化前的指令依赖图,即有向无环图(DAG)如图8所示。可以看到上述未进行指令依赖关系优化的DAG图,指令序列中的各个指令能够按照先后顺序转换为节点,即调度单元SU,节点序号即为输入顺序。其中,细虚线的有向边表示两个节点之间存在内存依赖,即两个指针有可能访问同一个内存地址,也叫May-Alias依赖,这也是本实施例重点关注的依赖关系。粗虚线的有向边表示读后写依赖(Write-after-Read,WAR),这种依赖关系发生在当一个指令读取一个值,然后后续的指令写入同一个值的情况。在这种情况下,必须确保读操作在写操作之前发生,否则读操作可能会读取到错误的值。粗实线的有向边表示屏障依赖,表示一种同步关系,当前指令需要等待前面指令执行完毕才能继续执行。细实线的有向边表示数据依赖,标识当前指令需要前一条指令传入的数据。具体地,调度单元SU0与调度单元SU3之间存在内存依赖,调度单元SU与调度单元SU9之间存在内存依赖,调度单元SU4与调度单元SU9之间存在内存依赖;调度单元SU7分别与调度单元SU0和调度单元SU4之间存在读后写依赖,调度单元SU8分别与调度单元SU3和调度单元SU1之间存在读后写依赖;调度单元SU1与调度单元SU9之间存在数据依赖,调度单元SU6与调度单元SU10之间存在数据依赖;调度单元SU9与调度单元SU10之间存在屏障依赖。
上述依赖关系中,除了May-Alias内存依赖其他都是强依赖,表示指令需要严格按照依赖关系执行,无法进行指令重排。
进一步可以看出VLD/VST指令之间存在May-Alias内存依赖,指令调度无法对上述指令序列进行重排,导致指令顺序不会有任何重排。核心循环的指令调度cycle(时钟周期)图如下所示。
***Final schedule for%bb.3***
Cycle 0SU(0):$vr0=VLD$r10,0//在时钟周期Cycle 0,通过调度单元SU(0)实现VLD(加载)处理
Cycle 0SU(1):$r9=ADDI$r11,512//在时钟周期Cycle 0,通过调度单元SU(1)实现ADDI(立即相加)处理
Cycle 0SU(6):$r7=ADDI$r7,-1//在时钟周期Cycle 0,通过调度单元SU(6)实现ADDI处理
Cycle 1SU(2):$vr0=VADDS$vr0,$r12//在时钟周期Cycle 1,通过调度单元SU(2)实现VADDS(向量加法)处理
Cycle 4SU(3):VST$vr0,$r11,0//在时钟周期Cycle 4,通过调度单元SU(3)实现VST(存储)处理
Cycle 4SU(8):$r11=ADDI$r11,1024//在时钟周期Cycle 4,通过调度单元SU(8)实现ADDI处理
Cycle 5SU(4):$vr0=VLD_f32$r10,8//在时钟周期Cycle 5,通过调度单元SU(4)实现VLD处理
Cycle 5SU(7):$r10=ADDI$r10,1024//在时钟周期Cycle 5,通过调度单元SU(7)实现ADDI处理
Cycle 6SU(5):$vr0=VADDS$vr0,$r12//在时钟周期Cycle 6,通过调度单元SU(5)实现VADDS处理
Cycle 9SU(9):VST$vr0,$r9,0//在时钟周期Cycle 9,通过调度单元SU(9)实现VST处理
Cycle 9SU(10):BRANCH_NE$r7,$r5,%bb.3//在时钟周期Cycle 9,通过调度单元SU(10)实现BRANCH_NE(跳转)处理
其中,SU(Schedulable Unit)是调度单元。所有指令全部执行的总cycle数为9,VLD指令的latency(执行时间)大概是4,后续指令的lantency无法插入VLD,只能等待前者执行完毕才能继续执行,导致硬件stall 4个cycle,从而大大降低指令级并行度,影响AI算子执行性能。其中,Latency是指令的延迟时间,即指令执行所需的时间。
核心循环中可能会嵌套地存在多层循环,每个循环在LLVM后端被解析为一个MachineLoop的循环结构,每个MachineLoop被视为一个图节点,基于由MachineLoop组成的循环结构图进行深度优先搜索。如图9所示,根节点(ROOT)下可以有节点1.1、节点1.2和节点1.3共3个节点,在节点1.1下包括节点2.1和节点2.2,其中,节点2.2含有预存的matadata调试标识。检索核心循环中是否含有预存的matadata调试标识,该标识符由restrictpragma下发,然后将VLD/VST向量加载/存储指令之间的May-Alias内存依赖删除,并重新使能指令调度,利用VLD的latency将后续指令向前插入,降低指令调度的总cycle数,提高指令级并行度。
具体处理包括:深度优先遍历由核心循环MachineLoop构建的DAG图,通过剪枝等优化策略快速找到含有“llvm.loop.restrict”metadata的所有节点;将每个节点保存到一个全局的集合单元U中;获取当前指令调度的DAG图,判断此DAG图中是否存在U中的MachineLoop,若存在,则删除当前DAG图中的VLD/VST间的May-Alias内存依赖,具体可以删除当前DAG图中表示VLD/VST间的May-Alias内存依赖的有向边;再进行指令依赖性分析,指令执行。
经过指令调度优化后,核心循环DAG如图10所示,可以看到调度单元SU0、调度单元SU3、调度单元SU4、调度单元SU9之间的May-Alias内存依赖被删除,即调度单元SU0、调度单元SU3、调度单元SU4、调度单元SU9之间表征May-Alias内存依赖的有向边已删除,各个调度单元之间不存在May-Alias内存依赖;具体地,调度单元SU7与调度单元SU0和调度单元SU1之间存在读后写依赖,调度单元SU9与调度单元SU6之间存在读后写依赖,调度单元SU6和调度单元SU8与调度单元SU10之间存在屏障依赖,调度单元SU5与调度单元SU10之间存在数据依赖。指令调度cycle如下所示,
***Final schedule for%bb.3***
Cycle 0SU(0):$vr0=VLD_f32$r10,0//在时钟周期Cycle 0,通过调度单元SU(0)实现VLD处理
Cycle 0SU(1):$vr1=VLD_f32$r10,8//在时钟周期Cycle 0,通过调度单元SU(1)实现VLD处理
Cycle 0SU(2):$r9=ADDI$r11,512//在时钟周期Cycle 0,通过调度单元SU(2)实现ADDI处理
Cycle 1SU(3):$vr0=VADDS$vr0,$r12//在时钟周期Cycle 1,通过调度单元SU(3)实现VADDS处理
Cycle 1SU(4):$vr1=VADDS$vr1,$r12//在时钟周期Cycle 1,通过调度单元SU(4)实现VADDS处理
Cycle 1SU(5):$r7=ADDI$r7,-1//在时钟周期Cycle 1,通过调度单元SU(5)实现ADDI处理
Cycle 2SU(7):$r10=ADDI$r10,1024//在时钟周期Cycle 2,通过调度单元SU(7)实现ADDI处理
Cycle 4SU(6):VST$vr0,$r11,0//在时钟周期Cycle 4,通过调度单元SU(6)实现VST处理
Cycle 4SU(9):$r11=ADDI$r11,1024//在时钟周期Cycle 4,通过调度单元SU(9)实现ADDI处理
Cycle 5SU(8):VST$vr1,$r9,0//在时钟周期Cycle 5,通过调度单元SU(8)实现VST处理
Cycle 5SU(10):BRANCH_NE$r7,$r5,%bb.3//在时钟周期Cycle 5,通过调度单元SU(10)实现BRANCH_NE处理
可以看出,在第0个时钟周期时,指令VLD发射,由于VLD指令的latency(执行时间)为4,此时VLD/VST直接已经没有May-Alias内存依赖,发射后硬件无需stall(延迟)4个cycle,而是直接发射第二个内存无关的VLD指令。在一个VLD的latency中,指令调度使两个Loop并行执行,4个cycle中并行执行完毕了两个Loop,大大减小核心循环总cycle数,提升了指令级并行度。
进一步地,本实施例主要应用于AI编译器中的AI算子优化,可以选择一些常用算子,在核心循环外加上restrict pragma后所带来的性能提升,执行总cycle为硬件下算子最终执行时长。具体对比如下表1所示。
表1
可以看出,优化AI算子中核心循环的向量加载/存储指令之间的May-Alias内存依赖能有效降低算子执行总时长、提升指令级并行度,尤其是VLD/VST指令占比越大的算子中的优化作用越明显。
应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的指令处理方法的指令处理装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个指令处理装置实施例中的具体限定可以参见上文中对于指令处理方法的限定,在此不再赘述。
在一个实施例中,如图11所示,提供了一种指令处理装置1100,包括:指令依赖信息获取模块1102、指令依赖信息更新模块1104和指令调度信息获得模块1106,其中:
指令依赖信息获取模块1102,用于获取属于循环体结构的多个指令之间的指令依赖信息;指令依赖信息中包括多个指令之间的指令执行依赖关系;
指令依赖信息更新模块1104,用于当确定循环体结构满足依赖关系更新条件,将指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;
指令调度信息获得模块1106,用于基于更新后的指令依赖信息中的指令执行依赖关系对多个指令的并行执行方式进行重建,得到针对多个指令的指令调度信息;指令调度信息,用于按照重建后的并行执行方式调度多个指令进行并行执行。
在一个实施例中,指令依赖信息更新模块1104包括元数据获取模块、待解除依赖关系确定模块和依赖关系删除模块;其中:元数据获取模块,用于获取循环体结构的元数据;待解除依赖关系确定模块,用于当元数据中包括调试标识符,从指令依赖信息中确定属于待解除类型的指令执行依赖关系;依赖关系删除模块,用于将属于待解除类型的指令执行依赖关系从指令依赖信息中删除,得到更新后的指令依赖信息。
在一个实施例中,指令依赖信息更新模块1104包括更新节点集获取模块、节点匹配模块和依赖关系删除模块;其中:更新节点集获取模块,用于获取更新节点集;更新节点集包括从循环体结构关系图中基于节点的元数据搜索得到的满足依赖关系更新条件的节点;循环体结构关系图中的各节点用于表征各层级的循环体结构;节点匹配模块,用于当更新节点集中存在表征循环体结构的节点,从指令依赖信息中确定属于待解除类型的指令执行依赖关系;依赖关系删除模块,用于将属于待解除类型的指令执行依赖关系从指令依赖信息中删除,得到更新后的指令依赖信息。
在一个实施例中,更新节点集获取模块包括结构关系图确定模块、节点搜索模块和更新节点处理模块;其中:结构关系图确定模块,用于确定基于各层级的循环体结构构建的循环体结构关系图;节点搜索模块,用于在循环体结构关系图中进行节点搜索,得到所表征循环体结构满足依赖关系更新条件的更新节点;更新节点处理模块,用于根据各更新节点得到更新节点集。
在一个实施例中,还包括编译指示信息增加模块、元数据配置模块和元数据更新模块;其中:编译指示信息增加模块,用于当循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在循环体结构中增加针对循环体结构整体的编译指示信息;元数据配置模块,用于针对编译指示信息配置指示信息元数据;指示信息元数据中包括用于标识编译指示信息的调试标识符;元数据更新模块,用于将指示信息元数据更新到循环体结构的元数据中。
在一个实施例中,编译指示信息增加模块,还用于确定循环体结构的多个指令各自的指令类型;当根据指令类型确定循环体结构包括至少两个属于向量操作类型的待检测指令,确定待检测指令之间的指令关系;向量操作类型包括向量加载和向量存储中的至少一种;当指令关系包括可解除内存依赖关系,在循环体结构中增加针对循环体结构整体的编译指示信息。
在一个实施例中,指令依赖信息包括指令依赖图,指令依赖图中的节点用于表征多个指令,指令依赖图中的有向边用于表征多个指令之间的指令执行依赖关系;待解除类型的指令执行依赖关系包括可解除内存依赖关系;指令依赖信息更新模块1104包括有向边确定模块和有向边删除模块;其中:有向边确定模块,用于从指令依赖图的各有向边中,确定表征可解除内存依赖关系的目标有向边;有向边删除模块,用于将指令依赖图中的目标有向边删除,得到更新后的指令依赖图,根据更新后的指令依赖图得到更新后的指令依赖信息。
在一个实施例中,指令调度信息获得模块1106包括依赖性分析模块、并行执行方式重建模块和并行执行方式处理模块;其中:依赖性分析模块,用于基于更新后的指令依赖信息中的指令执行依赖关系,对多个指令之间进行依赖性分析,得到依赖性分析结果;并行执行方式重建模块,用于通过依赖性分析结果重建多个指令的并行执行方式;并行执行方式处理模块,用于根据并行执行方式得到针对多个指令的指令调度信息。
在一个实施例中,指令依赖信息获取模块1102包括指令序列获得模块、依赖关系确定模块和依赖信息构建模块;其中:指令序列获得模块,用于获取循环体结构的源代码,对源代码进行解析,得到循环体结构的指令序列;依赖关系确定模块,用于确定指令序列中多个指令之间的指令执行依赖关系;依赖信息构建模块,用于基于指令序列和指令执行依赖关系得到指令依赖信息。
在一个实施例中,依赖信息构建模块,还用于将指令序列中的各个指令分别映射为节点;将指令执行依赖关系分别映射为节点之间的有向边;基于各节点和各有向边构建指令依赖图,根据指令依赖图得到指令依赖信息。
在一个实施例中,还包括并行执行模块,用于根据指令调度信息包括的重建后的并行执行方式,从多个指令中确定至少一个待执行指令;按照并行执行方式调度至少一个待执行指令进行并行执行。
上述指令处理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器或终端,其内部结构图可以如图12所示。该计算机设备包括处理器、存储器、输入/输出接口(Input/Output,简称I/O)和通信接口。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储指令处理方法涉及的数据。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种指令处理方法。
本领域技术人员可以理解,图12中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

Claims (15)

1.一种指令处理方法,其特征在于,所述方法包括:
获取属于循环体结构的多个指令之间的指令依赖信息;所述指令依赖信息中包括所述多个指令之间的指令执行依赖关系;
当确定所述循环体结构满足依赖关系更新条件,将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;
基于所述更新后的指令依赖信息中的指令执行依赖关系对所述多个指令的并行执行方式进行重建,得到针对所述多个指令的指令调度信息;所述指令调度信息,用于按照重建后的并行执行方式调度所述多个指令进行并行执行。
2.根据权利要求1所述的方法,其特征在于,所述当确定所述循环体结构满足依赖关系更新条件,将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:
获取所述循环体结构的元数据;
当所述元数据中包括调试标识符,从所述指令依赖信息中确定属于待解除类型的指令执行依赖关系;
将属于待解除类型的指令执行依赖关系从所述指令依赖信息中删除,得到更新后的指令依赖信息。
3.根据权利要求1所述的方法,其特征在于,所述当确定所述循环体结构满足依赖关系更新条件,将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:
获取更新节点集;所述更新节点集包括从循环体结构关系图中基于节点的元数据搜索得到的满足依赖关系更新条件的节点;所述循环体结构关系图中的各节点用于表征各层级的循环体结构;
当所述更新节点集中存在表征所述循环体结构的节点,从所述指令依赖信息中确定属于待解除类型的指令执行依赖关系;
将属于待解除类型的指令执行依赖关系从所述指令依赖信息中删除,得到更新后的指令依赖信息。
4.根据权利要求3所述的方法,其特征在于,所述获取更新节点集,包括:
确定基于各层级的循环体结构构建的循环体结构关系图;
在所述循环体结构关系图中进行节点搜索,得到所表征循环体结构满足依赖关系更新条件的更新节点;
根据各所述更新节点得到更新节点集。
5.根据权利要求2至4任意一项所述的方法,其特征在于,所述方法还包括:
当所述循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在所述循环体结构中增加针对所述循环体结构整体的编译指示信息;
针对所述编译指示信息配置指示信息元数据;所述指示信息元数据中包括用于标识所述编译指示信息的调试标识符;
将所述指示信息元数据更新到所述循环体结构的元数据中。
6.根据权利要求5所述的方法,其特征在于,所述当所述循环体结构的多个指令之间包括属于待解除类型的指令执行依赖关系,在所述循环体结构中增加针对所述循环体结构整体的编译指示信息,包括:
确定所述循环体结构的多个指令各自的指令类型;
当根据所述指令类型确定所述循环体结构包括至少两个属于向量操作类型的待检测指令,确定所述待检测指令之间的指令关系;所述向量操作类型包括向量加载和向量存储中的至少一种;
当所述指令关系包括可解除内存依赖关系,在所述循环体结构中增加针对所述循环体结构整体的编译指示信息。
7.根据权利要求1至6任意一项所述的方法,其特征在于,所述指令依赖信息包括指令依赖图,所述指令依赖图中的节点用于表征所述多个指令,所述指令依赖图中的有向边用于表征所述多个指令之间的指令执行依赖关系;所述待解除类型的指令执行依赖关系包括可解除内存依赖关系;
所述将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息,包括:
从所述指令依赖图的各有向边中,确定表征所述可解除内存依赖关系的目标有向边;
将所述指令依赖图中的所述目标有向边删除,得到更新后的指令依赖图,根据所述更新后的指令依赖图得到更新后的指令依赖信息。
8.根据权利要求1所述的方法,其特征在于,所述基于所述更新后的指令依赖信息中的指令执行依赖关系对所述多个指令的并行执行方式进行重建,得到针对所述多个指令的指令调度信息,包括:
基于所述更新后的指令依赖信息中的指令执行依赖关系,对所述多个指令之间进行依赖性分析,得到依赖性分析结果;
通过所述依赖性分析结果重建所述多个指令的并行执行方式;
根据所述并行执行方式得到针对所述多个指令的指令调度信息。
9.根据权利要求1所述的方法,其特征在于,所述获取属于循环体结构的多个指令之间的指令依赖信息,包括:
获取所述循环体结构的源代码,对所述源代码进行解析,得到所述循环体结构的指令序列;
确定所述指令序列中多个指令之间的指令执行依赖关系;
基于所述指令序列和所述指令执行依赖关系得到指令依赖信息。
10.根据权利要求9所述的方法,其特征在于,所述基于所述指令序列和所述指令执行依赖关系得到指令依赖信息,包括:
将所述指令序列中的各个指令分别映射为节点;
将所述指令执行依赖关系分别映射为所述节点之间的有向边;
基于各所述节点和各所述有向边构建指令依赖图,根据所述指令依赖图得到指令依赖信息。
11.根据权利要求1至10任意一项所述的方法,其特征在于,所述方法还包括:
根据所述指令调度信息包括的重建后的并行执行方式,从所述多个指令中确定至少一个待执行指令;
按照所述并行执行方式调度所述至少一个待执行指令进行并行执行。
12.一种指令处理装置,其特征在于,所述装置包括:
指令依赖信息获取模块,用于获取属于循环体结构的多个指令之间的指令依赖信息;所述指令依赖信息中包括所述多个指令之间的指令执行依赖关系;
指令依赖信息更新模块,用于当确定所述循环体结构满足依赖关系更新条件,将所述指令依赖信息中属于待解除类型的指令执行依赖关系解除,得到更新后的指令依赖信息;
指令调度信息获得模块,用于基于所述更新后的指令依赖信息中的指令执行依赖关系对所述多个指令的并行执行方式进行重建,得到针对所述多个指令的指令调度信息;所述指令调度信息,用于按照重建后的并行执行方式调度所述多个指令进行并行执行。
13.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至11中任一项所述的方法的步骤。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至11中任一项所述的方法的步骤。
15.一种计算机程序产品,包括计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至11中任一项所述的方法的步骤。
CN202311322456.5A 2023-10-11 2023-10-11 指令处理方法、装置、计算机设备和存储介质 Pending CN117348935A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311322456.5A CN117348935A (zh) 2023-10-11 2023-10-11 指令处理方法、装置、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311322456.5A CN117348935A (zh) 2023-10-11 2023-10-11 指令处理方法、装置、计算机设备和存储介质

Publications (1)

Publication Number Publication Date
CN117348935A true CN117348935A (zh) 2024-01-05

Family

ID=89368653

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311322456.5A Pending CN117348935A (zh) 2023-10-11 2023-10-11 指令处理方法、装置、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN117348935A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117707995A (zh) * 2024-02-02 2024-03-15 北京惠朗时代科技有限公司 一种数据预读取的优化装置及操作方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117707995A (zh) * 2024-02-02 2024-03-15 北京惠朗时代科技有限公司 一种数据预读取的优化装置及操作方法
CN117707995B (zh) * 2024-02-02 2024-04-26 北京惠朗时代科技有限公司 一种数据预读取的优化装置及操作方法

Similar Documents

Publication Publication Date Title
Scholz et al. On fast large-scale program analysis in datalog
Jia et al. Optimizing DNN computation with relaxed graph substitutions
Aref et al. Design and implementation of the LogicBlox system
US20210165793A1 (en) Unified optimization of iterative analytical query processing
US8776030B2 (en) Partitioning CUDA code for execution by a general purpose processor
CN105474172B (zh) 用于实现代码划分和在异构处理器内核上执行的高效有向非循环图模式匹配
CN117348935A (zh) 指令处理方法、装置、计算机设备和存储介质
Sevenich et al. Using domain-specific languages for analytic graph databases
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
Schonberg et al. Automatic data structure selection in SETL
Tang et al. FreeTensor: a free-form DSL with holistic optimizations for irregular tensor programs
US9117043B1 (en) Net sensitivity ranges for detection of simulation events
US11262989B2 (en) Automatic generation of efficient vector code with low overhead in a time-efficient manner independent of vector width
Shmeis et al. A rewrite-based optimizer for spark
Custers Algorithmic species: Classifying program code for parallel computing
Wu et al. Composable and efficient functional big data processing framework
Basthikodi et al. Classifying a program code for parallel computing against hpcc
Gad et al. Compiler driven automatic kernel context migration for heterogeneous computing
van de Wall et al. Fully compiled execution of conjunctive graph queries
Goossens et al. Computing on many cores
Metzler et al. Efficient verification of program fragments: Eager POR
Iu et al. Queryll: Java database queries through bytecode rewriting
Rothamel Automatic incrementalization of queries in object-oriented programs
Luo Automatic Matrix Format Exploration for Large Scale Linear Algebra
Lu Program optimization based on a non-procedural specification

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication