CN113031956A - 程序编译方法和装置以及程序运行方法和装置 - Google Patents

程序编译方法和装置以及程序运行方法和装置 Download PDF

Info

Publication number
CN113031956A
CN113031956A CN201911359143.0A CN201911359143A CN113031956A CN 113031956 A CN113031956 A CN 113031956A CN 201911359143 A CN201911359143 A CN 201911359143A CN 113031956 A CN113031956 A CN 113031956A
Authority
CN
China
Prior art keywords
program
file
instruction
target file
processor
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
CN201911359143.0A
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.)
Cambricon Technologies Corp Ltd
Original Assignee
Cambricon Technologies Corp 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 Cambricon Technologies Corp Ltd filed Critical Cambricon Technologies Corp Ltd
Priority to CN201911359143.0A priority Critical patent/CN113031956A/zh
Publication of CN113031956A publication Critical patent/CN113031956A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

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

Abstract

本披露涉及一种程序编译方法和装置以及程序运行方法和装置,获取至少一个第一程序编译后的第一目标文件,获取至少一个第二程序编译后的第三目标文件,第三目标文件包括第二目标文件和第一程序相关指令,将第一目标文件和第三目标文件进行链接,获得可执行文件。解决了现有的动态链接中,运行可执行文件时无法调用第二目标文件的问题。

Description

