本技术涉及计算机,尤其涉及一种修复弱内存序问题的方法及装置。
背景技术:
1、当基于非弱内存模型开发的多线程程序,在采用弱内存模型(weak memorymodel)的计算机设备中运行时,由于不同内存模型下硬件所支持的指令语义不同,因此可能会导致该程序中并行运行的线程在执行用于访存的读写指令时乱序,从而出现弱内存序的问题。
2、例如,基于强内存模型(strong memory model)开发的多线程程序,在采用弱内存模型的计算机设备中运行时,该程序中并行运行的线程执行用于访存的读写指令时,即可能出现弱内存序的问题。这样的话,该程序所要实现的功能可能会出现逻辑上的错误,从而导致该程序运行后输出的结果不准确。
3、基于此,如何修复多线程程序弱内存序的问题,是亟待解决的技术问题。
技术实现思路
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、本技术的这些方面或其他方面在以下的描述中会更加简明易懂。