发布信息

一种指令缓存方法及编译工具链与流程

作者:admin      2022-10-26 07:37:04     780



计算;推算;计数设备的制造及其应用技术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.图1为相关技术中机器指令跨高速缓存行缓存的一种示意图;55.图2为本技术实施例提供的指令缓存方法的第一种流程示意图;56.图3为本技术实施例提供的指令缓存方法的第二种流程示意图;57.图4为本技术实施例提供的指令缓存方法的第三种流程示意图;58.图5为本技术实施例提供的编译工具链的一种结构示意图。具体实施方式59.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员基于本技术所获得的所有其他实施例,都属于本技术保护的范围。60.编译工具链是一组工具的集合,主要包含了预处理器、编译器、汇编器和链接器。其中,预处理器用于头文件展开、宏定义替换等;编译器用于将高级语言的代码编译成汇编语言的代码;汇编器用于将汇编语言的代码汇编成机器指令,并将机器指令写入到目标文件;链接器用于将多个目标文件组合在一起生成最终的可执行文件。gnu的编译工具链将预处理器和编译器的代码合并在一个gcc源码包中发布,将汇编器和链接器则合并在另一个binutils源码包中发布。61.精简指令集计算机(reduced instruction set computer,risc)体系结构的计算机为了简化设计通常都使用定长的机器指令,但是为了在有限内存空间的嵌入式系统上运行,使用32位长的精简指令集的risc体系结构的计算机又设计了另外一套16位长的精简指令集,这两套精简指令集可以同时被解析执行。精简指令集包括多个机器指令。对于具有众核架构的网络处理器而言,通常有几千个硬件线程,使用risc体系结构的网络处理器非常有助于减少芯片的面积。但是网络处理器除了使用上述两套精简指令集外,还会扩展出带有32位立即数的机器指令,用于加速网络数据包的处理。这种情况下,机器指令的长度就可能是16、32、48或64位,长度不统一的机器指令被混合编译在一起,会出现一条机器指令跨越多个高速缓存行(cache line)的情况,如下图1所示的机器指令跨高速缓存行缓存的情况。图1中,一行矩形框表示一个高速缓存行,一个带省略号的矩形框表示省略了多个矩形框,一个矩形框表示2字节(16位)空间。图1中,每个高速缓存行末尾和相应的下一个高速缓起始带阴影的矩形框表示同一机器指令,且该机器指令为跨高速缓存行缓存的指令。62.混长的机器指令有助于提高代码的密度,但在4字节的risc体系结构的计算机上也带来了另外一个问题,如果机器指令的开始写入地址没有对齐在4字节的边界(即机器指令的开始写入地址对4取余不为0),那么网络处理器内部会进行对齐操作,这会导致流水线作业停滞,从而降低程序执行的效率。63.相关技术中,为了提高程序执行的效率,裁剪掉2字节的机器指令。但是如果裁剪掉2字节的机器指令,那么机器指令的长度仅为4字节和8字节,这样可以在4字节的地址边界对齐,流水线不会因为对齐而停滞,但这会导致代码膨胀,如2字节的机器指令膨胀为4字节的机器指令,6字节的机器指令膨胀为8字节的机器指令,这使得指令高速缓存的命中率降低,也会影响程序的执行效率。64.为提高程序执行的效率,本技术实施例提供了一种指令缓存方法,该方法可以应用于网络处理器或编译工具链,如上述gnu的编译工具链。为便于描述,下面均以编译工具链为执行主体进行说明,并不起限定作用。上述指令缓存方法中,在获得编译和汇编原始代码,得到机器指令之后,编译工具链并不会直接将机器指令写入高速缓存行,而是检测该机器指令是否满足跨高速缓存行缓存条件,再满足跨高速缓存行缓存条件时,使用空操作指令写满当前写入指令的高速缓存行,进而所得到的机器指令就可以在下一个高速缓存行的起始边界开始写入,实现了机器指令的边界对齐,网络处理器内部无需再对机器指令进行对齐操作,也就不会导致流水线作业停滞,提高了程序执行的效率。65.另外,本技术实施例提供的指令缓存方法中,编译工具链只在机器指令满足跨高速缓存行缓存条件时,才会插入空操作指令,相对于裁剪掉2字节的机器指令,本技术实施例提供的出现的代码膨胀程度较小,提高了指令高速缓存的命中率,进一步提高了程序执行的效率。66.下面通过具体实施例,对本技术实施例提供的指令缓存方法进行详细说明。67.参见图2,图2为本技术实施例提供的指令缓存方法的第一种流程示意图,该方法包括如下步骤:68.步骤s21,运行编译程序和汇编程序,以编译和汇编原始代码,得到第一机器指令。69.本技术实施例中,原始代码为高级语言的代码。编译工具链运行编译程序,将高级语言的原始代码编译成汇编语言的代码(即汇编代码);运行汇编程序,将汇编语言的代码汇编成机器指令,即第一机器指令。70.在一些实施例中,原始代码的机器描述文件可以包括多条机器指令的扩展长度,每条机器指令的扩展长度为该机器指令的原始长度与预设长度的和值。71.举例来说,gcc源码树中的机器描述文件中包括相关机器指令的长度属性。编译工具链可以修改该机器描述文件中相关机器指令的长度属性,使得该长度属性的长度值为机器指令的原始长度值与预设长度的和值。72.例如,预设长度为2字节,机器指令1为4字节的指令,即该机器指令1的原始长度值为4字节。编译工具链将该机器指令1的长度属性修改为4+2=6字节。73.基于上述原始代码的机器描述文件包括多条机器指令的扩展长度,当需要编译和汇编的机器指令中包括跳转指令(如第一跳转指令)时,编译工具链在运行编译程序的过程,利用每条机器指令的扩展长度,预估第一跳转指令对应的跳转目的地址。74.若跳转目的地址超过第一跳转指令的跳转范围,则编译工具链将第一跳转指令替换为第二跳转指令,跳转目的地址在第二跳转指令的跳转范围内。其中,第二跳转指令可以为跳转范围大于第一跳转指令的跳转指令,第二跳转指令也可以由多个跳转指令组成,对此不进行限定。此时,上述步骤s21可以为:运行编译程序和汇编程序,以编译和汇编第二跳转指令对应的原始代码,得到第二跳转指令对应的第一机器指令。75.若跳转目的地址在第一跳转指令的跳转范围,则编译工具链不会对第一跳转指令进行其他操作。此时,上述步骤s21可以为:运行编译程序和汇编程序,以编译和汇编第一跳转指令对应的原始代码,得到第一跳转指令对应的第一机器指令。76.机器描述文件中包括相关机器指令的长度属性,用于在编译阶段预估跳转目的地址是否在跳转指令(一种机器指令)的跳转范围内。在编译阶段,如果编译工具链预估跳转目的地址超过跳转范围,编译工具链会选择更远跳转范围的指令,或多个跳转指令,以通过多次跳转来跳转到目的地址;否则,编译工具链会选择短跳转范围的指令。在汇编阶段,如果编译工具链计算指令的目的地址超出了短跳转范围的跳转指令的跳转范围,则不能跳转到目的地址,进而报错。本技术实施例中,编译工具链将机器描述文件中相关机器指令的长度属性增加了预设长度,这样,在编译阶段,编译工具链预估跳转目的地址会较远,进而选择更远跳转范围的指令或多个跳转指令,降低了后续因代码膨胀,导致实际计算得到的指令的目的地址超出跳转指令的跳转范围情况的出现概率。77.上述预设长度表示预测机器指令膨胀的长度,预设长度的大小可以根据实际需求进行设定。一个示例中,预设长度可以为一个最短长度的机器指令的长度。本技术实施例中,编译工具链采用插入空操作指令(如nop指令)的方式,来实现机器指令的边界对齐,最短长度的机器指令的长度与空操作指令的长度相同,因此,上述预设长度又可以理解为一个空操作指令的长度。机器描述文件包括的每条机器指令的扩展长度为:该机器指令的原始长度增加一个空操作指令的长度。78.例如,一个空操作指令的长度为2字节,则上述预设长度为2字节,一个机器指令的原始长度为4字节,则机器描述文件包括的该机器指令的扩展长度为4+2=6字节。79.本技术实施例中,编译工具链还可以通过其他方式,来解决因代码膨胀,导致实际计算得到的指令的目的地址超出跳转指令的跳转范围的问题。例如,编译工具链可以将预设长度作为运行参数,写入编译程序,运行修改后的编译程序,以在机器描述文件包括每条机器指令的长度的基础上增加编译程序中的预设长度,进而完成预估跳转目的地址是否在跳转指令的跳转范围内的判断。80.步骤s22,若汇编程序根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令满足跨高速缓存行缓存条件,则使用空操作指令写满起始写入地址所在的第一高速缓存行。81.本技术实施例中,跨高速缓存行缓存条件为指示机器指令需要至少两个高速缓存行才能完成缓存的条件。高速缓存行是内存中的一个缓存行,内存中包括多个高速缓存行。起始写入地址可以为内存的起始地址,也可以为上一次写入指令后的末尾地址。例如,在内存中未缓存任何指令时,起始写入地址为内存的起始地址;在内存中缓存有指令时,起始写入地址为上一次写入指令后的末尾地址。82.编译工具链在获得第一机器指令之后,可以暂时不将第一机器指令写入内存,而是继续运行汇编程序,以根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令是否满足跨高速缓存行缓存条件。若第一机器指令不满足跨高速缓存行缓存条件,则编译工具链可以从起始写入地址开始,写入第一机器指令。83.为便于后续描述,以下将起始写入地址所在的高速缓存行简称为第一高速缓存行,从起始写入地址至第一高速缓存行末尾的空间的长度简称为目标长度。若第一机器指令满足跨高速缓存行缓存条件,则编译工具链可以获取目标长度的空操作指令,从起始写入地址开始写入所获取的空操作指令,这样就实现了使用空操作指令写满起始写入地址所在的第一高速缓存行。84.步骤s23,从第二高速缓存行的起始边界开始,写入第一机器指令,第二高速缓存行为第一高速缓存行的下一个高速缓存行。85.在写入空操作指令结束后,起始写入地址更新为了第二高速缓存行的起始边界。编译工具链在写入空操作指令结束后,继续写入第一机器指令,即为从第二高速缓存行的起始边界开始,写入第一机器指令。86.例如,空操作指令为2字节的0xffff,第一机器指令为4字节的0x12345678。在确定第一机器指令不满足跨高速缓存行缓存条件时,编译工具链从起始写入地址开始写入0x12345678。在确定第一机器指令满足跨高速缓存行缓存条件时,如目标长度为2字节,则先从起始写入地址开始写入0xffff,之后再写入0x12345678,此时,0x12345678的起始写入地址为一个高速缓存行的起始边界。87.在机器指令写入内存完成之后,编译工具链将机器指令写入到目标文件,进而生成最终的可执行文件。88.本技术实施例提供的指令缓存方法中,在获得编译和汇编原始代码,得到机器指令之后,编译工具链并不会直接将机器指令写入高速缓存行,而是检测该机器指令是否满足跨高速缓存行缓存条件,再满足跨高速缓存行缓存条件时,使用空操作指令写满当前写入指令的高速缓存行,进而所得到的机器指令就可以在下一个高速缓存行的起始边界开始写入,实现了机器指令的边界对齐,网络处理器内部无需再对机器指令进行对齐操作,也就不会导致流水线作业停滞,提高了程序执行的效率。89.另外,本技术实施例提供的指令缓存方法中,编译工具链只在机器指令满足跨高速缓存行缓存条件时,才会插入空操作指令,相对于裁剪掉2字节的机器指令,本技术实施例提供的出现的代码膨胀程度较小,提高了指令高速缓存的命中率,进一步提高了程序执行的效率。90.在一些实施例中,还提供了一种指令缓存方法,如图3所示,包括步骤s31-s35,其中,步骤s31、s34-s35与上述步骤s21-s23相似,此处不再赘述。91.步骤s32,在运行汇编程序的过程中,在检测到汇编程序包含预设运行参数的情况下,将全局变量置为预设值。92.本技术实施例中,预设运行参数为指示进行跨高速缓存行缓存检测的参数。该预设运行参数可以写入汇编程序中。预设运行参数的内容可以根据实际需求进行设定,例如,预设运行参数可以使用“‑madjc1”表示。全局变量用于指示是否对机器指令进行跨高速缓存行检测。全局变量的内容可以根据实际需求进行设定,例如,全局变量可以使用“adjc1”表示。全局变量为预设值,表示对机器指令进行跨高速缓存行检测;全局变量为其他值,则拒绝对机器指令进行跨高速缓存行检测。预设值可以根据实际需求进行设定,例如,预设值可以为1或0。93.一个示例中,汇编程序保存在binutils源码树中。编译工具链可以修改binutils源码树中的文件,在汇编程序中增加预设运行参数。94.本技术实施例中,编译工具链在运行汇编程序,将原始代码转换为第一机器指令的过程中,若运行了包含预设运行参数的汇编程序,则将全局变量置为预设值。95.步骤s33,当全局变量为预设值时,根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令是否满足跨高速缓存行缓存条件。96.在获得第一机器指令后,编译工具链若检测到全局变量为预设值,则说明第一机器指令前面可能会插入空操作指令,暂时不将第一机器指令写入内存,对机器指令进行跨高速缓存行检测,即根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令是否满足跨高速缓存行缓存条件。97.在确定第一机器指令满足跨高速缓存行缓存条件时,执行步骤s34-s35,完成指令缓存。98.本技术实施例提供的技术方案中,编译工具链微调汇编程序,在汇编程序中增加预设运行参数,实现选择性的开启跨高速缓存行检测,提高了跨高速缓存行检测的灵活性。99.在一些实施例中,还提供了一种指令缓存方法,如图4所示,包括步骤s41-s47,其中,步骤s41-s42、s45-s46与上述步骤s31-s32、s34-s35相同,此处不再赘述。100.步骤s43,当全局变量为预设值时,确定第一机器指令的起始写入地址相对于第一高速缓存行的起始边界的目标偏移长度。101.编译工具链确定起始写入地址与第一高速缓存行的起始边界之间的长度,该长度即为起始写入地址相对于第一高速缓存行的起始边界的目标偏移长度。102.在一些实施例中,为提高所确定的起始写入地址的准确性,步骤s43可以为:将第一机器指令的起始写入地址对高速缓存行的长度取余,得到起始写入地址相对于第一高速缓存行的起始边界的目标偏移长度。103.例如,一个高速缓存行的长度为32字节,第一机器指令的起始写入地址为78字节,78对32取余(即78%32)为14字节。因此,编译工具链确定目标偏移长度为14字节。104.本技术实施例中,编译工具链还可以在每次将机器指令写入高速缓存行之后,更新目标偏移长度;再缓存机器指令时,直接获取目标偏移长度,基于该目标偏移长度进行跨高速缓存行检测,并写入内存之后,更新目标偏移长度,如计算目标偏移长度与机器指令的长度的和值,若该和值小于高速缓存行的长度,则将该和值更新为目标偏移长度;若该和值大于或等于高速缓存行的长度,则将该和值与高速缓存行的长度的差值更新为目标偏移长度;后续再缓存机器指令时,直接获取目标偏移长度,如此循环处理。105.例如,首次向内存中写入机器指令时,目标偏移长度为0字节,起始写入地址为0字节,高速缓存行的长度为8字节。编译工具链将4字节的机器指令写入高速缓存行之后,更新目标偏移长度为0+4=4字节;之后,再缓存6字节的其他机器指令时,基于目标偏移长度4字节,进行跨高速缓存行检测,并将6字节的其他机器指令写入内存;之后计算4+6=10》8,更新目标偏移长度为10-8=2字节;后续,再缓存其他机器指令时,基于2字节的目标偏移长度进行跨高速缓存行检测。106.本技术实施例中,编译工具链还可以采用其他方式确定目标偏移长度,对此不进行限定。107.步骤s44,检测目标偏移长度与第一机器指令的长度的和值是否大于高速缓存行的长度。若是,则执行步骤s45。若否,则执行步骤s47。108.编译工具链计算目标偏移长度与第一机器指令的长度的和值,检测该和值是否大于高速缓存行的长度。若是,即目标偏移长度与第一机器指令的长度的和值大于高速缓存行的长度,则编译工具链确定第一机器指令满足跨高速缓存行缓存条件,执行步骤s45-s46,使用空操作指令写满起始写入地址所在的第一高速缓存行,并从第二高速缓存行的起始边界开始,写入第一机器指令。109.若否,即目标偏移长度与第一机器指令的长度的和值小于或等于高速缓存行的长度,则编译工具链确定第一机器指令不满足跨高速缓存行缓存条件,无需插入空操作指令,执行步骤s47,从起始写入地址开始,向第一高速缓存行写入第一机器指令。110.步骤s47,从起始写入地址开始,向第一高速缓存行写入第一机器指令。111.本技术实施例提供的技术方案中,编译工具链基于目标偏移量和第一机器指令的长度,可以准确快速的确定第一机器指令是否跨高速缓存行,进而实现机器指令的边界对齐,提高了程序执行的效率。112.在一些实施例中,机器指令以结构体(如frag)的形式存储在内存中,即将机器指令写入高速缓存行即为将机器指令写入结构体,如第一机器指令对应第一结构体,将第一机器指令写入第一高速缓存行即为将第一机器指令写入第一结构体。第一结构体的起始写入地址即为第一机器指令的起始写入地址。113.当全局变量为预设值时,说明需要对机器指令进行跨高速缓存行检测,编译工具链将第一结构体添加预设标识。预设标识指示结构体的长度是不确定的。预设标识的内容可以根据实际需求进行设定。例如,预设标识可以采用rs_machine_dependent表示。114.当第一结构体带有预设标识,且第一机器指令满足跨高速缓存行缓存条件时,编译工具链更新第一结构体的长度为目标长度和第一机器指令的长度的和值,目标长度为起始写入地址至第一高速缓存行的末尾边界的长度。115.这种情况下,编译工具链使用空操作指令写满起始写入地址所在的第一高速缓存行的步骤,可以为:基于第一结构体的长度,从第一结构体的起始写入地址开始,向第一结构体写入目标长度的空操作指令。在向第一结构体写入目标长度的空操作指令之后,第一高速缓存行被写满。116.相应的,编译工具链从第二高速缓存行的起始边界开始,写入第一机器指令的步骤,可以为:基于第一结构体的长度,从第一结构体中空操作指令的末尾地址开始,向第一结构体写入第一机器指令。117.在向第一结构体写入目标长度的空操作指令之后,第一高速缓存行被写满。这种情况下,编译工具链继续向第一结构体写入第一机器指令,该第一机器指令的起始写入地址即为第二高速缓存行的起始边界。118.可见,本技术实施例提供的技术方案中,编译工具链利用预设标识标记相应的结构体,以此来控制汇编过程的执行,提高了汇编的准确性,进而提高了机器指令的边界对齐的准确性,提高了程序执行的效率。119.本技术实施例中,对于无法插入空操作指令的机器指令,如延时分支槽这类指令,编译工具链可以采用其他的形式来控制汇编过程的执行,如插入一个仅包括空操作指令且长度为目标长度的结构体等,只要实现机器指令的边界对齐即可,对此不进行具体限定。120.本技术实施例中,编译工具链能够自动检测机器指令的跨高速缓存行的情况,并通过插入合适长度的空操作指令,使得跨高速缓存行的机器指令对齐到下一个高速缓存行。从而在不会大量增加程序体积的情况下使机器指令对齐到特定的边界,减少了网络处理器内部因对齐指令而导致的流水线停滞情况,从而提升了整个程序的执行效率。发明人通过实测发现:使用本技术实施例提供的技术方案修改编译工具链,完成指令缓存,网络处理器的数据包转发性能提高了3%~5%。121.与上述指令缓存方法对应,本技术实施例提供了一种编译工具链,如图5所示,该编译工具链包括:122.编译器51,用于运行编译程序,以编译原始代码,得到汇编代码;123.汇编器52,用于运行汇编程序,以汇编上述汇编代码,得到第一机器指令;若根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令满足跨高速缓存行缓存条件,则使用空操作指令写满起始写入地址所在的第一高速缓存行;从第二高速缓存行的起始边界开始,写入第一机器指令,第二高速缓存行为第一高速缓存行的下一个高速缓存行。124.在一些实施例中,汇编器52,还可以用于:125.在运行汇编程序的过程中,在检测到汇编程序包含预设运行参数的情况下,将全局变量置为预设值;126.当全局变量为预设值时,根据第一机器指令的起始写入地址以及第一机器指令的长度,确定第一机器指令是否满足跨高速缓存行缓存条件。127.在一些实施例中,汇编器52,具体可以用于:128.确定第一机器指令的起始写入地址相对于第一高速缓存行的起始边界的目标偏移长度;129.检测目标偏移长度与第一机器指令的长度的和值是否大于高速缓存行的长度;130.若大于高速缓存行的长度,则确定第一机器指令满足跨高速缓存行缓存条件;131.若小于或等于高速缓存行的长度,则确定第一机器指令不满足跨高速缓存行缓存条件。132.在一些实施例中,汇编器52,具体可以用于:133.将第一机器指令的起始写入地址对高速缓存行的长度取余,得到起始写入地址相对于第一高速缓存行的起始边界的目标偏移长度。134.在一些实施例中,第一机器指令对应第一结构体,第一结构体的起始写入地址为第一机器指令的起始写入地址;135.汇编器52,还可以用于:当全局变量为预设值时,将第一结构体添加预设标识;当第一结构体带有预设标识,且第一机器指令满足跨高速缓存行缓存条件时,更新第一结构体的长度为目标长度和第一机器指令的长度的和值,目标长度为起始写入地址至第一高速缓存行的末尾边界的长度;136.汇编器52,具体可以用于基于第一结构体的长度,从起始写入地址开始,向第一结构体写入目标长度的空操作指令;基于第一结构体的长度,从第一结构体中空操作指令的末尾地址开始,向第一结构体写入第一机器指令。137.在一些实施例中,原始代码的机器描述文件包括多条机器指令的扩展长度,每条机器指令的扩展长度为该机器指令的原始长度与预设长度的和值;多条机器指令中包括第一跳转指令,则编译器51,还可以用于:138.在运行编译程序的过程,利用每条机器指令的扩展长度,预估第一跳转指令对应的跳转目的地址;若跳转目的地址超过第一跳转指令的跳转范围,则将第一跳转指令替换为第二跳转指令,跳转目的地址在第二跳转指令的跳转范围内;139.这种情况下,编译器51,具体可以用于运行编译程序以编译第二跳转指令对应的原始代码,得到第二跳转指令对应的汇编代码;140.汇编器52,具体可以用于运行汇编程序,以汇编第二跳转指令对应的汇编代码,得到第二跳转指令对应的第一机器指令。141.本技术实施例提供的技术方案中,在获得编译和汇编原始代码,得到机器指令之后,并不会直接将机器指令写入高速缓存行,而是检测该机器指令是否满足跨高速缓存行缓存条件,再满足跨高速缓存行缓存条件时,使用空操作指令写满当前写入指令的高速缓存行,进而所得到的机器指令就可以在下一个高速缓存行的起始边界开始写入,实现了机器指令的边界对齐,网络处理器内部无需再对机器指令进行对齐操作,也就不会导致流水线作业停滞,提高了程序执行的效率。142.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solid state disk(ssd))等。143.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。144.本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于编译工具链实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。145.以上所述仅为本技术的较佳实施例,并非用于限定本技术的保护范围。凡在本技术的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本技术的保护范围内。









图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!




内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,发布内容不收取任何费用也不接任何广告!




免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

相关内容 查看全部