程序编译方法和装置以及程序运行方法和装置
技术领域
本披露涉及计算机平台技术领域,特别是涉及一种程序编译方法和装置以及程序运行方法和装置。
背景技术
在相关技术中,用户编写的能够在第一处理器(如CPU)上运行的程序在某些场景(如机器学习)下的处理性能差。基于此,可将第一处理器(CPU)与其他第二处理器(如IPU)构成异构计算机平台,通过第二处理器来加速运算,以解决单一的第一处理器在某些场景下,处理性能差的问题。
其中,在异构编译中,通常有静态链接和动态链接两种方法,因动态链接库具有减少磁盘占用、减小耦合、方便升级等优点,所以多用动态链接。然而在动态链接中,第二处理器的指令和数据并没有预先放进可执行程序中,而是在运行可执行程序时载入,所以当可执行程序装载时,第二处理器的指令和数据并没有装载到内存中,由于动态链接存在延迟绑定的机制,只有在第二处理器部分的函数被调用时才会完成其装载,但是第二处理器的指令在第一处理器那一端是无法调用的,所以直接使用函数指针的内存地址得到的是PLT的地址,并不能拿到第二处理器的代码和数据,故导致程序无法正常执行。
发明内容
基于此,有必要针对上述技术问题,提供一种程序编译方法和装置以及程序运行方法和装置。
根据本披露实施例的第一方面,提供一种程序编译方法,所述方法包括:
获取至少一个第一程序编译后的第一目标文件;
获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
根据本披露实施例的第二方面,提供一种程序运行方法,所述方法包括:
获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
运行所述可执行文件,其中,运行所述可执行文件包括:
当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
根据本披露实施例的第三方面,提供一种程序编译装置,所述装置包括:
第一编译器,用于分别编译至少一个第一程序,获得所述至少一个第一程序编译后的第一目标文件;
第二编译器,用于分别编译至少一个第二程序,获得所述至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
第一链接器,用于将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
根据本披露实施例的第四方面,提供一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一方面所述的方法的步骤。
根据本披露实施例的第五方面,提供一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第二方面所述的方法的步骤。
根据本披露实施例的第六方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面所述的方法的步骤。
根据本披露实施例的第七方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第二方面所述的方法的步骤。
上述程序编译方法和装置以及程序运行方法和装置,获取至少一个第一程序编译后的第一目标文件,获取至少一个第二程序编译后的第三目标文件,第三目标文件包括第二目标文件和第一程序相关指令,将第一目标文件和第三目标文件进行链接,获得可执行文件。其中,因为第三目标文件包括第一程序相关指令,则在运行可执行文件时,可以根据第一程序相关指令调用第二目标文件,从而保证第一处理器在运行编译后的可执行文件时,可以直接调用第二目标文件,从而保证程序能够正常运行。
附图说明
图1为一个实施例中程序编译方法的应用环境图;
图2为一个实施例中程序编译方法的流程示意图;
图3为一个实施例中程序运行示意图;
图4为一个实施例中程序运行方法的流程示意图;
图5为一个实施例中步骤S421的细化步骤的流程示意图;
图6为一个实施例中程序编译装置的结构框图;
图7为一个实施例中程序运行装置的结构框图。
具体实施方式
下面将结合本披露实施例中的附图,对本披露实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本披露一部分实施例,而不是全部的实施例。基于本披露中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本披露保护的范围。
应当理解,本披露的权利要求、说明书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。本披露的说明书和权利要求书中使用的术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在此本披露说明书中所使用的术语仅仅是出于描述特定实施例的目的,而并不意在限定本披露。如在本披露说明书和权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。还应当进一步理解,在本披露说明书和权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
如在本说明书和权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
为了使本披露的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本披露进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本披露,并不用于限定本披露。
本披露提供的程序编译方法,可以应用于如图1所示的应用环境中。其中,程序编译装置运行于异构计算机平台上,程序编译装置可以包括至少一个第一处理器11和至少一个第二处理器12。其中,第一处理器11也可称之为通用处理器,为异构计算机平台的主处理器,可以是但不限于中央处理器(CPU),第一处理器11可以对计算机程序进行编译,得到可执行文件(可执行文件为可以在第一处理器上执行的二进制指令),第一处理器11还可以执行第一处理器11的计算机指令。其中的计算机程序可以包括用于在第一处理器上运行的第一程序和用于在第二处理器上运行的第二程序,该可执行文件可以包括第一程序编译后获得的第一目标文件和第二程序编译后获得的第三目标文件。本申请实施例中,该第三目标文件可以包括第二程序对应的第二目标文件和第一程序相关指令。
第二处理器12可以为异构计算机平台的协处理器,其可以是智能处理器等专用处理器。第二处理器12可以为图像处理器、人工智能处理器等加速器。第二处理器12可以执行上述的第二目标文件。其中,第一处理器和第二处理器可以通过总线连接。
为提高该异构计算机平台的运算效率等性能,用户可以基于特定的编程规则编写用于在第二处理器12上执行的第二程序,该第二程序可以是能够实现特殊算子的功能,该特殊算子可以是用于完成高性能运算的算子。第一程序可以是能够在第一处理器11上运行的程序,例如CPU程序。
进一步地,第一处理器11在对计算机程序进行编译一般会将第一程序和第二程序分别进行编译,得到第一程序编译后的第一目标文件和第二程序编译后的第三目标文件。进一步地,第三目标文件中可以包括第一程序相关指令和第二目标文件,其中该第二目标文件为第二程序编译后获得的二进制文件,该第一程序相关指令为添加在第二目标文件的头部的二进制指令文件,该第一程序相关指令用于解析获得第二目标文件的相关信息。之后链接器将第一处理器11的第一目标文件和第三目标文件进行链接,得到可执行文件。
传统技术中,该第二目标文件往往只包括指令数据头、代码段和数据段等信息。当该第二目标文件为动态链接库时,生成的可执行文件可能只包括该第二目标文件的引用,而不包括该第二目标文件的代码段和数据段等信息,需要在运行时再将上述的代码段和数据段等信息动态加载到内存中,由于延迟绑定机制和第二目标文件的指令无法在第一处理器环境执行,则可能造成程序无法运行。本申请实施例中,通过对第二目标文件的结构进行改进,在传统的第二目标文件的指令数据头之前添加第一程序相关指令,从而获得第三目标文件。该第一目标程序中的调用接口函数可以指向该第一程序相关指令,从而使得在程序运行时,可以通过第一程序相关指令获得第二目标文件的相关信息,保证程序的顺利执行。
具体地,第一处理器11在执行可执行文件的过程中,可以得到第二目标文件的指针或地址,根据第二目标文件的指针或地址,确定第二目标文件中指令、数据、程序调试信息等相关数据,从而可以通过调用驱动程序将相关数据复制到第二处理器12上,使得第二处理器12上运行第二目标文件,以通过第二处理器12和第一处理器11的协同工作,完成特定的处理任务。本申请实施例中,通过对第二目标文件的结构改进,解决了现有的异构编译中的第一处理器无法调用第二处理器的问题。
在一个实施例中,如图2所示,提供了一种程序编译方法,以该方法应用于图1中的程序编译装置为例进行说明,包括以下步骤:
步骤S21,获取至少一个第一程序编译后的第一目标文件;
其中,第一程序是能够在第一处理器上运行的程序,例如CPU程序。第一目标文件为能够在第一处理器上执行的文件,可以是二进制指令,也可以是中间表达指令。
进一步可选地,当该第一程序为两个或两个以上时,用于编译该第一程序的编译器可以分别对多个第一程序进行编译,获得编译后的第一目标文件。之后,第一链接器可以将上述两个以上的编译后的第一目标文件进行链接,获得链接后的第一目标文件。
步骤S22,获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
其中,第二程序是能够在第二处理器上运行的程序,例如能够在人工智能处理器上执行的程序。第二目标文件为能够在第二处理器上执行的文件,可以是二进制指令,也可以是中间表达指令。
其中,在没有进行任何处理的情况下,第一处理器上无法运行第二目标文件,第二处理器上无法运行第一目标文件。在本披露实施例中,在编译第二程序时,会自动添加第一程序相关指令,从而改变了第二目标文件的结构。可选地,该第一程序相关指令与第一处理器的类型相关,从而第一处理器能够识别并运行该第一程序相关指令,这样由于第一程序相关指令的存在,第一处理器可以第二处理器运行第二目标文件。
进一步可选地,当该第二程序为两个或两个以上时,用于编译该第二程序的编译器可以分别对多个第二程序进行编译,获得编译后的第三目标文件。之后,第二链接器可以将上述两个以上的编译后的第三目标文件进行链接,获得链接后的第三目标文件。
步骤S23,将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
具体地,第一链接器可以将上述的第一目标文件和第三目标文件进行链接,获得可执行文件。该可执行文件可以包括上述的第一目标文件和第三目标文件,该第三目标文件可以以文本存在于可执行文件中。进一步可选地,该可执行文件可以包括上述的第一目标文件和对第三目标文件的引用指令(该引用指令包括第一程序相关指令)。第一处理器可以执行上述的可执行文件,从而实现程序的运行。
可选地,当第一目标文件和第二目标文件为多个时,第一链接器可以将链接后的第一目标文件和链接后的第三目标文件进行链接获得上述的可执行文件。第一链接器也可以直接将多个第一目标文件和链接后的第三目标文件进行链接,获得上述的可执行文件,此处不做具体的限定。
上述程序编译方法,获取至少一个第一程序编译后的第一目标文件,获取至少一个第二程序编译后的第三目标文件,第三目标文件包括第二目标文件和第一程序相关指令,将第一目标文件和第三目标文件进行链接,获得可执行文件。其中,因为第三目标文件包括第一程序相关指令,则在运行可执行文件时,可以根据第一程序相关指令得到第二目标文件的指针或地址,根据第二目标文件的指针或地址,确定指令、数据、程序调试信息等相关数据,将相关数据复制到第二处理器12上,使得第二处理器12上运行第二目标文件,从而通过第二处理器12和第一处理器11的协同工作,完成特定的处理任务。
在一个实施例中,步骤S22所述获取至少一个第二程序编译后的第三目标文件,具体包括:
分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
在本披露实施例中,每编译一个第二程序,则在编译后的第二目标文件的头部自动插入第一程序相关指令。如图3所示,第一程序相关指令(Host wrapper)置于第二目标文件的指令数据头(Header)之前。第一目标文件的调用接口函数InvokKernel(Entry)指向该第一程序相关指令。
例如,假设存在第一处理器A、第二处理器B和第二处理器C,第二程序B和第三程序C,其中,第二程序B是能够在第二处理器B上运行的程序,第三程序C是能够在第二处理器C上运行的程序,第一处理器A对第二程序B进行编译,并插入第一程序相关指令,得到第三目标文件B,第一处理器A对第二程序C进行编译,并插入第一程序相关指令,得到第三目标文件C。
进一步地,所述第二目标文件为动态链接库文件或静态链接库文件。
进一步地,所述第一程序相关指令与运行所述第一程序的平台类型相关。具体地,该第一程序相关指令与第一处理器的类型相关。可选地,运行所述第一程序的平台类型,即第一处理器可以包括CPU、GPU或FPGA中的至少一种,此处不做具体限定。
现有技术中(第三目标文件不包括第一程序相关指令),尤其是在动态链接中,第三目标文件不包括第一程序相关指令,第二处理器的指令和数据是在运行可执行文件时才会载入的,所以当可执行文件装载时,第二处理器的指令和数据并没有装载到内存中,由于动态链接存在延迟绑定的机制,只有在第二处理器部分的函数被调用时才会完成其装载,但是第二处理器的指令在第一处理器那一端是无法调用的,所以直接使用函数指针的内存地址得到的是PLT的地址,并不能拿到第二目标文件的指针或地址,也无法获取运行第二目标文件所需的指令、数据、程序调试信息等相关数据。
而在在本披露实施例中,在运行可执行文件的时候,因为第一程序相关指令与运行第一程序的平台类型相关,第一程序相关指令是一堆与运行第一程序的平台类型相关的二进制指令,所以第一处理器可以继续运行第一程序相关指令,得到第二目标文件的指针或地址,从而获取运行第二目标文件所需的指令、数据、程序调试信息等相关数据。其中,如果没有第一程序相关指令在,则第一处理器没有办法继续正确执行,得到第二目标文件的指针或地址,从而会导致程序无法正常执行。
在一个实施例中,如图4所示,提供了一种程序运行方法,包括以下步骤:
步骤S41,获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
步骤S42,运行所述可执行文件,其中,运行所述可执行文件包括:
步骤S421,当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
步骤S422,根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
本披露实施例中的可执行文件、第二目标文件、第一程序相关指令、第二目标文件等内容的描述和上述各实施例中的相关内容描述一致,此处不在加以赘述。
在本披露实施例中,在第二处理器运行第二目标文件的同时,第一处理器会继续执行可执行文件,第二处理器运行第二目标文件后,得到结果,将该结果反馈至第一处理器,从而通过第一处理器和第二处理器的协同工作,高效的完成特定的处理任务。
在一个实施例中,如图5所示,为步骤S421的细化步骤的流程示意图,其中,所述第一程序相关指令包括第一解析指令;步骤S421具体包括:
步骤S4211,当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;
步骤S4212,解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
本披露实施例中,如图3所示的程序运行示意图,第一处理器运行可执行文件,当运行至调用接口函数InvokKernel(Entry)时,可以直接跳转到Host Wrapper(第一程序相关指令)的地址,其中,第一程序相关指令的第一解析指令的伪代码如下所示:
Figure BDA0002336718300000091
其中,跳转到Host Wrapper的地址后,调用第一程序相关指令,得到第二目标文件的指令数据头地址Header’s ptr,并可以将该指令数据头的地址返回至运行时runtime。运行时可以根据第二目标文件的指令数据头地址Header’s ptr,获得该第二目标文件的指令数据头,并对第二目标文件的指令数据头Header进行解析(如图3所示的parse Header),得到第二目标文件对应的数据信息(包括指令和数据的内存地址(char*)Entry()、指令长度信息、数据长度信息等等),即char*ptr=(char*)Entry();int instlen=(int*)prt[0];int datalen=(int*)prt[1]...等等数据信息,根据该数据信息获取第二处理器运行第二目标文件所需的指令、数据、程序调试信息等相关数据。之后,如图3所示,运行时可以通过调用驱动程序将指令、数据和程序调试信息复制到第二处理器,使得第二处理器可以运行第二目标文件。
其中,char*ptr=(char*)Entry()表示获得指令数据头的指针;
int instlen表示指令长度信息;
int datalen表示数据长度信息;
需要说明的是,图3中的...表示后续还需要获取debug info,debug info表示程序版本、存储占用和调试信息等其他信息。
在本披露实施例中,第一解析指令即为上文中指出的伪代码,通过上述伪代码,得到第二目标文件的指令数据头地址(即Header’s ptr)。解析Header’s ptr,获得指令、数据、程序调试信息等信息的地址或指针,根据指令、数据、程序调试信息等信息的地址或指针,得到指令、数据、程序调试信息等信息。之后,如图3所示,运行时通过调用驱动程序将指令、数据和程序调试信息复制到第二处理器,使得第二处理器可以运行第二目标文件。
在本披露实施例中,为了便于理解,举例说明,假设存在第一处理器A、第二处理器B和第二处理器C,第一程序A、第二程序B和第三程序C,其中,第一程序A是能够在第一处理器A上运行的程序,第二程序B是能够在第二处理器B上运行的程序,第三程序C是能够在第二处理器C上运行的程序,第一处理器A对第一程序A进行编译,得到第一目标文件A,第一处理器A对第二程序B进行编译,并插入第一程序相关指令,得到第三目标文件B,第一处理器A对第二程序C进行编译,并插入第一程序相关指令,得到第三目标文件C。之后,链接器将第一目标文件A和第三目标文件链接,得到可执行文件。
第一处理器A运行可执行文件时,当运行至调用接口函数时(假设该调用接口函数是调用第三程序C的接口函数),可以直接调用第一程序相关指令,得到第三目标文件C的指令数据头地址(即Header’s ptr),并将该第三目标文件C的指令数据头地址返回给运行时。运行可以解析第三目标文件C的指令数据头地址,获得第二目标文件对应的数据信息,即inst,data,debug info的地址、长度等数据信息,根据第二目标文件对应的数据信息确定相关数据(即inst,data,debug info)。之后,如图3所示,运行时可以调用驱动程序将指令、数据和程序调试信息复制到第二处理器,使得第二处理器可以运行第二目标文件。
进一步地,所述第二目标文件为动态链接库文件或静态链接库文件。
进一步地,所述第一程序相关指令与运行所述第一程序的平台类型相关。即该第一程序相关指令与第一处理器的类型相关。可选地,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
现有技术中(第三目标文件不包括第一程序相关指令),尤其是在动态链接中,第三目标文件不包括第一程序相关指令第二处理器的指令和数据是在运行可执行文件时才会载入的,所以当可执行文件装载时,第二处理器的指令和数据并没有装载到内存中,由于动态链接存在延迟绑定的机制,只有在第二处理器部分的函数被调用时才会完成其装载,但是第二处理器的指令在第一处理器那一端是无法调用的,所以直接使用函数指针的内存地址得到的是PLT的地址,并不能拿到第二目标文件的指针或地址,也无法获取运行第二目标文件所需的指令、数据、程序调试信息等相关数据。
而在在本披露实施例中,在运行可执行文件的时候,因为第一程序相关指令与运行第一程序的平台类型相关,所以第一处理器可以继续运行第一程序相关指令,得到第二目标文件的指针或地址,从而获取运行第二目标文件所需的指令、数据、程序调试信息等相关数据。其中,如果没有第一程序相关指令在,则第一处理器没有办法继续正确执行,得到第二目标文件的指针或地址,从而会导致程序无法正常执行。
在一个实施例中,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据。本申请实施例中,该第一程序相关指令可以包括第一解析指令和第二解析指令。该第一解析指令可以参照上文中提到的伪代码,该第二解析指令可以是指图3中的运行时相关的指令。
本披露实施例中,第一处理器运行可执行文件,当运行至调用接口函数时,因为第一程序相关指令中的第二解析指令具有解析指令数据、调试信息和驱动拷贝的功能,则可以利用第一程序相关指令直接获得第二目标文件对应的数据信息,以调用驱动程序将第二目标文件对应的数据信息拷贝至第二处理器,第二处理器能够运行第二目标文件,从而省去了运行时的相关操作。
具体的,本披露实施例中,将第二解析指令添加到Host Wrapper,取消Runtime的执行过程,则第一处理器运行可执行文件,当运行至调用接口函数时,可以直接跳转到HostWrapper,因为Host Wrapper中存在第二解析指令,该第二解析指令具有解析指令数据、调试信息和驱动拷贝的功能,则根据第二解析指令可以直接获得第二目标文件对应的相关数据,并将相关数据复制到第二处理器,使得第二处理器可以运行第二目标文件。
可选地,在一个实施例中,当得到可执行文件后,如果需要在异构计算机平台中添加一第二处理器D时,第一处理器A可以对运行在第二处理器D上的第二程序D进行编译,并插入第一程序相关指令,得到第二目标文件D,将上述所有第二目标文件统称为第三目标文件。之后的流程和上述实施例描述的一致,此处不再加以赘述。
在本披露实施例中,当需要在异构计算机平台中再添加一第二处理器时,现有技术中通常是需要编译该新添加的第二处理器(假设编译后生成X文件)、还需要重新编译第一处理器(假设编译后生成Y文件)以及需要重新编译X文件和Y文件的链接文件,即现有技术中需要编译三次,过程繁琐费事,但是根据本实施例中的方案,在异构计算机平台中添加一第二处理器时,只需进行一次编译(编译第二程序D),更新第三目标文件,重新进行链接便可得到可执行文件,实现第一处理器对新添加的第二处理器的调用,而不需要编译三次,减少磁盘占用且高效。
应该理解的是,虽然图2、4、5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、4、5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图6所示,提供了一种程序编译装置,包括:第一编译器61、第二编译器62和第一链接器63,其中:
第一编译器61,用于分别编译至少一个第一程序,获得所述至少一个第一程序编译后的第一目标文件;
第二编译器62,用于分别编译至少一个第二程序,获得所述至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
第一链接器63,用于将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
在一个实施例中,第二编译器62具体用于:
分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
在一个实施例中,该程序编译装置还可以包括第二链接器,该第二连接器用于将多个第三目标文件进行链接,获得链接后的第三目标文件。进一步可选地,该第一连接器可以将链接后的第三目标文件和多个第一目标文件进行链接,获得可执行文件。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
在一个实施例中,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
关于程序编译装置的具体限定可以参见上文中对于程序编译方法的限定,在此不再赘述。上述程序编译装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,如图7所示,提供了一种程序运行装置,包括:获取模块71和运行模块72,其中:
获取模块71,用于获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
运行模块72,用于运行所述可执行文件,其中,所述运行模块72具体用于:
当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
在一个实施例中,所述第一程序相关指令包括第一解析指令;运行模块72具体用于:
当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;
解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
在一个实施例中,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
关于程序运行装置的具体限定可以参见上文中对于程序运行方法的限定,在此不再赘述。上述程序运行装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取至少一个第一程序编译后的第一目标文件;
获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
在一个实施例中,所述处理器执行所述计算机程序时还实现以下步骤:
分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
在一个实施例中,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
在一个实施例中,提供了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
运行所述可执行文件,其中,运行所述可执行文件包括:
当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
在一个实施例中,所述第一程序相关指令包括第一解析指令;所述处理器执行所述计算机程序时还实现以下步骤:
当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;
解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
在一个实施例中,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
其中,电子设备包括但不限于手机、笔记本电脑、平板电脑、台式电脑、服务器等。
需要说明的是,上述实施例中对程序编译方法、程序运行方法的解释说明也适用于本实施例的电子设备,为避免冗余,在此不再赘述。
应该理解,上述实施例仅是示意性的,还可通过其它的方式实现。例如,上述实施例中所述单元/模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个单元、模块或组件可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。
另外,若无特别说明,在本披露各个实施例中的各功能单元/模块可以集成在一个单元/模块中,也可以是各个单元/模块单独物理存在,也可以两个或两个以上单元/模块集成在一起。上述集成的单元/模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取至少一个第一程序编译后的第一目标文件;
获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
在一个实施例中,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
运行所述可执行文件,其中,运行所述可执行文件包括:
当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
在一个实施例中,所述第一程序相关指令包括第一解析指令;计算机程序被处理器执行时还实现以下步骤:
当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;
解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
在一个实施例中,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据。
在一个实施例中,所述第二目标文件为动态链接库文件或静态链接库文件。
在一个实施例中,所述第一程序相关指令与运行所述第一程序的平台类型相关。
所述集成的单元/模块如果以硬件的形式实现时,该硬件可以是数字电路,模拟电路等等。硬件结构的物理实现包括但不局限于晶体管,忆阻器等等。若无特别说明,所述第一处理器可以是任何适当的硬件处理器,比如CPU,所述第二处理器可以是任何适当的硬件处理器,比如GPU、FPGA、DSP和ASIC等等。若无特别说明,所述存储器可以是任何适当的磁存储介质或者磁光存储介质,比如,阻变式存储器RRAM(Resistive Random Access Memory)、动态随机存取存储器DRAM(Dynamic Random Access Memory)、静态随机存取存储器SRAM(Static Random-Access Memory)、增强动态随机存取存储器EDRAM(Enhanced DynamicRandom Access Memory)、高带宽内存HBM(High-Bandwidth Memory)、混合存储立方HMC(Hybrid Memory Cube)等等。
所述集成的单元/模块如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本披露的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本披露各个实施例所述方法的全部或部分步骤。而前述的存储器包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
依据以下条款可更好地理解前述内容:
条款A1,一种程序编译方法,所述方法包括:获取至少一个第一程序编译后的第一目标文件;获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
条款A2,根据条款A1所述的方法,所述获取至少一个第二程序编译后的第三目标文件,包括:分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
条款A3,根据条款A1或A2所述的方法,所述第二目标文件为动态链接库文件或静态链接库文件。
条款A4,根据条款A1所述的方法,所述第一程序相关指令与运行所述第一程序的平台类型相关。
条款A5,根据条款A4所述的方法,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
条款A6,一种程序运行方法,所述方法包括:获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;运行所述可执行文件,其中,运行所述可执行文件包括:当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
条款A7,根据条款A6所述的方法,所述第一程序相关指令包括第一解析指令;所述当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息,包括:当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
条款A8,根据条款A6或A7所述的方法,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据。
条款A9,根据条款A6或A7所述的方法,所述第二目标文件为动态链接库文件或静态链接库文件。
条款A10,根据条款A6或A7所述的方法,所述第一程序相关指令与运行所述第一程序的平台类型相关。
条款A11,一种程序编译装置,所述装置包括:第一编译器,用于分别编译至少一个第一程序,获得所述至少一个第一程序编译后的第一目标文件;第二编译器,用于分别编译至少一个第二程序,获得所述至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;第一链接器,用于将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
条款A12,一种程序运行装置,所述装置包括:获取模块,用于获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;运行模块,用于运行所述可执行文件,其中,所述运行模块具体用于:当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
条款A13,一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求A1至A10中任一项所述方法的步骤。
条款A14、一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求A1至A10中任一项所述的方法的步骤。
以上对本披露实施例进行了详细介绍,本文中应用了具体个例对本披露的原理及实施方式进行了阐述,以上实施例的说明仅用于帮助理解本披露的方法及其核心思想。同时,本领域技术人员依据本披露的思想,基于本披露的具体实施方式及应用范围上做出的改变或变形之处,都属于本披露保护的范围。综上所述,本说明书内容不应理解为对本披露的限制。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。上述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

