CN115705194A - 一种硬件内存序架构下的代码处理方法及相应装置 - Google Patents
一种硬件内存序架构下的代码处理方法及相应装置 Download PDFInfo
- Publication number
- CN115705194A CN115705194A CN202110930181.8A CN202110930181A CN115705194A CN 115705194 A CN115705194 A CN 115705194A CN 202110930181 A CN202110930181 A CN 202110930181A CN 115705194 A CN115705194 A CN 115705194A
- Authority
- CN
- China
- Prior art keywords
- architecture
- code
- file
- source
- memory
- 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
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 23
- 238000000034 method Methods 0.000 claims abstract description 110
- 238000012545 processing Methods 0.000 claims description 75
- 230000006870 function Effects 0.000 claims description 41
- 230000004888 barrier function Effects 0.000 claims description 27
- 238000004590 computer program Methods 0.000 claims description 10
- 230000008569 process Effects 0.000 abstract description 78
- 230000005012 migration Effects 0.000 abstract description 19
- 238000013508 migration Methods 0.000 abstract description 19
- 230000006399 behavior Effects 0.000 abstract description 15
- 238000010586 diagram Methods 0.000 description 21
- 238000013519 translation Methods 0.000 description 15
- 230000008439 repair process Effects 0.000 description 12
- 238000005457 optimization Methods 0.000 description 11
- 230000009466 transformation Effects 0.000 description 11
- 238000006243 chemical reaction Methods 0.000 description 10
- 238000004891 communication Methods 0.000 description 8
- 230000008707 rearrangement Effects 0.000 description 6
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000013461 design Methods 0.000 description 3
- 238000007781 pre-processing Methods 0.000 description 3
- 230000001131 transforming effect Effects 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- FESBVLZDDCQLFY-UHFFFAOYSA-N sete Chemical compound [Te]=[Se] FESBVLZDDCQLFY-UHFFFAOYSA-N 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000000712 assembly Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 230000003190 augmentative effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000001427 coherent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000000758 substrate Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
- XLYOFNOQVPJJNP-UHFFFAOYSA-N water Substances O XLYOFNOQVPJJNP-UHFFFAOYSA-N 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4443—Inlining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种硬件内存序架构下的代码处理方法,应用于计算机系统,尤其适用于在不同的硬件内存序架构下迁移代码的场景。该方法包括获取编译流程中的第一文件,第一文件与源文件关联;将第一文件的目标代码中的volatile内存访问代码转换为atomic内存访问代码,以得到第二文件,目标代码为与并发控制相关的内存访问代码;对第二文件进行编译处理,以得到适用于目标架构的执行文件,目标架构为强内存序架构或弱内存序架构。本申请提供的方案可以使代码迁移后的执行代码与编写代码保持一致,从而减少了代码运行时出现挂死或死锁等非预期行为。
Description
技术领域
本申请涉及计算机技术领域,具体涉及一种硬件内存序架构下的代码处理方法及相应装置。
背景技术
处理器在调用线程操作内存时,在一些内存序架构下,实际执行的代码顺序与代码编写顺序一致,不会出现对内存的访问顺序进行重排的情况。而在一些内存序架构下,如一些弱内存序架构(如:高级精简指令集机器架构(advanced RISC machine,ARM)、基于精简指令集的第五代指令架构(reduced instruction set computing five,RISC-V)、基于精简指令集的性能优化增强架构(performance optimization with enhanced RISC,POWER))下,处理器通常会根据执行的情况对内存的访问顺序进行重排,重排可能会导致处理器实际执行的代码顺序与代码的编写顺序不一致,出现非预期行为。
在代码迁移的场景中,将在一种内存序架构下正常运行的代码迁移到另外一种内存序架构下,由于处理器对内存的访问重排,导致迁移后的代码在新的内存序架构下运行大概率会出现问题,产生非预期行为,尤其是与并发控制相关的代码,在代码迁移后,出错的概率会更大。
发明内容
本申请提供一种硬件内存序架构下的代码处理方法,用于减少代码在硬件内存序架构下运行的非预期行为。本申请实施例还提供了相应设备、计算机可读存储介质及计算机程序产品等。
本申请第一方面提供一种硬件内存序架构下的代码处理方法,应用于计算机系统,包括:获取编译流程中的第一文件,第一文件与源文件关联;将第一文件的目标代码中的volatile内存访问代码转换为atomic内存访问代码,以得到第二文件,目标代码为与并发控制相关的内存访问代码;对第二文件进行编译处理,以得到适用于目标架构的执行文件,目标架构为强内存序架构或弱内存序架构。
本申请中,该代码处理方法应用于计算机设备,该计算机设备可以是服务器、终端设备或虚拟机(virtual machine,VM)。
本申请中,硬件内存序架构通常包括强内存序架构和弱内存序架构,弱内存序架构是相对于强内存序架构来说的,弱内存序架构和强内存序架构都是指令集架构,强内存序架构可以包括x86架构,弱内存序架构可以包括高级精简指令集机器架构(advancedRISC machine,ARM)架构、基于精简指令集的第五代指令架构(reduced instruction setcomputing five,RISC-V)或基于精简指令集的性能优化增强架构(performanceoptimization with enhanced RISC,POWER)。
本申请所提供的代码处理方法可以适用于代码迁移的场景,代码迁移的场景包括两种,一种是源文件从源架构迁移到目标架构后,由目标架构执行本申请的代码处理过程得到适用于目标架构的执行文件;另一种是由源架构对源文件执行本申请的代码处理过程得到适用于目标架构的执行文件,然后将执行文件发送给目标架构。
本申请所提供的代码处理方法还可以使用于代码修复的场景,即源文件包括的源代码可能存在错误,由运行该源文件的架构执行本申请的代码处理过程进行修复的场景。
本申请中,源架构可以为强内存序架构或弱内存序架构,目标架构可以为强内存序架构或弱内存序架构。如:源架构为强内存序架构(X86),目标架构为弱内存序架构(ARM);或者,源架构为弱内存序架构(ARM),目标架构为强内存序架构(X86);或者,源架构为强内存序架构(X86),目标架构为强内存序架构(可扩充处理器架构第九版(ScalableProcessor ARChitecture version9,SPARC V9));或者,源架构为弱内存序架构(ARM),目标架构为弱内存序架构(RISC-V)。
本申请中,该代码处理的方法可以在编译流程中执行,由处理器运行编译器的代码来完成相应的代码处理过程。
本申请中,第一文件可以是源文件,也可以是编译流程中的中间表示(intermediate representation,IR)。
本申请中,中间表示指编译器对于源程序进行扫描后生成的内部表示,代表源程序的语义结构,编译器中端的各个阶段都在IR上进行分析或优化变换,因而IR对编译器的整体结构、效率和健壮性都有着极大的影响。
本申请中,源文件可以为C/C++源文件。
本申请中,与并发控制相关的内存访问代码可以理解为是除驱动(driver)之外的代码。
本申请中,Volatile是C/C++中的一种关键字,该关键字的作用是阻止编译器优化,在处理器运行代码时,volatile memory access的顺序不改变,但其他的memoryaccess的顺序可能改变,无法使代码执行顺序与代码编写顺序保持一致。
本申请中,atomic是C/C++版本(C11/C++11)中atomic关键字,声明变量时加上atomic关键字,可以实现对整型(int)、字符型(char)、布尔型(bool)等数据结构的原子性封装。访问被声明为atomic的变量只能通过原子操作进行。在不加内存访问顺序限定关系(如:获得acquire,释放release)的默认情况下,atomic memory access表示顺序一致性的原子性内存访问。
由上述第一方面可知,在编译流程中可以将并发控制相关的内存访问代码中的volatile内存访问代码转换为atomic内存访问代码,因为atomic内存访问可以使处理器执行程序时的执行代码与编写代码保持一致,从而减少了代码运行时出现挂死或死锁等非预期行为。
在第一方面的一种可能的实现方式中,该方法还包括:删除目标代码中单独的内存屏障,单独的内存屏障为目标代码中单独的一条内嵌汇编指令,且单独的一条内嵌汇编指令是内存屏障指令。
该种可能的实现方式中,删除单独的内存屏障,可以进一步提升代码性能。
在第一方面的一种可能的实现方式中,第一文件为包含源代码的源文件,源文件包括适用于源架构的内嵌汇编代码,该方法还包括:将适用于源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,所述源架构和所述目标架构为两个不同的硬件内存序架构。
该种可能的实现方式中,编译器内建函数(compiler builtins)是可以适用于多种硬件架构的函数。在代码迁移场景中,适用于源架构的内嵌汇编代码通常不适用于目标架构,通过将适用于源架构的内嵌汇编代码自动转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,可以提高代码转换效率,从而提高代码处理速度。
在第一方面的一种可能的实现方式中,第一文件为第一中间表示,第二文件为第二中间表示,上述步骤:获取编译流程中的第一文件,包括:获取与源架构对应的源文件,源文件中包括适用于源架构的内嵌汇编代码;将适用于源架构的内嵌汇编代码转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件,源架构和目标架构为两个不同的硬件内存序架构;将中间文件转换为第一中间表示。
该种可能的实现方式中,编译器内建函数(compiler builtins)是可以适用于多种硬件架构的函数。在代码迁移场景中,适用于源架构的内嵌汇编代码通常不适用于目标架构,通过将适用于源架构的内嵌汇编代码自动转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,可以提高代码转换效率,从而提高代码处理速度。
在第一方面的一种可能的实现方式中,上述步骤:将适用于源架构的内嵌汇编代码转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件,包括:将适用于源架构的内嵌汇编代码转换为抽象语法树(abstract syntax tree,AST);按照抽象语法树中每个分支的语义,将每个分支转换为适用于目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件。
该种可能的实现方式中,AST是源代码语法结构的一种抽象表示。它以树状形式表现编程语言的语法结构,树上每个节点都表示源代码中的一种结构。源程序和抽象语法树一一对应。通过AST进行语义等价翻译,可以实现内嵌汇编代码的快速转换。
在第一方面的一种可能的实现方式中,所述源文件中的代码规模无限制,可以有很多行,如超过一万行,也可以有几十行,几百行。
本申请第二方面提供一种硬件内存序架构下的代码处理装置,该硬件内存序架构下的代码处理装置具有实现上述第一方面或第一方面任意一种可能实现方式的方法的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块,例如:获取单元、第一处理单元和第二处理单元,这三个单元可以通过一个处理单元或多个处理单元来实现。
本申请第三方面提供一种计算机设备,该计算机设备包括至少一个处理器、存储器、输入/输出(input/output,I/O)接口以及存储在存储器中并可在处理器上运行的计算机执行指令,当计算机执行指令被处理器执行时,处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第四方面提供一种存储一个或多个计算机执行指令的计算机可读存储介质,当计算机执行指令被处理器执行时,一个或多个处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第五方面提供一种存储一个或多个计算机执行指令的计算机程序产品,当计算机执行指令被一个或多个处理器执行时,一个或多个处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第六方面提供了一种芯片系统,该芯片系统包括至少一个处理器,至少一个处理器用于支持资源管理的装置实现上述第一方面或第一方面任意一种可能的实现方式中所涉及的功能。在一种可能的设计中,芯片系统还可以包括存储器,存储器,用于保存资源管理的装置必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。
附图说明
图1是本申请实施例提供的计算机系统的一结构示意图;
图2是本申请实施例提供的代码迁移场景的一示意图;
图3是本申请实施例提供的代码顺序与执行顺序的一示例示意图;
图4是本申请实施例提供的代码顺序与执行顺序的另一示例示意图;
图5是本申请实施例提供的代码迁移场景的另一示意图;
图6是本申请实施例提供的代码修复场景的一示意图;
图7是本申请实施例提供编译器的一结构示意图;
图8是本申请实施例提供编译器的另一结构示意图;
图9是本申请实施例提供的硬件内存序架构下代码处理方法的一实施例示意图;
图10是本申请实施例提供的硬件内存序架构下代码处理方法的另一实施例示意图;
图11A是本申请实施例提供的一示例示意图;
图11B是本申请实施例提供的另一示例示意图;
图12A是本申请实施例提供的另一示例示意图;
图12B是本申请实施例提供的另一示例示意图;
图13是本申请实施例提供的硬件内存序架构下代码处理方法的另一实施例示意图;
图14A是本申请实施例提供的另一示例示意图;
图14B是本申请实施例提供的另一示例示意图;
图15是本申请实施例提供的一效果对比图;
图16是本申请实施例提供的硬件内存序架构下的代码处理装置的一结构示意图;
图17是本申请实施例提供的计算机设备的一结构示意图。
具体实施方式
下面结合附图,对本申请的实施例进行描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。本领域普通技术人员可知,随着技术发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请实施例提供一种硬件内存序架构下的代码处理方法,用于减少代码在硬件内存序架构下运行的非预期行为。本申请实施例还提供了相应设备、计算机可读存储介质及计算机程序产品等。以下分别进行详细说明。
硬件内存序架构通常包括强内存序架构和弱内存序架构,弱内存序架构是相对于强内存序架构来说的,弱内存序架构和强内存序架构都是指令集架构,强内存序架构可以包括x86架构,弱内存序架构可以包括高级精简指令集机器架构(advanced RISC machine,ARM)架构、基于精简指令集的第五代指令架构(reduced instruction set computingfive,RISC-V)或基于精简指令集的性能优化增强架构(performance optimization withenhanced RISC,POWER)。
计算机系统中的处理器在运行代码时,为了确保最大限度地将流水线充分利用,会根据执行的情况对内存的访问顺序进行重排。如下表1所示,在不同硬件内存序架构下,可以包括不同的重排类型。
表1弱内存序硬件平台指令执行重排序类型
从处理器的角度来看,无数据依赖的内存重排是没有任何问题的,而且适当的重排,对整体执行的效率会有极大的提升。但因为硬件内存序架构通常包括强内存序架构和弱内存序架构,强内存序架构的代码可能会迁移到弱内存序架构下运行,弱内存序架构下也可能会迁移到强内存序架构下运行,重排会导致原本在源架构下能正常运行的代码,迁移到目标架构下会出现挂死或死锁等非预期行为。另外,也有一些代码由于在编程时程序员没有正确处理内存序关系,导致在自身所在架构下代码运行时行为和程序员期望行为不一致。
本申请实施例中,源架构可以为强内存序架构或弱内存序架构,目标架构可以为强内存序架构或弱内存序架构。
为了解决由于内存存序造成的代码在从源架构迁移到目标架构下运行会产生非预期行为的问题,以及本架构可能存在错误代码造成运行产生非预期行为的问题,本申请实施例提供了一种硬件内存序架构下的代码处理方法,该方法应用于计算机系统,该计算系统可以为服务器、终端设备、虚拟机(virtual machine,VM)或容器(container)。
服务器可以是任意形态的物理机。
终端设备(也可以称为用户设备(user equipment,UE))是一种具有无线收发功能的设备,可以部署在陆地上,包括室内或室外、手持或车载;也可以部署在水面上(如轮船等);还可以部署在空中(例如飞机、气球和卫星上等)。终端设备可以个人电脑(personalcomputer,PC)、手机(mobile phone)、平板电脑(pad)、带无线收发功能的电脑、虚拟现实(virtual reality,VR)终端、增强现实(augmented reality,AR)终端、工业控制(industrial control)中的无线终端、无人驾驶(self driving)中的无线终端、远程医疗(remote medical)中的无线终端、智能电网(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市(smart city)中的无线终端、智慧家庭(smart home)中的无线终端、以物联网(internet of things,IoT)中的无线终端等。
虚拟机可以位于云端,也可以位于本地。
本申请实施例提供的计算机系统的架构可以参阅图1进行理解。
图1是本申请实施例提供的计算机系统的一架构示意图。
如图1所示,该计算机系统10的架构可以包括应用层101、内核层102和硬件层103。
应用层101包括操作界面,程序检测的工作人员可以通过该操作界面启动源代码的处理过程。
内核层102包括编译器,该编译器用于编译源文件,如:要从源架构迁移到目标架构的源文件,或者,已经从源架构迁移到计算机系统的源文件,或者,编译计算机系统上存在错误的源文件,本申请实施例中,该源文件为C/C++源文件。
设备层103包括通信接口1031、处理器1032、内存1033和总线1034等。通信接口1031、处理器1032和内存1033通过总线1034连接。其中,处理器1032可以包括任何类型的通用计算电路或专用逻辑电路,例如:现场可编程门阵列(field-programmable gate array,FPGA)或专用集成电路(application specific integrated circuit,ASIC)。也可以是耦合到一个或多个半导体基板的一个或多个处理器,例如中央处理器(central processingunit,CPU)。
计算机系统运行时,可以通过处理器执行本申请实施例提供的用于处理代码的执行流程,通过处理器运行编译器执行本申请实施例中的相应步骤。
由以上描述可知,本申请实施例提供的代码处理方法可以适用于代码迁移的场景,还可以使用于代码修复的场景。其中,代码迁移的场景包括两种,一种是源文件从源架构迁移到目标架构后,由目标架构执行本申请的代码处理过程得到适用于目标架构的执行文件;另一种是由源架构对源文件执行本申请的代码处理过程得到适用于目标架构的执行文件,然后将执行文件发送给目标架构。代码修复的场景即源文件包括的源代码可能存在错误,由运行该源文件的架构(本申请实施例中,将该架构称为目标架构,实际上,该架构可以是任意一个硬件内存序架构)执行代码处理过程进行修复的场景。下面分别进行介绍。
一、源文件从源架构迁移到目标架构后,由目标架构执行本申请的代码处理过程得到适用于目标架构的执行文件的场景。
如图2所示,源架构下可以正常运行的源文件迁移到目标架构,由安装有目标架构的计算机系统生成执行文件。
若该源文件直接在目标架构下运行可以会因为重排导致处理器对内存实际执行的代码顺序与代码的编写顺序存在不一致。为了使源架构的代码在迁移到目标架构后,也可以保持和源架构上相同的运行行为。申请实施例会由目标架构对源文件中的内嵌汇编代码进行翻译,将该源文件中的内嵌汇编代码翻译成能适用于目标架构的内嵌汇编代码或编译器内建函数(compiler builtins),还会对编译器编译流程中的源文件或中间表示进行处理,如:将源文件或中间表示中的volatile内存访问(volatile memory access)代码转换为atomic内存访问(atomic memory access)代码,删除并发控制相关的内存访问代码中单独的内存屏障,单独的内存屏障为并发控制相关的内存访问代码中单独的一条内嵌汇编指令,且单独的一条内嵌汇编指令是内存屏障指令。
上述内嵌汇编代码翻译的过程可以是人工完成,也可以是计算机系统自动完成。编译器内建函数可以适用于多种硬件内存序架构。
Volatile是C/C++中的一种关键字,该关键字的作用是阻止编译器优化,在编译器优化时,如图3所示,在处理器运行代码时,volatile memory access的顺序不改变,但其他的memory access的顺序可能改变,所以,通过volatile memory access是不能保证执行代码与编写代码的顺序保持一致的。
Atomic是C语言版本(C11)中atomic关键字,声明变量时加上atomic关键字,可以实现对整型(int)、字符型(char)、布尔型(bool)等数据结构的原子性封装。访问被声明为atomic的变量只能通过原子操作进行。atomic memory access可以保证顺序一致性。
因为memory access包括读(load)和写(store)两种指令,所以顺序一致性的atomic memory access(sequential consistent(sc)atomic memory access)满足如下保序关系:
1.对于sc atomic load,类似acquire load,即不允许该条指令后面的(编程顺序意义上的后面)访存指令在编译优化阶段或处理器执行阶段移动到该条指令之前。
2.对于sc atomic store,类似release store,即不允许该条指令前面的(编程顺序意义上的前面)访存指令在编译优化阶段或处理器执行阶段移动到该条指令之后。
3.对于sc atomic store后面有sc atomic load(编程顺序),并且中间没有其他sc atomic memory access指令,在编译优化阶段或处理器执行阶段禁止交换这两条指令的顺序。
如图4所示,在处理器运行代码时,Atomic memory access的顺序不改变,在满足上述三种保序关系的情况下还可以使得memory access的执行顺序也不改变,这样处理器运行代码时的执行顺序与代码编写顺序保持一致,保证了顺序一致性。
二、由源架构对源文件执行本申请的代码处理过程得到适用于目标架构的执行文件,然后将执行文件发送给目标架构的场景。
如图5所示,为了使源架构的代码在迁移到目标架构后,也可以保持和源架构上相同的运行行为。申请实施例会由源架构对源文件中的内嵌汇编代码进行翻译,将该源文件中的内嵌汇编代码翻译成能适用于目标架构的内嵌汇编代码或编译器内建函数,还会对编译器编译流程中的源文件或中间表示进行处理,如:将源文件或中间表示中的volatile内存访问(volatile memory access)代码转换为atomic内存访问(atomic memory access)代码,删除并发控制相关的内存访问代码中单独的内存屏障,单独的内存屏障为并发控制相关的内存访问代码中单独的一条内嵌汇编指令,且单独的一条内嵌汇编指令是内存屏障指令。该场景中由源架构执行代码处理的过程得到执行文件,然后将执行文件发送到目标架构,目标架构运行执行文件。
该场景与上述由目标架构执行代码处理的场景只是执行主体不同,其他思想都可以参阅上述有目标架构执行代码处理的场景进行理解。
三、代码原本就在目标架构上,但该代码存在错误,需要进行修复的场景。
如图6所示,目标架构下的源文件中的代码存在错误,该源文件称为待修复的源文件,为了使该待修复的源文件在运行时可以保持顺序一致性,本申请实施例会对编译器编译流程中的源文件或中间表示进行处理,如:将中间表示中的volatile内存访问代码转换为atomic内存访问代码。
本申请实施例中,无论是代码迁移的场景还是代码修复的场景,都由计算机系统中的编译器来完成,结合上述两种场景,本申请实施例提供的编译器可以是:不做内嵌汇编代码自动转换的编译器,或者,做内嵌汇编代码自动转换的编译器。关于编译器是否做汇编代码自动转换也可以是在编译器中设置一个开关,通过该开关来确定该编译器是否执行内嵌汇编代码的自动转换,如:关闭该开关,则该编译器不做内嵌汇编代码自动转换,打开该开关,则该编译器做内嵌汇编代码自动转换。
下面结合编译器中各模块的功能来介绍本申请实施例中的代码处理过程。
一、不做内嵌汇编代码自动转换的编译器。
如图7所示,该编译器包括源文件处理模块、中间表示生成模块、中间表示变换模块和编译器后端模块。
其中,源文件处理模块用于获取源文件,将源文件做宏展开处理,以得到第一中间文件,该源文件为C/C++源文件,该源文件可以是代码迁移场景中源架构的源文件,也可以是代码修复场景中待修复的源文件。
该场景中,源文件中的内嵌汇编代码可以通过人工翻译得到的适用于目标架构的内嵌汇编代码或者编译器内建函数。
在代码修复的场景中,因为源文件中的内嵌汇编代码或编译器内建函数已经适用于该目标架构,则不需要处理其中的内嵌汇编代码或编译器内建函数。
中间表示生成模块用于将第一中间文件转换为第一中间表示(intermediaterepresentation,IR)。
IR指编译器对于源程序进行扫描后生成的内部表示,代表源程序的语义和语法结构,编译器的各个阶段都在IR上进行分析或优化变换,因而它对编译器的整体结构、效率和健壮性都有着极大的影响。
中间表示变换模块用于将第一中间表示转换为第二中间表示。
编译器后端模块用于将第二中间表示处理为适用于目标架构的执行文件。
该场景中,可以由源文件处理模块将源文件中的volatile内存访问代码转换为atomic内存访问代码。也可以是由中间表示变换模块将第一中间表示中的volatile内存访问代码转换为atomic内存访问代码。
二、做内嵌汇编代码自动转换的编译器。
如图8,该编译器包括源文件处理模块、中间表示生成模块、中间表示变换模块和编译器后端模块。该源文件处理模块中包括内嵌汇编翻译模块。
其中,源文件处理模块用于获取源文件,将源文件做宏展开处理,以得到第一中间文件,该源文件为C/C++源文件,该源文件中包括适用于源架构的内嵌汇编代码,该源文件可以是代码迁移场景中源架构的源文件,也可以是代码修复场景中待修复的源文件。
内嵌汇编翻译模块用于将第一中间文件中的内嵌汇编代码翻译为适用于目标架构的内嵌汇编代码或者编译器内建函数,以得到第二中间文件。
中间表示生成模块用于将第二中间文件转换为第一中间表示。
中间表示变换模块用于将第一中间表示转换为第二中间表示。
编译器后端模块用于将第二中间表示处理为适用于目标架构的执行文件。
该场景中,可以由源文件处理模块将源文件中的volatile内存访问代码转换为atomic内存访问代码。也可以是由中间表示变换模块将第一中间表示中的volatile内存访问代码转换为atomic内存访问代码。
基于上述计算机系统,如图9所示,本申请实施例提供的硬件内存序架构下的代码处理方法的一实施例包括:
201.获取编译流程中的第一文件,第一文件与源文件关联。
本申请中,第一文件可以是源文件,也可以是编译流程中的中间表示(intermediate representation,IR)。
202.将第一文件的目标代码中的volatile内存访问代码转换为atomic内存访问代码,以得到第二文件,目标代码为与并发控制相关的内存访问代码。
与并发控制相关的内存访问代码可以理解为是除驱动(driver)之外的代码。
203.对第二文件进行编译处理,以得到适用于目标架构的执行文件,目标架构为强内存序架构或弱内存序架构。
对第二文件进行编译处理的过程可以包括根据atomic插入内存屏障(fence),二进制代码生成,以及二进制代码链接等流程。
本申请实施例中,在编译流程中可以将并发控制相关的内存访问代码中的volatile内存访问代码转换为atomic内存访问代码,因为atomic内存访问可以使处理器执行程序时的执行代码与编写代码保持一致,从而减少了代码运行时出现挂死或死锁等非预期行为。
可选地,在上述步骤202之前或之后,还可以删除目标代码中单独的内存屏障,单独的内存屏障为目标代码中单独的一条内嵌汇编指令,且单独的一条内嵌汇编指令是内存屏障指令。这样有利于进一步优化代码。
以上介绍了代码迁移场景和代码修复场景都会涉及到的内容,不同的是,在代码迁移场景会涉及到内嵌汇编代码的转换,代码修复场景不需要做内嵌汇编代码的转换。另外,本申请实施例中,可以在中间表示中做从volatile内存访问代码转换为atomic内存访问代码的转换,也可以在源文件中做从volatile内存访问代码转换为atomic内存访问代码的转换。下面分别进行介绍。
一、在中间表示中做从volatile内存访问代码转换为atomic内存访问代码的转换。
如图10所示,在代码迁移场景中,该代码处理的过程可以包括:源文件处理过程、中间表示生成过程、中间表示变换过程、汇编代码生成过程、目标代码生成过程和链接过程。
在源文件处理过程中编译器从源架构获取源文件,该源文件在该场景示例中为foo.c格式的源文件。该源文件中包括内嵌汇编代码。
该源文件处理过程包括预处理过程和内嵌汇编翻译过程。其中,源文件处理过程会将源文件做宏展开处理,得到第一中间文件,该第一中间文件的格式为foo.i格式。
内嵌汇编翻译过程会对第一中间文件中的内嵌汇编代码进行翻译。该翻译过程可以包括:将适用于源架构的内嵌汇编代码转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,以得到第二中间文件,该第二中间文件的格式为foo.i格式。具体的翻译过程可以是:将适用于源架构的内嵌汇编代码转换为抽象语法树(abstract syntax tree,AST);按照抽象语法树中每个分支的语义,将每个分支转换为适用于目标架构的内嵌汇编代码或编译器内建函数,以得到第二中间文件。其中,每个分支可以理解为是输入分支和输出分支等。
AST是源代码语法结构的一种抽象表示。它以树状形式表现编程语言的语法结构,树上每个节点都表示源代码中的一种结构。源程序和抽象语法树一一对应。
该内嵌汇编代码的翻译过程还可以参阅图11A和图11B进行理解。如图11A所示的是适用于源架构(X86)的内嵌汇编代码的示例,该示例中,内嵌汇编代码30包括如下内容:
Asm volatile(
MPLOCKED
“cmpxchgq%[src],%[dst];”
“sete%(res);”
:[res]“=a”(res),/*output*/
[dst]“=m”(*dst)
:[src]“=r”(src),/*input*/
“a”(exp),
“m”(*dst)
:“memory”);/*no-clobber list*/
通过对图11A所示的AST进行静态扫描,可以识别出内嵌汇编的特定代码模式:MPLOCKED;cmpxchgq;sete。该特定代码模式对应于compiler builtins:__atomic_compare_exchange。通过分析AST上内嵌汇编代码的输入参数(:[src]“=r”(src))和输出参数(:[res]“=a”(res),[dst]“=m”(*dst)),得到编译器内建函数的输入(&src,0)和输出(dst,&exp),按照两种架构的语义关系,上述图11A所示的示例可以转换为如图11B所示的示例。图11A中的内嵌汇编代码30会转换为图11B中的编译器内建函数40,即如下的代码内容:
Res=__atomic_compare_exchange(dst,&exp,&src,0,_ATOMIC_SEQ_CST,_ATOMIC_SEQ_CST)。
完成上述预处理过程,得到第二中间文件,会通过中间表示生成(LLVM IRGeneration)过程将第二中间文件转换为第一中间表示。第一中间表示的格式可以是foo.bc格式。
进一步的,可以通过中间表示变换过程将第一中间表示转换为第二中间表示,第二表示的格式可以是foo.bc格式。
从第一中间表示到第二中间表示的转换过程可以包括:将第一中间表示的目标代码中的volatile内存访问代码转换为atomic内存访问代码,以及删除目标代码中单独的内存屏障。该过程可以参阅图12A和图12B进行理解。
图12A所示的是以LLVM IR为例的一个第一中间表示的一个示例。
本申请实施例中,第一中间表示中包含了两处与volatile相关的代码,分别出现在图12A的50A所标记的部分,具体的代码内容如下:
Store volatile 132 0,132*l,align 4,!tbaa!2
Tail call void asm sideeffect“mfence”,“-[memory],-[dirflag],-[fpsr],-[flags]”()#2
其中,“mfence”,“-[memory],-[dirflag],-[fpsr],-[flags]”()#2为单独的内存屏障,在图12A中用50B标记。
本申请实施例中,在中间表示变换过程中,会将与volatile相关的代码转换为atomic相关的代码,并删除其中单独的内存屏障,从而得到如图12B中60所标记的代码:Store atomic 132 0,132*l,align 4,!tbaa!2。
通过中间表示变换过程得到第二中间表示后,可以通过汇编代码生成过程,将第二中间表示转换为汇编文件,该汇编文件的格式可以为foo.s,该过程中,可以在识别代码的过程中,每遇到一个atomic就插入一个fence,这样,就不会因为插入过多的fence而影响性能。
进一步的,还可以将汇编文件转换为目标文件foo.ro,然后再执行链接过程,将该目标文件foo.ro与其他文件,如libc.a格式的文件或/和bar.ro格式的文件链接起来,得到目标架构的执行文件。
以上汇编文件、目标文件和执行文件都是适用于目标架构的不同格式的文件。
二、在源文件中做从volatile内存访问代码转换为atomic内存访问代码的转换。
如图13所示,在代码迁移场景中,该代码处理的过程可以包括:源文件处理过程、中间表示生成过程、汇编代码生成过程、目标代码生成过程和链接过程。
在源文件处理过程中编译器从源架构获取源文件,该源文件在该场景示例中为foo.c格式的源文件。该源文件中包括内嵌汇编代码。
该源文件处理过程包括预处理过程、内嵌汇编翻译过程和代码变换过程。其中,源文件处理过程会将源文件做宏展开处理,得到第一中间文件,该第一中间文件的格式为foo.i格式。内嵌汇编翻译过程可以参阅图10、图11A和图11B所对应的内嵌汇编翻译过程进行理解。代码变换过程包括将第二中间文件中的volatile内存访问代码转换为atomic内存访问代码,以及删除目标代码中单独的内存屏障,得到第三中间文件。该过程可以参阅前述的图12A和图12B进行理解。
中间表示生成过程可以将第三中间文件转换为中间表示。
其他的汇编代码生成过程、目标代码生成过程和链接过程都可以参阅图10部分的相应内容进行理解,此处不做过多赘述。
以上描述了代码迁移场景中编译器对代码的处理过程,在代码修复场景,只需要在上述代码迁移场景中,去掉内嵌汇编翻译过程。
本申请的工程人员在确定本申请方案的过程中,做过多次测试,下面以将X86架构上的ringbuffer编译为Aarch64的场景为例进行说明。
如图14A所示,直接将数据面编程工具包(data plane development kit,dpdk)中X86架构上的ringbuffer编译为Aarch64的二进制的执行结果显示,出现了多行代码运行失败(failed)。
如图14B所示,应用本申请实施例所提供的方案,将dpdk中X86架构上的ringbuffer编译为Aarch64的二进制的执行结果显示,运行成功(successful)。
本申请实施例提供的方案,可以自动翻译内嵌汇编代码,以及在中间表示的优化环节,通过将volatile memory access修改为atomic memory access来保证代码的顺序一致性,该方案可以适用于任何行数代码的程序,其效果在代码行数越多时表现的越明显,如果代码行数超过一万行,相对于现有技术,可以明显提高代码的处理效率。
另外,本申请实施例中,还通过图15示意了将dpdk中X86架构上的ringbuffer,通过人工专家修改的代码的运行结果70A,以及应用本申请的方案迁移dpdk ring buffer到Aarch64后的运行结果70B。图15中,横坐标是写者个数,纵坐标是吞吐率,读者个数是16个,本申请中,写者和读者都为线程。通过曲线70A和曲线70B的对比可以看出,采用本申请的方案迁移后的代码在吞吐率上更具有优势。
以上描述了在硬件内存序架构下的代码处理方法,下面结合附图介绍本申请实施例提供的一种硬件内存序架构下的代码处理装置80。
如图16所示,本申请实施例提供的硬件内存序架构下的代码处理装置80的一实施例包括:
获取单元801,用于获取编译流程中的第一文件,第一文件与源文件关联。该获取单元801可以执行上述方法实施例中的步骤201。
第一处理单元802,用于将获取单元801获取的第一文件的目标代码中的volatile内存访问代码转换为原子性的atomic内存访问代码,以得到第二文件,目标代码为与并发控制相关的内存访问代码。该第一处理单元802可以执行上述方法实施例中的步骤202。
第二处理单元803,用于对第一处理单元802处理得到的第二文件进行编译处理,以得到适用于目标架构的执行文件,目标架构为强内存序架构或弱内存序架构。该第二处理单元803可以执行上述方法实施例中的步骤203。
本申请实施例中,在编译流程中可以将并发控制相关的内存访问代码中的volatile内存访问代码转换为atomic内存访问代码,因为atomic内存访问可以使处理器执行程序时的执行代码与编写代码保持一致,从而减少了代码运行时出现挂死或死锁等非预期行为。
可选地,第一处理单元802,还用于删除目标代码中单独的内存屏障,单独的内存屏障为目标代码中单独的一条内嵌汇编指令,且单独的一条内嵌汇编指令是内存屏障指令。
可选地,第一文件为包含源代码的源文件,源文件包括适用于源架构的内嵌汇编代码,第一处理单元802,还用于将适用于源架构的内嵌汇编代码转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,源架构和目标架构为两个不同的硬件内存序架构。
可选地,第一文件为第一中间表示,第二文件为第二中间表示,获取单元801用于:获取与源架构对应的源文件,源文件中包括适用于源架构的内嵌汇编代码;将适用于源架构的内嵌汇编代码转换为能运行于目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件,源架构和目标架构为两个不同的硬件内存序架构;将中间文件转换为第一中间表示。
可选地,获取单元801用于:将适用于源架构的内嵌汇编代码转换为抽象语法树;按照抽象语法树中每个分支的语义,将每个分支转换为适用于目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件。
本申请实施例中,获取单元801可以对应上述图7和图8中的源文件处理模块,以及中间表示生成模块,第一处理单元802可以对应上述图7和图8中的中间表示变换模块,第二处理单元803可以对应上述图7和图8中的编译器后端模块。
以上所描述的装置80可以参阅前面方法实施例的相应内容进行理解,此处不在重复赘述。
图17所示,为本申请的实施例提供的计算机设备90的一种可能的逻辑结构示意图。计算机设备90包括:处理器901、通信接口902、存储器903以及总线904。处理器901、通信接口902以及存储器903通过总线904相互连接。在本申请的实施例中,处理器901用于对计算机设备90的动作进行控制管理,例如,处理器901用于执行图9中方法实施例中的步骤。通信接口902用于支持计算机设备90进行通信。存储器903,用于存储计算机设备90的程序代码和数据,并为进程组提供内存空间。
其中,处理器901可以是中央处理器单元,通用处理器,数字信号处理器,专用集成电路,现场可编程门阵列或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器901也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理器和微处理器的组合等等。总线904可以是外设部件互连标准(PeripheralComponent Interconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图17中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请的另一实施例中,还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当设备的处理器执行该计算机执行指令时,设备执行上述图1至图15中处理器所执行的步骤。
在本申请的另一实施例中,还提供一种计算机程序产品,该计算机程序产品包括计算机执行指令,该计算机执行指令存储在计算机可读存储介质中;当设备的处理器执行该计算机执行指令时,设备执行上述图1至图15中处理器所执行的步骤。
在本申请的另一实施例中,还提供一种芯片系统,该芯片系统包括处理器,该处理器用于支持内存管理的装置实现上述图1至图15中处理器所执行的步骤。在一种可能的设计中,芯片系统还可以包括存储器,存储器,用于保存数据写入的装置必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请实施例的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请实施例各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请实施例各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上,仅为本申请实施例的具体实施方式,但本申请实施例的保护范围并不局限于此。
Claims (16)
1.一种硬件内存序架构下的代码处理方法,应用于计算机系统,其特征在于,包括:
获取编译流程中的第一文件,所述第一文件与源文件关联;
将所述第一文件的目标代码中的volatile内存访问代码转换为原子性的atomic内存访问代码,以得到第二文件,所述目标代码为与并发控制相关的内存访问代码;
对所述第二文件进行编译处理,以得到适用于目标架构的执行文件,所述目标架构为强内存序架构或弱内存序架构。
2.根据权利要求1所述的代码处理方法,其特征在于,所述方法还包括:
删除所述目标代码中单独的内存屏障,所述单独的内存屏障为所述目标代码中单独的一条内嵌汇编指令,且所述单独的一条内嵌汇编指令是内存屏障指令。
3.根据权利要求1或2所述的代码处理方法,其特征在于,所述第一文件为包含源代码的源文件,所述源文件包括适用于源架构的内嵌汇编代码,所述方法还包括:
将适用于源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,所述源架构和所述目标架构为两个不同的硬件内存序架构。
4.根据权利要求1或2所述的代码处理方法,其特征在于,所述第一文件为第一中间表示,所述第二文件为第二中间表示,所述获取编译流程中的第一文件,包括:
获取与源架构对应的源文件,所述源文件中包括适用于所述源架构的内嵌汇编代码;
将适用于所述源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件,所述源架构和所述目标架构为两个不同的硬件内存序架构;
将所述中间文件转换为所述第一中间表示。
5.根据权利要求3或4所述的代码处理方法,其特征在于,所述将适用于所述源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,包括:
将所述适用于所述源架构的内嵌汇编代码转换为抽象语法树;
按照所述抽象语法树中每个分支的语义,将所述每个分支转换为适用于所述目标架构的内嵌汇编代码或编译器内建函数。
6.根据权利要求1-5任一项所述的代码处理方法,其特征在于,所述源文件为C/C++源文件。
7.根据权利要求3-5任一项所述的代码处理方法,其特征在于,
所述源架构为强内存序架构,所述目标架构为弱内存序架构;或者,
所述源架构为弱内存序架构,所述目标架构为强内存序架构;或者,
所述源架构为强内存序架构,所述目标架构为强内存序架构;或者,
所述源架构为弱内存序架构,所述目标架构为弱内存序架构。
8.一种硬件内存序架构下的代码处理装置,其特征在于,包括:
获取单元,用于获取编译流程中的第一文件,所述第一文件与源文件关联;
第一处理单元,用于将所述获取单元获取的第一文件的目标代码中的volatile内存访问代码转换为原子性的atomic内存访问代码,以得到第二文件,所述目标代码为与并发控制相关的内存访问代码;
第二处理单元,用于对所述第一处理单元处理得到的第二文件进行编译处理,以得到适用于目标架构的执行文件,所述目标架构为强内存序架构或弱内存序架构。
9.根据权利要求8所述的代码处理装置,其特征在于,
所述第一处理单元,还用于删除所述目标代码中单独的内存屏障,所述单独的内存屏障为所述目标代码中单独的一条内嵌汇编指令,且所述单独的一条内嵌汇编指令是内存屏障指令。
10.根据权利要求8或9所述的代码处理装置,其特征在于,所述第一文件为包含源代码的源文件,所述源文件包括适用于源架构的内嵌汇编代码,
所述第一处理单元,还用于将适用于源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,所述源架构和所述目标架构为两个不同的硬件内存序架构。
11.根据权利要求8或9所述的代码处理装置,其特征在于,所述第一文件为第一中间表示,所述第二文件为第二中间表示,
所述获取单元用于:
获取与源架构对应的所述源文件,所述源文件中包括适用于所述源架构的内嵌汇编代码;
将适用于所述源架构的内嵌汇编代码转换为能运行于所述目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件,所述源架构和所述目标架构为两个不同的硬件内存序架构;
将所述中间文件转换为所述第一中间表示。
12.根据权利要求11所述的代码处理装置,其特征在于,
所述获取单元用于:
将所述适用于所述源架构的内嵌汇编代码转换为抽象语法树;
按照所述抽象语法树中每个分支的语义,将所述每个分支转换为适用于所述目标架构的内嵌汇编代码或编译器内建函数,以得到中间文件。
13.一种计算设备,其特征在于,包括一个或多个处理器和存储有计算机程序的计算机可读存储介质;
所述计算机程序被所述一个或多个处理器执行时实现如权利要求1-7任一项所述的方法。
14.一种芯片系统,其特征在于,包括多个处理器,所述多个处理器被调用用于执行如权利要求1-7任一项所述的方法。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被一个或多个处理器执行时实现如权利要求1-7任一项所述的方法。
16.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序当被一个或多个处理器执行时用于实现如权利要求1-7任一项所述的方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110930181.8A CN115705194A (zh) | 2021-08-13 | 2021-08-13 | 一种硬件内存序架构下的代码处理方法及相应装置 |
PCT/CN2022/111385 WO2023016480A1 (zh) | 2021-08-13 | 2022-08-10 | 一种硬件内存序架构下的代码处理方法及相应装置 |
EP22855460.6A EP4372557A1 (en) | 2021-08-13 | 2022-08-10 | Code processing method under hardware memory order architecture, and corresponding apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110930181.8A CN115705194A (zh) | 2021-08-13 | 2021-08-13 | 一种硬件内存序架构下的代码处理方法及相应装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115705194A true CN115705194A (zh) | 2023-02-17 |
Family
ID=85181122
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110930181.8A Pending CN115705194A (zh) | 2021-08-13 | 2021-08-13 | 一种硬件内存序架构下的代码处理方法及相应装置 |
Country Status (3)
Country | Link |
---|---|
EP (1) | EP4372557A1 (zh) |
CN (1) | CN115705194A (zh) |
WO (1) | WO2023016480A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820568A (zh) * | 2023-06-09 | 2023-09-29 | 北京市合芯数字科技有限公司 | 指令翻译方法及装置、存储介质和终端 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116074208B (zh) * | 2023-03-24 | 2023-07-07 | 之江实验室 | 一种多模态网络的模态部署方法及模态部署系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160154677A1 (en) * | 2013-03-15 | 2016-06-02 | Rajkishore Barik | Work Stealing in Heterogeneous Computing Systems |
CN110083445A (zh) * | 2019-04-21 | 2019-08-02 | 哈尔滨工业大学 | 一种基于弱内存一致性的多线程确定性执行方法 |
CN110221862A (zh) * | 2019-06-12 | 2019-09-10 | 上海兆芯集成电路有限公司 | 指令执行方法及指令执行装置 |
CN110569105A (zh) * | 2019-08-14 | 2019-12-13 | 上海交通大学 | 分布式虚拟机自适应内存一致性协议及其设计方法、终端 |
CN112131032A (zh) * | 2020-08-28 | 2020-12-25 | 北京大学 | 一种基于混合内存系统的故障快速恢复方法 |
CN112463329A (zh) * | 2020-11-27 | 2021-03-09 | 天津七所精密机电技术有限公司 | 一种适用于龙芯3A的Linux系统网络接口性能优化方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10929174B2 (en) * | 2016-12-15 | 2021-02-23 | Ecole Polytechnique Federale De Lausanne (Epfl) | Atomic object reads for in-memory rack-scale computing |
-
2021
- 2021-08-13 CN CN202110930181.8A patent/CN115705194A/zh active Pending
-
2022
- 2022-08-10 WO PCT/CN2022/111385 patent/WO2023016480A1/zh active Application Filing
- 2022-08-10 EP EP22855460.6A patent/EP4372557A1/en active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160154677A1 (en) * | 2013-03-15 | 2016-06-02 | Rajkishore Barik | Work Stealing in Heterogeneous Computing Systems |
CN110083445A (zh) * | 2019-04-21 | 2019-08-02 | 哈尔滨工业大学 | 一种基于弱内存一致性的多线程确定性执行方法 |
CN110221862A (zh) * | 2019-06-12 | 2019-09-10 | 上海兆芯集成电路有限公司 | 指令执行方法及指令执行装置 |
CN110569105A (zh) * | 2019-08-14 | 2019-12-13 | 上海交通大学 | 分布式虚拟机自适应内存一致性协议及其设计方法、终端 |
CN112131032A (zh) * | 2020-08-28 | 2020-12-25 | 北京大学 | 一种基于混合内存系统的故障快速恢复方法 |
CN112463329A (zh) * | 2020-11-27 | 2021-03-09 | 天津七所精密机电技术有限公司 | 一种适用于龙芯3A的Linux系统网络接口性能优化方法 |
Non-Patent Citations (2)
Title |
---|
DANIEL LUSTIG: "Transistency Models: Memory Ordering at the Hardware-OS Interface", 《IEEE》, 14 June 2017 (2017-06-14) * |
李韦;文渊博;孙广中;陈云霁;: "提升高性能计算程序性能可移植性的领域特定语言", 高技术通讯, no. 02, 15 February 2020 (2020-02-15) * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820568A (zh) * | 2023-06-09 | 2023-09-29 | 北京市合芯数字科技有限公司 | 指令翻译方法及装置、存储介质和终端 |
CN116820568B (zh) * | 2023-06-09 | 2024-01-05 | 北京市合芯数字科技有限公司 | 指令翻译方法及装置、存储介质和终端 |
Also Published As
Publication number | Publication date |
---|---|
EP4372557A1 (en) | 2024-05-22 |
WO2023016480A1 (zh) | 2023-02-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9134966B2 (en) | Management of mixed programming languages for a simulation environment | |
US7987458B2 (en) | Method and system for firmware image size reduction | |
CN108139921B (zh) | 仿真器的性能优化方法及系统 | |
BR112016024522B1 (pt) | Meio de armazenamento legível por computador não transitório, e, método para especializar uma classe genérica | |
WO2023016480A1 (zh) | 一种硬件内存序架构下的代码处理方法及相应装置 | |
WO2019005228A1 (en) | AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM | |
Grimmer et al. | Dynamically composing languages in a modular way: Supporting C extensions for dynamic languages | |
US10545743B2 (en) | Enhanced programming language source code conversion with implicit temporary object emulation | |
US10248409B1 (en) | Limiting the effects of source code patches on corresponding native-code patches | |
Liu et al. | Faaslight: General application-level cold-start latency optimization for function-as-a-service in serverless computing | |
US20160246622A1 (en) | Method and system for implementing invocation stubs for the application programming interfaces embedding with function overload resolution for dynamic computer programming languages | |
CN114816417B (zh) | 一种交叉编译方法、装置、计算设备及存储介质 | |
JP2002196937A (ja) | 従来のアセンブラを用いた新規の命令を含む命令セットアーキテクチャ用のアセンブリ言語コードをコンパイルする方法 | |
CN115629971A (zh) | 一种应用的开发系统和开发方法 | |
CN114116134A (zh) | 智能合约部署和执行方法、设备及存储介质 | |
CN116934330A (zh) | 一种调用智能合约的方法及执行方法、计算机设备及存储介质 | |
Chen et al. | Hopper: Interpretative fuzzing for libraries | |
US9229698B2 (en) | Method and apparatus for compiler processing for a function marked with multiple execution spaces | |
KR101349631B1 (ko) | 중간 언어 변환 방법과 그를 위한 시스템 및 컴퓨터로 읽을 수 있는 기록매체 | |
CN110502439B (zh) | 调试方法、装置、电子设备以及存储介质 | |
US20240184547A1 (en) | Code processing method in hardware memory order architecture and corresponding apparatus | |
US8468511B2 (en) | Use of name mangling techniques to encode cross procedure register assignment | |
US20110099534A1 (en) | Information processing apparatus, execution program operation modification method, and recording medium | |
US8839191B2 (en) | Computer-readable recording medium, compiler, execution control apparatus, and execution control method for converting a program to be called | |
KR101213651B1 (ko) | 운영체제의 초기화 스크립트의 이진화 방법, 및 그 이진화 스크립트의 실행 방법 |
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 |