内核编译方法、运行方法、编译装置、编程系统及芯片与流程

摘要: 本技术涉及人工智能芯片,尤其涉及一种内核编译方法、运行方法、编译装置、编程系统及芯片。背景技术:1、随着异构计算技术发展,cuda、opencl等单级内核编程模...
内核编译方法、运行方法、编译装置、编程系统及芯片与流程

本技术涉及人工智能芯片,尤其涉及一种内核编译方法、运行方法、编译装置、编程系统及芯片。

背景技术:

1、随着异构计算技术发展,cuda、opencl等单级内核编程模型广泛应用于gpu架构,借助统一内核入口与硬件自动缓存机制实现异构计算。而对于具有分离的多级处理单元的物理拓扑的计算芯片,其不同处理单元往往采用不同的指令集架构,且分别处于独立的执行空间。

2、相关技术中面向gpu的单级编程模型无法直接适配此类具有多级处理单元架构的计算芯片。其中,单级内核模型编排逻辑与计算逻辑混杂,难以针对不同处理单元对应的指令集做差异优化,缺少共享存储显式编排的编程抽象,用户需手动管理数据搬运与缓冲区,编程复杂度高。并且不同处理单元的执行空间和地址空间相互独立,缺乏跨级参数自动传递机制,且不支持跨级屏障同步的自动分配与注入,难以保障跨级硬件协同执行的时序正确性。

技术实现思路

1、本技术实施例的主要目的在于提出内核编译方法、运行方法、编译装置、编程系统及芯片,解决具有多级处理单元的计算芯片的编程模型适配性差、开发复杂及跨级执行不稳定的问题。

2、为实现上述目的,本技术实施例的第一方面提出了一种内核编译方法,包括:

3、获取内核代码,所述内核代码包括至少一个第一内核函数的第一代码和至少一个第二内核函数的第二代码,各所述第一内核函数具有第一执行空间属性,各所述第二内核函数具有不同于所述第一执行空间属性的第二执行空间属性;

4、对所述内核代码进行编译解析,根据所述内核代码中的函数调用关系,识别至少一个跨空间调用关系,各所述跨空间调用关系分别由一个所述第一内核函数调用一个所述第二内核函数形成;

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、所述数据搬运代码还用于在多个第二内核函数执行之前,将所述多个第二内核函数共同使用的计算数据搬运至所述共享存储区域,以供所述多个第二内核函数复用。

53、在一些实施例中,所述第一处理单元对应计算芯片中的编排器,所述第二处理单元对应所述计算芯片中的执行单元;

54、所述编排器用于执行共享存储管理、数据搬运和执行单元任务调度,所述执行单元用于执行计算处理;

55、所述第一目标代码适配32位精简指令集架构,所述第二目标代码适配具有向量扩展的64位精简指令集架构。

56、为实现上述目的,本技术实施例的第二方面提出了一种内核运行方法,包括:

57、加载统一可执行文件,所述统一可执行文件包括适配第一处理单元的第一目标代码和适配第二处理单元的第二目标代码,所述第一目标代码包括与至少一个跨空间调用关系对应的第一跨空间调用处理代码,所述第二目标代码包括与各所述跨空间调用关系对应的第二跨空间调用处理代码;

58、利用所述第一处理单元运行所述第一目标代码,在运行至所述第一目标代码中任一跨空间调用关系所对应的调用节点时,执行对应的第一跨空间调用处理代码,将所述跨空间调用关系所涉及的调用参数写入所述第一处理单元和所述第二处理单元均可访问的共享存储区域,发起调用请求并等待对应的第二内核函数执行完成;

59、利用所述第二处理单元运行所述第二目标代码,响应于所述调用请求,执行对应的第二跨空间调用处理代码,从所述共享存储区域获取所述调用参数,并执行所述调用请求所确定的第二内核函数;

60、在所述第二内核函数执行完成后,使所述第一处理单元结束等待并继续运行所述第一目标代码。

61、为实现上述目的,本技术实施例的第三方面提出了一种内核编译装置,包括:

62、代码获取模块,用于获取内核代码,所述内核代码包括至少一个第一内核函数的第一代码和至少一个第二内核函数的第二代码,各所述第一内核函数具有第一执行空间属性,各所述第二内核函数具有不同于所述第一执行空间属性的第二执行空间属性;

63、调用关系识别模块,用于对所述内核代码进行编译解析,根据所述内核代码中的函数调用关系,识别至少一个跨空间调用关系,各所述跨空间调用关系分别由一个所述第一内核函数调用一个所述第二内核函数形成;

64、代码改写模块,用于基于各所述跨空间调用关系,分别对各所述跨空间调用关系所对应的所述第一代码和所述第二代码进行编译改写,在对应的所述第一代码中生成第一跨空间调用处理代码,并在对应的所述第二代码中生成第二跨空间调用处理代码,得到所述第一内核函数对应的第一中间表示和所述第二内核函数对应的第二中间表示,各所述跨空间调用关系所对应的所述第一跨空间调用处理代码和所述第二跨空间调用处理代码用于在对应的所述第一内核函数和所述第二内核函数分别由第一处理单元和第二处理单元执行时传递调用参数和执行同步;