Claims (13)

1.一种程序编译方法,其特征在于,所述方法包括:
获取至少一个第一程序编译后的第一目标文件;
获取至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
2.根据权利要求1所述的方法,其特征在于,所述获取至少一个第二程序编译后的第三目标文件,包括:
分别对各个所述第二程序进行编译,并插入所述第一程序相关指令,获得各个所述第二程序对应的第三目标文件。
3.根据权利要求1或2所述的方法,其特征在于,所述第二目标文件为动态链接库文件或静态链接库文件。
4.根据权利要求1所述的方法,其特征在于,所述第一程序相关指令与运行所述第一程序的平台类型相关。
5.根据权利要求4所述的方法,其特征在于,运行所述第一程序的平台类型包括CPU、GPU或FPGA中的至少一种。
6.一种程序运行方法,其特征在于,所述方法包括:
获取可执行文件,其中,所述可执行文件包括第一目标文件和第三目标文件;所述第三目标文件包括第二目标文件和第一程序相关指令;所述第一目标文件包含调用接口函数;
运行所述可执行文件,其中,运行所述可执行文件包括:
当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息;
根据所述第二目标文件对应的数据信息确定相关数据,并将所述相关数据拷贝至第二处理器,以使第二处理器能够运行所述第二目标文件。
7.根据权利要求6所述的方法,其特征在于,所述第一程序相关指令包括第一解析指令;所述当运行至所述调用接口函数时,调用所述第一程序相关指令,获得所述第二目标文件对应的数据信息,包括:
当运行至所述调用接口函数时,调用所述第一程序相关指令的第一解析指令,获得所述第二目标文件的指令数据头地址;
解析所述第二目标文件的指令数据头地址,获得所述第二目标文件对应的数据信息。
8.根据权利要求6或7所述的方法,其特征在于,第一程序相关指令还包括第二解析指令;所述第二解析指令用于获得所述第二目标文件对应的相关数据信息。
9.根据权利要求6或7所述的方法,其特征在于,所述第二目标文件为动态链接库文件或静态链接库文件。
10.根据权利要求6或7所述的方法,其特征在于,所述第一程序相关指令与运行所述第一程序的平台类型相关。
11.一种程序编译装置,其特征在于,所述装置包括:
第一编译器,用于分别编译至少一个第一程序,获得所述至少一个第一程序编译后的第一目标文件;
第二编译器,用于分别编译至少一个第二程序,获得所述至少一个第二程序编译后的第三目标文件;所述第三目标文件包括第二目标文件和所述第一程序相关指令;
第一链接器,用于将所述第一目标文件和所述第三目标文件进行链接,获得可执行文件。
12.一种电子设备,其特征在于,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至10中任一项所述方法的步骤。
13.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至10中任一项所述的方法的步骤。
CN201911359143.0A 2019-12-25 2019-12-25 程序编译方法和装置以及程序运行方法和装置 Pending CN113031956A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911359143.0A CN113031956A (zh) 2019-12-25 2019-12-25 程序编译方法和装置以及程序运行方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911359143.0A CN113031956A (zh) 2019-12-25 2019-12-25 程序编译方法和装置以及程序运行方法和装置