65、目标代码生成模块,用于根据所述第一执行空间属性和所述第二执行空间属性,将所述第一中间表示和所述第二中间表示分别编译为适配所述第一处理单元的第一目标代码和适配所述第二处理单元的第二目标代码,并基于所述第一目标代码和所述第二目标代码生成统一可执行文件。

66、为实现上述目的,本技术实施例的第四方面提出了一种内核编程系统,包括:

67、编程接口模块,用于提供执行空间声明接口,并通过所述执行空间声明接口为获取的内核代码中的内核函数设置执行空间声明信息;

68、编译模块,用于根据所述执行空间声明信息确定各所述内核函数的执行空间属性,根据所述内核代码中的函数调用关系识别至少一个跨空间调用关系,基于各所述跨空间调用关系生成第一跨空间调用处理代码和第二跨空间调用处理代码,并将编译改写后的所述内核代码分别编译为适配第一处理单元和第二处理单元的目标代码;

69、运行时模块,用于加载基于各所述目标代码生成的统一可执行文件,使所述第一处理单元和所述第二处理单元通过各所述跨空间调用关系所对应的第一跨空间调用处理代码和第二跨空间调用处理代码完成调用参数传递和执行同步。

70、为实现上述目的,本技术实施例的第五方面提出了一种芯片,包括第一处理单元、第二处理单元和共享存储区域;

71、所述共享存储区域能够由所述第一处理单元和所述第二处理单元访问;

72、所述第一处理单元用于运行第一目标代码,并在运行至任一跨空间调用关系所对应的调用节点时,通过对应的第一跨空间调用处理代码将所述跨空间调用关系所涉及的调用参数写入所述共享存储区域,发起调用请求并等待对应的第二内核函数执行完成;

73、所述第二处理单元用于运行第二目标代码,响应于所述调用请求,通过对应的第二跨空间调用处理代码从所述共享存储区域获取所述调用参数,并执行所述调用请求所确定的第二内核函数;

74、所述第一处理单元还用于在所述第二内核函数执行完成后结束等待并继续运行所述第一目标代码;

75、其中,所述第一目标代码由至少一个具有第一执行空间属性的第一内核函数编译得到,所述第二目标代码由至少一个具有第二执行空间属性的第二内核函数编译得到,所述第一执行空间属性与所述第二执行空间属性不同。

76、本技术实施例提出的内核编译方法、运行方法、编译装置、编程系统及芯片,其中,内核编译方法包括:获取内核代码,内核代码包括至少一个第一内核函数的第一代码和至少一个第二内核函数的第二代码,各第一内核函数具有第一执行空间属性,各第二内核函数具有不同于第一执行空间属性的第二执行空间属性;对内核代码进行编译解析,根据内核代码中的函数调用关系,识别至少一个跨空间调用关系,各跨空间调用关系分别由一个第一内核函数调用一个第二内核函数形成;基于各跨空间调用关系,分别对各跨空间调用关系所对应的第一代码和第二代码进行编译改写,在对应的第一代码中生成第一跨空间调用处理代码,并在对应的第二代码中生成第二跨空间调用处理代码,得到第一内核函数对应的第一中间表示和第二内核函数对应的第二中间表示,各跨空间调用关系所对应的第一跨空间调用处理代码和第二跨空间调用处理代码用于在对应的第一内核函数和第二内核函数分别由第一处理单元和第二处理单元执行时传递调用参数和执行同步;根据第一执行空间属性和第二执行空间属性,将第一中间表示和第二中间表示分别编译为适配第一处理单元的第一目标代码和适配第二处理单元的第二目标代码,并基于第一目标代码和第二目标代码生成统一可执行文件。

77、本技术实施例在编译阶段获取包含第一内核函数和第二内核函数的内核代码,利用第一执行空间属性和第二执行空间属性对两级处理单元进行区分,根据内核代码中的函数调用关系自动识别跨空间调用关系,由编译器自动改写并生成基于共享存储的跨空间调用处理代码,在底层自动完成跨地址空间的参数调用与执行同步,无需用户手动分配共享存储缓冲区和管理数据搬运细节,降低编程复杂度与人工出错的概率。同时根据第一执行空间属性和第二执行空间属性,将内核函数分别对应的第一中间表示和第二中间表示分别编译为适配第一处理单元的第一目标代码和适配第二处理单元的第二目标代码,适配不同处理单元对应不同指令集架构的场景,再将分别编译出的第一目标代码和第二目标代码打包生成统一可执行文件,使得这种异构指令集的处理芯片在运行时能够一次性加载并协同调度,最大化释放芯片的硬件性能。