Publications (1)

Publication Number Publication Date
CN113031956A true CN113031956A (zh) 2021-06-25

Family

ID=76458549

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911359143.0A Pending CN113031956A (zh) 2019-12-25 2019-12-25 程序编译方法和装置以及程序运行方法和装置

Country Status (1)

Country Link
CN (1) CN113031956A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118093446A (zh) * 2024-04-28 2024-05-28 上海燧原智能科技有限公司 一种异构程序调试方法、系统、装置、电子设备及存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120272224A1 (en) * 2011-04-20 2012-10-25 Qualcomm Incorporated Inline function linking
CN104660596A (zh) * 2015-02-10 2015-05-27 常州万联网络数据信息安全股份有限公司 异构网络协议标准智件、云监控管理系统和方法
US20180165076A1 (en) * 2016-12-14 2018-06-14 International Business Machines Corporation Context information based on type of routine being called
CN108563448A (zh) * 2018-04-19 2018-09-21 清华大学 程序文件的编译方法、系统、计算机设备和存储介质
CN109656566A (zh) * 2018-12-14 2019-04-19 北京中科寒武纪科技有限公司 异构计算系统可执行文件获取方法、运行方法及相关产品
CN110018831A (zh) * 2019-04-04 2019-07-16 北京中科寒武纪科技有限公司 程序处理方法、装置及相关产品

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120272224A1 (en) * 2011-04-20 2012-10-25 Qualcomm Incorporated Inline function linking
CN104660596A (zh) * 2015-02-10 2015-05-27 常州万联网络数据信息安全股份有限公司 异构网络协议标准智件、云监控管理系统和方法
US20180165076A1 (en) * 2016-12-14 2018-06-14 International Business Machines Corporation Context information based on type of routine being called
CN108563448A (zh) * 2018-04-19 2018-09-21 清华大学 程序文件的编译方法、系统、计算机设备和存储介质
CN109656566A (zh) * 2018-12-14 2019-04-19 北京中科寒武纪科技有限公司 异构计算系统可执行文件获取方法、运行方法及相关产品
CN110018831A (zh) * 2019-04-04 2019-07-16 北京中科寒武纪科技有限公司 程序处理方法、装置及相关产品

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118093446A (zh) * 2024-04-28 2024-05-28 上海燧原智能科技有限公司 一种异构程序调试方法、系统、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
CN107291480B (zh) 一种函数调用方法及装置
KR102059705B1 (ko) 적응식 이식가능 라이브러리
JPH0836488A (ja) ダイナミック・パッチングを使用するランタイム・エラー・チェック方法と装置
US8762967B2 (en) Program compiler, program installer, and program install method
US10684835B1 (en) Improving emulation and tracing performance using compiler-generated emulation optimization metadata
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
US9235389B2 (en) Method of providing embedded software development tool for supporting embedded software development environment based on native building, and apparatus thereof
CN115629971A (zh) 一种应用的开发系统和开发方法
CN112130926B (zh) 应用程序运行的方法、装置、终端设备及存储介质
CN111767056A (zh) 一种源码编译方法、可执行文件运行方法及终端设备
CN112631618A (zh) 应用程序打包方法、应用程序测试方法、终端及存储介质
US8458671B1 (en) Method and system for stack back-tracing in computer programs
US20040261055A1 (en) Predictively processing tasks for building software
US8769498B2 (en) Warning of register and storage area assignment errors
US10496433B2 (en) Modification of context saving functions
CN113031956A (zh) 程序编译方法和装置以及程序运行方法和装置
US10552135B1 (en) Reducing a size of an application package
US10521206B2 (en) Supporting compiler variable instrumentation for uninitialized memory references
CN114706586A (zh) 代码编译、代码运行方法、装置、计算机设备及存储介质
CN106897588B (zh) 一种标签函数的处理方法及装置
CN115470151B (zh) 一种应用运行分析方法、计算设备及存储介质
CN113495727B (zh) 业务组件开发方法、装置、电子设备及介质
JP5464673B2 (ja) コンパイル支援装置、コンパイル支援方法、及びプログラム
CN113220334B (zh) 程序故障定位方法、终端设备及计算机可读存储介质
CN114371852B (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