CN111279308A - 代码转换期间的屏障减少 - Google Patents
代码转换期间的屏障减少 Download PDFInfo
- Publication number
- CN111279308A CN111279308A CN201880067059.9A CN201880067059A CN111279308A CN 111279308 A CN111279308 A CN 111279308A CN 201880067059 A CN201880067059 A CN 201880067059A CN 111279308 A CN111279308 A CN 111279308A
- Authority
- CN
- China
- Prior art keywords
- memory
- processor
- instructions
- instruction
- stack
- 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.)
- Granted
Links
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/52—Binary to binary
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/3017—Runtime instruction translation, e.g. macros
- G06F9/30174—Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30181—Instruction operation extension or modification
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
当在指令集架构(ISA)之间转换处理器指令时减少被屏障指令的发出。实施例包括获取根据第一处理器ISA被格式化的(多个)处理器指令块。(多个)块包括执行存储器操作的指令,该存储器操作的执行次序基于第一处理器ISA的硬件存储器模型而被约束。基于对(多个)处理器指令块的分析,确定至少一个指令的存储器操作能够被使得在第二处理器ISA的硬件存储器模型中与次序无关。基于该确定,发出根据第二处理器ISA被格式化的一个或多个无屏障处理器指令。(多个)无屏障处理器指令被构造为在没有排序约束的情况下执行存储器操作。
Description
背景技术
现代微处理器(处理器)采用许多技术来实现高性能。例如,许多现代处理器能够同时执行多个线程。例如,处理器可以包括多个物理核,每个物理核能够与其他核同时执行独立的线程。附加地或备选地,单个物理处理器核可以能够同时执行两个或更多个线程。此能力被称为同时多线程或SMT(也被称为超线程)。当SMT被使用时,每个物理核被视为包括两个或更多个“逻辑”核,每个“逻辑”核都使用共享的执行单元(例如,诸如多个算术逻辑单元)来执行不同的线程。在处理器拥有多个物理核的一些实现中,这些物理核中的每个物理核也是具有SMT能力的核。因此,在大多数这些实现中,处理器呈现的逻辑核的数目是物理核的两倍。
被用来实现高性能的另一种技术是使核以与个体硬件代码指令被写入的次序不同的次序或者更典型地与其被编译器生成的次序不同的次序来执行个体硬件代码指令。这样的“无次序”执行使得核能够更充分地利用其内部的处理器资源(例如,执行单元),这些处理器资源通常是高度并行的。例如,如果两个(或更多个)硬件指令不彼此依赖,则单个处理器核可以能够并行执行这些指令,而不是在开始执行一个指令之前空闲地等待另一指令完成。无次序执行可以被应用于许多类型的硬件指令,包括执行存储器操作(即,从存储器层级读取或写入存储器层级的操作,存储器层级通常包括一个或多个高速缓存和系统存储器)的指令。由于无次序执行和/或存储器层级设计,存储器访问操作可以被另一核或设备感知为以与原始代码中规定的次序不同的次序发生。
在许多情况下,在一个或多个核上同时执行的多个线程是相关的,诸如是相同应用过程的一部分。当同时执行的线程是相关的时候,通过访问正被一个或多个其他线程使用的存储器层级中的存储器位置(即,从其中读取和/或写入其中),针对一个线程执行的硬件指令可以执行影响一个或多个其他线程的存储器操作。例如,线程可以访问共享变量(例如,全局变量)、被线程共享的数据结构等。如果来自不同线程的存储器操作在其相应核(物理的或逻辑的)处被无次序执行和/或被存储器层级无次序执行,这种无次序执行如果没有被正确处理可能会导致问题。
例如,一个过程可以包括经由一个或多个同步变量进行同步的多个线程。为了说明,假设用于第一线程的代码设置了两个数据变量和一个同步变量,其值以FALSE(假)开始。例如:
Data1=A
Data2=B
SyncVariable=TRUE
进一步假设用于第二线程的代码读取Data1(数据1)和Data2(数据2)的值,但是仅当SyncVariable(同步变量)为TRUE(真)时才读取。例如:
Temp=SyncVariable
WHILE Temp=FALSE
//执行一些不涉及数据A或B的操作
END WHILE
Read A&B
为了正确执行,此场景中的一些排序(ordering)约束包括以下两者:(i)由第一线程对SyncVariable的写入必须被排序在由第一线程对Data1和Data2的写入之后,以及(ii)由第二线程对SyncVariable的读取必须被排序在由第二线程对Data1和Data2的后续读取之前。
为了解决存储器操作的重新排序问题,现代处理器采用硬件存储器模型,该硬件存储器模型定义了存储器影响如何在多处理器(包括多核)系统中被全局可见。特别地,硬件存储器模型定义了线程如何通过存储器进行交互,包括线程可以如何使用诸如同步变量的共享数据。编程语言可以进一步采用软件存储器模型,以在编译时间施加附加的限制。通常,硬件存储器模型定义了在执行多个线程时存储器操作的哪种类型的无次序执行是可能的。
一些处理器具有倾向于对存储器操作的无次序执行施加许多限制的硬件存储器模型,并且因此被称为具有总体“较强”的存储器模型。其他处理器具有倾向于对存储器操作的无次序执行施加较少限制的硬件存储器模型,并且因此被称为具有总体“较弱”的存储器模型。因此,存储器模型可以落在从最强(例如,没有存储器重新排序的“顺序一致”存储器模型)到最弱(例如,其中任何加载或存储操作都可以与任何其他加载或存储操作一起被有效地重新排序,只要其不修改单个隔离线程的行为即可)的频谱上。
为了说明,通常已知x86系列的处理器指令集架构(ISA)(例如,x86、x86-64,在本文中被称为x86)具有相对较强的存储器模型,其中机器指令通常与获取和释放语义一起隐式地出现。因此,对于大多数x86指令,当一个核执行写入序列时,每个其他核通常会看到那些值以与其被写入的相同的次序而改变。一般而言,如果其他核总是在任何后续指令的存储器影响之前看到一个指令的存储器影响,则该指令具有“获取语义”,并且如果其他核在一个指令本身的存储器影响之前看到每个先前指令的存储器影响,则该指令具有“释放语义”。相反,与x86 ISA的存储器模型相比,通常已知ARM兼容系列的处理器ISA具有相对较弱或“放松”的存储器模型,并且只要地址依赖性被保留,就允许许多类型的存储器操作重新排序。
经常地,可能希望在具有第二ISA(例如ARM)的处理器上执行针对具有第一ISA(例如,x86)的处理器所编译的应用。如果应用的高级别源代码可用,并且其是以可移植的方式被编写的,则以第二ISA作为目标对应用进行重新编译通常是相对简单的。但是,如果源代码不可用,则需要将应用的可执行二进制文件的硬件指令(即汇编代码)转换为第二ISA的指令。因此,转换器可以将第一ISA的第一硬件指令转换为兼容的第二ISA的第二硬件指令。
如果第一ISA具有比第二ISA的存储器模型更强的存储器模型,则访问存储器的任何第一硬件指令都可以携载隐式获取和释放语义。由于这些语义是隐式的,因此通常无法从指令本身得知存在哪些类型的所需排序。因此,当发出用于第二ISA的第二指令时,常规转换器通常将存储器屏障(barrier)插入到第二指令中,以强制存储器操作以与第一ISA中已经存在的排序限制相似的排序限制来执行。存储器屏障可以包括一个或多个附加指令,该附加指令是结合执行存储器操作的指令而被发出的,并且将排序约束施加于存储器操作的执行。附加地或备选地,存储器屏障可以包括第二ISA中在强制实施排序约束本身的同时执行存储器操作的指令。
由于转换器是基于个体指令的隐式获取和释放语义来操作的,而不是基于应用代码的更广泛理解,如果更高级别的源代码可用,则基于应用代码的更广泛理解是可能的,因此在很多情形下,其发出对于应用在第二ISA处的正确执行而言实际上不是必要的屏障,以及在用第二ISA作为直接目标编译了更高级别的源代码的情况下可能不必被创建的屏障。如此,这些屏障对第二ISA处的正确执行强制实施了不必要的排序约束,通常增加了第二ISA中被发出的指令数目,并且损害了第二ISA处的被转换应用的执行性能。
发明内容
本文描述的至少一些实施例减少了在从第一ISA到第二ISA的代码转换期间被发出的“被屏障(barriered)”指令的数目。如果第一ISA的硬件存储器模型强于第二ISA的硬件存储器模型,则本文的实施例可能特别有用。因此,本文的实施例可以有益于从来自较强存储器模型(例如,x86、AMD64和SPARC TSO)的汇编代码到用于较弱存储器模型(例如,ARM、PowerPC和Alpha)的汇编代码的转换。
在一些实施例中,一种用于在指令集架构(ISA's)之间转换处理器指令时减少被屏障指令的发出的方法包括:获取根据第一处理器ISA被格式化的一个或多个处理器指令块。一个或多个处理器指令块包括执行存储器操作的至少一个指令,该存储器操作的执行次序基于第一处理器ISA的硬件存储器模型而被约束。基于对一个或多个处理器指令块的分析,确定至少一个指令的存储器操作能够被使得在第二处理器ISA的硬件存储器模型中与次序无关。基于该确定,发出一个或多个无屏障(unbarriered)处理器指令。这些无屏障处理器指令根据第二处理器ISA被格式化,并且被构造为在没有排序约束的情况下执行存储器操作。
提供本发明内容以简化的形式介绍一些概念,这些概念将在下面的详细描述中被进一步描述。本发明内容既不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
附图说明
为了描述获取本发明的上述及其他优势和特征的方式,将通过参考在附图中图示出的本发明的特定实施例来呈现对以上简要描述的本发明的更具体描述。应当理解,这些附图仅描绘了本发明的典型实施例,并且因此不应被认为是对本发明范围的限制,本发明将通过使用附图以附加的独特性和细节来进行描述和解释,其中:
图1图示了有利于代码转换期间的屏障减少的示例计算机架构;
图2图示了用于在ISA之间转换处理器指令时减少被屏障指令的发出的示例方法的流程图;
图3图示了可以由本文的实施例使用的示例存储器布局;
图4图示了用于将寄存器分类为“堆栈得出的(stack-derived)”或“全局的”的示例方法的流程图;
图5图示了基于寄存器分类将x86代码指令转换为对应的ARM代码指令的示例;以及
图6图示了x86机器代码,其展示了循环计数器得出的存储器访问。
具体实施方式
本文描述的至少一些实施例减少了在从第一ISA到第二ISA的代码转换期间被发出的“被屏障”指令的数目。如果第一ISA的硬件存储器模型强于第二ISA的硬件存储器模型,则本文的实施例可能特别有用。因此,本文中的实施例可以有益于从来自较强存储器模型(例如,x86、AMD64和SPARC TSO)的汇编代码到用于较弱存储器模型(例如,ARM、PowerPC和Alpha)的汇编代码的转换。
减少被发出到第二ISA中的“被屏障”指令的数目可以减小被发出的代码的整体大小,但更重要的是,其可以显著提高所发出的代码的执行性能。例如,发明人已经常观察到:在ARM汇编中,与被屏障的ARM指令相比,发出无屏障ARM指令以进行存储器访问引起存储器访问的执行速度显著提高。如将在下文中更具体地定义的,“无屏障”指令可以包括省略存储器屏障的一个或多个指令,而“被屏障”指令可以包括包含存储器屏障的一个或多个指令。
本发明的实施例可以包括或利用专用或通用计算机系统,该专用或通用计算机系统包括诸如例如一个或多个处理器和系统存储器之类的计算机硬件,如下面更详细地讨论的。本发明范围内的实施例还包括用于携载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是由通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。携载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种明显不同种类的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质是存储计算机可执行指令和/或数据结构的物理存储介质。物理存储介质包括计算机硬件,诸如RAM、ROM、EEPROM、固态驱动器(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储设备、磁盘存储设备或其他磁性存储设备,或任何其他可以被用来以计算机可执行指令或数据结构的形式存储程序代码的(多个)硬件存储设备,这些程序代码可以由通用或专用计算机系统访问和执行以实现本发明所公开的功能性。
传输介质可以包括网络和/或数据链路,其可以被用来以计算机可执行指令或数据结构的形式携载程序代码,并且其可以由通用或专用计算机系统访问。“网络”被定义为使得能够在计算机系统和/或模块和/或其他电子设备之间传送电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或硬连线或无线的组合)被传送或提供给计算机系统时,计算机系统可以将连接视为传输介质。上述的组合也应被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件时,以计算机可执行指令或数据结构形式的程序代码可以从传输介质被自动传送到计算机存储介质(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以被缓冲在网络接口模块(例如“NIC”)内的RAM中,并且然后被最终传送到计算机系统处的易失性较小的计算机存储介质和/或计算机系统RAM。因此,应当理解,计算机存储介质可以被包括在也(或者甚至主要地)利用传输介质的计算机系统组件中。
计算机可执行指令包括例如指令和数据,当其在一个或多个处理器处被执行时使通用计算机系统、专用计算机系统或专用处理设备执行特定功能或一组功能。计算机可执行指令可以是例如二进制文件、诸如汇编语言的中间格式指令、或者甚至源代码。
本领域技术人员将理解,可以在具有许多类型的计算机系统配置的网络计算环境中实践本发明,计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器或可编程的消费类电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板电脑、寻呼机、路由器、交换机等。本发明也可以在分布式系统环境中被实践,在其中,通过网络(通过硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)链接的本地和远程计算机系统均执行任务。如此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。
本领域技术人员还将理解,可以在云计算环境中实践本发明。云计算环境可以是分布式的,尽管这不是必需的。当云计算环境是分布式时,其可以在组织内被国际地分布和/或具有跨多个组织拥有的组件。在本说明书和所附权利要求中,“云计算”被定义为用于实现对可配置计算资源(例如,网络、服务器、存储装置、应用和服务)的共享池的按需网络访问的模型。“云计算”的定义不限于在被适当部署时可以从这种模型中获取的其他众多优势中的任何优势。
云计算模型可以由各种特性组成,诸如按需自助服务、广泛的网络访问、资源池、快速弹性、测量的服务等等。云计算模型还可以采用各种服务模型的形式,诸如例如软件即服务(“SaaS”)、平台即服务(“PaaS”)和基础设施即服务(“IaaS”)。还可以使用诸如私有云、社区云、公共云、混合云等不同的部署模型来部署云计算模型。
一些实施例,诸如云计算环境,可以包括一种系统,该系统包括一个或多个主机,每个主机能够运行一个或多个虚拟机。在操作期间,虚拟机模拟支持操作系统以及可能的一个或多个其他应用的操作计算系统。在一些实施例中,每个主机包括管理程序,该管理程序使用从虚拟机的视图被抽象出的物理资源来模拟用于虚拟机的虚拟资源。管理程序还在虚拟机之间提供适当的隔离。因此,从任何给定虚拟机的角度,管理程序提供了虚拟机正在与物理资源接口的错觉,即使虚拟机仅与物理资源的外观(例如,虚拟资源)进行接口。物理资源的示例包括处理能力、存储器、磁盘空间、网络带宽、介质驱动等。
鉴于此上下文,图1图示了有利于代码转换期间的屏障减少的示例计算机架构100。参考图1,计算机架构100包括计算机系统101,其被配置为当在ISA之间转换处理器指令时减少被屏障指令的发出。如图所示,计算机系统101包括系统存储器、输入/输出硬件103、(多个)处理器104和(多个)数据存储库105。被存储在(多个)数据存储库105中的是(多个)源可执行文件106。(多个)源可执行文件106包括可执行二进制文件,该可执行二进制文件不是根据计算机系统101的(多个)处理器104的第二处理器ISA而是根据第一处理器ISA被格式化。例如,(多个)源可执行文件106可以包括根据第一ISA被格式化的硬件处理器指令的一个或多个流。为了能够使用(多个)处理器104执行(多个)源可执行文件106,(多个)数据存储库105包括转换组件108,诸如操作系统库、模拟应用等。
转换组件108被示为被加载到系统存储器102中(即,转换组件108')。计算机系统101可以加载转换组件108',作为调用操作系统库的结果、作为打开模拟应用的结果等等。在一些实施例中,在接收到执行(多个)源可执行文件106的请求时,转换组件108'被按需加载。
如图所示,转换组件108'包括多个子组件,这些子组件象征性地表示各种功能性,该各种功能性可能是转换组件108'的一部分。例如,转换组件108'被示为包括代码输入组件108a、静态分析组件108b、运行时分析组件108c和代码生成组件108d。然而,鉴于本文的公开内容,本领域技术人员将认识到,该功能性仅仅是说明性的而非限制性的。
在一些实施例中,代码输入组件108a从(多个)数据存储库105中获取(多个)源可执行文件106的全部或部分。代码输入组件108a将(多个)源可执行文件106的硬件处理器指令提供给静态分析组件108b和/或运行时分析组件108c之一或两者。在一些实施例中,代码输入组件108a将硬件处理器指令划分为第一ISA中的一个或多个指令的块,并且静态分析组件108b和/或运行时分析组件108c对这些块中的每个块执行其相应的分析。
在一些实施例中,块包括一个代码入口点和一个或多个代码出口点。然而,实施例可以支持多个入口点,或者可以将出口点的数目限制为一个(本领域技术人员通常将这描述为“基本块”)。附加地或备选地,可以基于数据大小(例如,指定数目的字节)来标识块。例如,代码输入组件108a可以尝试标识基本块,但是如果未在预定义数目的字节内标识出一个基本块,则可以在指定数目的字节处切断该块,而不是继续标识基本块的末端。
在一些实施例中,指令块不需要包括连续的指令集。例如,如果指令包括无条件的跳转指令(即,无条件地跳过一个或多个指令的指令),则代码输入组件108a在形成块时可以越过被跳过的指令。因此,块可以包括无条件跳转和(可能)包括跳转到的指令,但缺少被跳过的一个或多个指令。
这些指令块中的一些指令块可以包括执行存储器操作的一个或多个指令。因此,在接收到(多个)指令集后,静态分析组件108b和/或运行时分析组件108c执行一种或多种类型的分析以标识该指令集中执行存储器访问操作的任何指令。当存在时,静态分析组件108b和/或运行时分析组件108c可以进一步确定这些存储器访问操作中是否有不需要在(多个)处理器104的第二ISA中被排序的任何存储器访问操作,即使其可能在第一ISA中具有排序约束。一种或多种类型的分析还可以标识指令集中执行需要在(多个)处理器104的第二ISA中被排序的存储器访问操作的(多个)指令。还可能存在没有针对其做出关于第二ISA中的排序能力的确定的存储器访问操作。静态分析组件108b和/或运行时分析组件108c的分析结果然后被传递到代码生成组件108d。所使用的分析的类型可以变化,并且以下结合图3-图6描述若干示例。
代码生成组件108d将(多个)指令集转换为根据第二ISA被格式化的(多个)对应指令,使得其可以在(多个)处理器104处被执行。作为转换的一部分,代码生成组件108d使用从静态分析组件108b和/或运行时分析组件108c接收的分析结果来在第二ISA中生成/发出(多个)“无屏障”处理器指令,该“无屏障”处理器指令执行被标识为在第二ISA中不需要被排序的任何存储器访问操作。否则,代码生成组件108d在第二ISA中生成/发出(多个)“被屏障”处理器指令,该“被屏障”处理器指令执行被标识为在第二ISA中需要被排序的(多个)任何存储器访问操作。代码生成组件108d还可以在第二ISA中为(多个)任何其他存储器访问操作(即,分析针对其未做出关于第二ISA中的可排序性的确定的存储器访问操作)生成/发出(多个)“被屏障”处理器指令。
如本说明书和权利要求书中所使用的,“无屏障”处理器指令是没有对由该指令定义的(多个)存储器操作施用排序约束的指令。另一方面,“被屏障”处理器指令是:(i)确实对由该指令定义的(多个)存储器操作施用排序约束的一个或多个指令,或(ii)多个指令,包括:没有对由该指令定义的(多个)存储器操作施用排序约束的一个或多个第一指令,以及对(多个)第一指令引起排序约束的一个或多个第二指令。(多个)第二指令可以包括一个或多个“存储器屏障”指令,本领域技术人员也将其称为“存储器障碍”指令。许多处理器架构定义存储器屏障/障碍指令,并且代码生成组件108d可以选择第二ISA中可用的适当指令。注意,取决于第二ISA,可以以不同次序发出一个或多个第一指令以及一个或多个第二指令(例如,可以在一个或多个第一指令之前发出一个或多个第二指令)。
将理解,一些处理器架构可以提供执行存储器操作的各种处理器指令,并且可以包括相同类型的操作的排序有约束和排序无约束的变型。因此,当发出无屏障处理器指令时,代码生成组件108d可以选择无约束的变型,并且当发出被屏障处理器指令时,代码生成组件108d可以选择有约束的版本。如果处理器架构缺乏这样的变型(例如,仅具有无约束的类型),那么当发出被屏障处理器指令时,代码生成组件108d可以发出可用的无约束的类型以及附加的屏障指令。
转换组件108'的输出可以包括(多个)目的地可执行文件107(包括可执行二进制文件、库等),其包括根据(多个)处理器104的第二ISA被定义的硬件处理器指令。另外,(多个)可执行文件可以包括(多个)存储器中缓冲器,其包含可执行代码,可能还包含一些可能不是直接可执行的元数据。(多个)这些可执行文件可以仅被存储在系统存储器102中,或者(如所描绘)可以被递交给(多个)数据存储库105以进行持久存储。如驻留在系统存储器102中的(多个)目的地可执行文件107'所指示,(多个)这些目的地可执行文件107也可以在(多个)处理器104处被执行。
如图所示,一些实施例可以利用另一计算机系统110,其可以被一个或多个网络109(例如,LAN或WAN,包括因特网)分开。如图所示,计算机系统110可以包括转换组件111,该转换组件111还被配置为将机器指令从一个处理器ISA转换为另一处理器ISA,同时减少屏障的使用。其还可以包括库112,诸如不同转换的可执行文件的库。因此,例如,计算机系统110可以作为远程转换服务操作,其执行转换组件108的全部或部分工作。
由转换组件108和/或111进行的代码转换以及(多个)目的地可执行文件107的执行的特定时序可以基于实现以及基于诸如用户体验、性能和功率使用目标之类的设计因素而变化。本领域技术人员将认识到,(多个)源可执行文件106到(多个)目的地可执行文件107的转换会消耗大量资源(例如,系统存储器102和/或(多个)处理器104)。因此,可以以各种方式来配置计算环境100以平衡不同的实现目标。
例如,在一个实施例中,(多个)源可执行文件106(或其各部分)被提交给计算机系统110,计算机系统110使用转换组件111执行转换组件108的一个或多个功能(例如,静态分析和代码生成)。然后使此工作的结果在库112中可用。例如,在安装(多个)源可执行文件106时、在最初执行(多个)源可执行文件106时或在某些其他时间(例如,按预定义的或周期性的调度),计算机系统101可以(例如,基于代码签名、哈希、开发方标识符等)向计算机系统110标识(多个)源可执行文件106。如果计算机系统110已经处理了(多个)源可执行文件106,则其可以从库112返回目的地可执行文件107。否则,计算机系统101可能将(多个)源可执行文件106(或其各部分)提交给计算机系统110,然后其可以用转换组件111对其进行转换,并使转换后的代码在库112中可用。以这种方式使用计算机系统110的优势是将计算机101处的功率使用/处理量最小化,同时仍为计算机系统101提供优化的(即,屏障使用减少的代码)(多个)目的地可执行文件107。由于计算机系统110可以具有比计算机系统101更多的处理能力,因此其可以能够执行比计算机系统101更多类型的分析和/或作为分析的一部分的更复杂的启发法,从而得到高度优化的(多个)目的地可执行文件107。作为备选方案,计算机系统101可以最初转换(多个)源可执行文件106本身(尽管由于执行比计算机系统110可能执行的更少或更不复杂类型的分析而生成次优的转换后的代码),并且还将(多个)源可执行文件106提交给计算机系统110,以进行比在计算机系统101处执行的更彻底的分析和更优化的代码转换。
在另一实施例中,所有工作都在计算机系统101处被执行。例如,在(多个)源可执行文件106的安装时、在(多个)源可执行文件106的初始执行时或在某些其他时间(例如,按预定义的或周期性的调度),计算机系统101可以确定是否存在(多个)目的地可执行文件107。如果其存在,则其可以在(多个)处理器104处被执行。否则,可以调用转换组件108以生成(多个)目的地可执行文件107。
在一些实施例中,转换组件108完全基于静态分析(即,使用静态分析组件108b)来生成(多个)目的地可执行文件107。因此,转换组件108生成(多个)目的地可执行文件107,并且然后仅在转换被完成之后才在(多个)处理器104处执行该(多个)目的地可执行文件107。静态分析的优势在于,与运行时分析(即,使用运行时分析组件108c)相比,潜在地能够执行更多类型的分析和/或作为分析的一部分的更复杂的启发法,从而可能得到比在仅使用运行时分析的情况下更优化的(多个)目的地可执行文件107。附加地,当计算机系统101附接到外部电源时,和/或当(多个)处理器104在很大程度上空闲时,计算机系统101可能能够选择执行转换的时间。
在一些实施例中,转换组件108完全基于运行时分析来生成(多个)目的地可执行文件107。因此,当代码生成组件108d生成(多个)目的地可执行文件107时,(多个)处理器104执行(多个)目的地可执行文件107的各部分。在该实施例中,代码输入108a确定接下来将(或将可能)执行(多个)源可执行文件106的硬件处理器指令的哪个(哪些)部分,并将(多个)那些指令传递给运行时分析组件108c以由代码生成组件108d进行分析和转换。在一些实施例中,当代码输入108a标识指令块时,代码生成组件108d针对该块生成根据第二ISA被格式化的指令(使用运行时分析组件的分析),并将转换后的指令块传递给(多个)处理器104以供执行。运行时分析的优势是能够使得(多个)源可执行文件106“按需”被转换和执行,而不会像静态分析的情况那样导致开始执行的严重延迟。另外,运行时分析可以能够基于观察到的运行时行为进行优化,诸如确定哪些代码段被更大量地利用以及以何种方式被利用,并基于此信息进行目标优化。
静态分析和运行时分析的组合也是可能的。例如,可以对(多个)处理器104正在等待执行或被预期在近期或不久的将来执行的代码块执行运行时分析。然后,如果在(多个)处理器104处存在减少的活动时段,则可以对被预期在不太近期或不近的将来执行的其他代码块执行静态分析。因此,例如,在启动(多个)源可执行文件106的请求时,可以利用运行时分析来有利于应用的响应性启动和初始使用。然后,当在(多个)处理器104上存在可用时间时,可以基于静态分析来转换(多个)源可执行文件106的其余部分。另外,使用运行时分析转换的部分可以稍后使用静态分析进行重新转换,这可能能够比运行时分析产生更优化的转换代码。这具有提供响应性的优势,同时仍获得静态分析的优势(例如,比仅用运行时分析所可能的分析更深入的分析)。
一些实现甚至可以将计算机系统101处的运行时分析与计算机系统110处的静态分析相结合。例如,计算机系统101可以使用运行时分析来提供与(多个)源可执行文件106相对应的应用的响应性启动和初始使用。然后,在使用运行时分析执行应用时,计算机系统101可以从计算机系统110请求对(多个)源可执行文件106的一个或多个部分的静态分析。
鉴于图1的计算环境100,图2图示了用于在ISA之间转换处理器指令时减少屏障指令的发出的示例方法200的流程图。尽管将方法200描绘为一系列动作,但是应当理解,这些仅仅是示例,并且与本文的公开内容相一致的用于在ISA之间转换处理器指令时减少屏障指令的发出的方法可以包括对这些动作的变型。
如图所示,方法200包括获取具有第一存储器模型的第一ISA中的(多个)处理器指令块的动作201。在一些实施例中,动作201可以包括获取根据第一处理器ISA被格式化的一个或多个处理器指令块,该一个或多个处理器指令块包括执行存储器操作的至少一个指令,该存储器操作的执行次序基于第一处理器ISA的硬件存储器模型而被约束。例如,如果方法200正在计算机系统101处被执行,则代码输入组件108a可以获取(多个)源可执行文件106,并且标识(多个)那些可执行文件中的一个或多个处理器指令块。类似地,如果方法200正在计算机系统110处被执行,则在转换组件111处的对应代码输入组件可以获取(多个)源可执行文件106(例如,其自己的本地存储装置,或从计算机系统101)并标识(多个)那些可执行文件中的一个或多个处理器指令块。
方法200还包括对(多个)块执行一种或多种分析以标识存储器操作的可排序性的动作202。在一些实施例中,动作202可以包括对一个或多个处理器指令块执行一种或多种类型的分析,以确定由一个或多个处理器指令块执行的一个或多个存储器操作的可排序性。例如,如果方法200正在计算机系统101处被执行,则静态分析组件108b和/或运行时分析组件108c之一或两者可以对一个或多个处理器指令块执行一种或多种分析。类似地,如果方法200正在计算机系统110处被执行,则转换组件111处的(多个)对应分析组件可以对指令执行一种或多种分析。在下文中描述了一些可能分析的特定示例。
方法200还包括动作203:基于分析,确定存储器操作能够在第二ISA的第二存储器模型中是无序的(unordered)。在一些实施例中,动作203可以包括:基于对一个或多个处理器指令块的分析,确定至少一个指令的存储器操作能够被使得在第二处理器ISA的硬件存储器模型中与次序无关。例如,即使在第一ISA中可以对存储器操作进行排序,分析也可以确定其实际上能够在第二ISA中是无序的。例如,这可能是因为第二ISA具有比第一ISA更弱的存储器模型,和/或因为分析确定了存储器操作对同步变量之外的数据(例如,线程本地数据或纯数据,讨论如下)进行操作。
方法200还包括动作204:在第二ISA中发出一个或多个无屏障指令,该一个或多个无屏障指令在没有排序约束的情况下执行存储器操作。在一些实施例中,动作204可以包括:基于该确定,发出根据第二处理器ISA被格式化的一个或多个无屏障处理器指令,该一个或多个无屏障处理器指令被构造为在没有排序约束的情况下执行存储器操作。例如,计算机系统可以从可用操作中选择不受排序约束的一个或多个版本(而不是受约束的版本),或者可以选择省略在没有分析时通常被发出的存储器屏障或阻碍。
对比而言,方法200还可以包括:确定一个或多个处理器指令块中的另一指令的另一存储器操作不能被使得在第二处理器ISA的硬件存储器模型中与次序无关,以及发出根据第二处理器ISA被格式化的一个或多个被屏障处理器指令,该一个或多个被屏障处理器指令被构造为在具有排序约束的情况下执行该另一存储器操作。在该实例中,计算机系统可以从可用操作中选择受排序约束的一个或多个版本(而不是不受约束的版本),或者可以选择发出存储器屏障或障碍(例如,与一个或多个正常不受约束的操作相关地)。
值得注意的是,尽管这些动作可以在单个计算机系统处被执行,但是其也可以跨多于一个的计算机系统(例如,计算机系统101和计算机系统110)被执行。例如,如上文所讨论的,计算机系统101可以将可执行文件和/或代码块提交给计算机系统110以进行分析,并且其可以执行上述动作中的一个或多个动作,而其他动作在计算机系统101处被执行。
如所提及的,各种类型的分析可以被用作静态分析和/或运行时分析的一部分。一般地,这些分析可以被划分为两个类别——确定存储器访问是否针对线程本地数据的那些分析和确定存储器访问是否针对纯数据的那些分析(即,同步变量之外的变量或数据结构)。在每个类别下都可能存在各种启发法。
用于标识对线程本地数据的访问的分析
一个系列的启发法是基于发明人的以下观察:对线程的本地数据的存储器访问不需要跨线程或处理器被排序。如此,可以使用各种启发法来确定存储器访问是否是针对线程本地数据的。
堆栈存储器位置
线程的堆栈存储器通常不与任何其他线程共享。因此,发明人已经认识到,访问当前线程的堆栈存储器的存储器操作对于该线程将是本地的,并且通常不需要跨线程或处理器被排序。因此,实施例包括一个或多个启发法,其确定存储器操作是否包括对线程的堆栈存储器的线程本地存储器访问。
作为初步事项,并且为了有利于对这些概念的理解,图3图示了示例存储器布局300,该示例存储器布局300通常对应于针对x86架构被编译的过程的可能存储器布局。应当理解,存储器布局300仅是一个示例,并且可以取决于处理器ISA、操作系统和/或编程语言而变化。因此,其他存储器布局可以将不同的数据段放置在不同的位置、包括附加的数据段、省略所示出的数据段中的一些数据段等等。
最初,存储器布局300示出虚拟布局301,该虚拟布局301图示了过程的存储器空间的整体视图。本领域技术人员将认识到,虚拟布局301通常不对应于可用存储器(例如,系统存储器102)的实际物理布局,而是表示(例如,通过虚拟存储器管理技术)由操作系统呈现给过程的存储器的虚拟视图。如图所示,虚拟布局301包括从“低”地址(例如,在32位系统中以0x00000000开始)到“高”地址(例如,在32位系统中以0xffffffff结束,其总计为4GiB的虚拟可寻址存储器)的存储器地址。
在低地址处开始,虚拟布局301包括文本段302,其通常也被称为“代码段”。文本段302通常存储虚拟布局301所对应的过程的实际代码——即,被执行以形成过程的(多个)线程的程序的硬件处理器指令。接下来,虚拟布局301包括初始化的数据段303,其通常也被称为“数据段”。初始化的数据段303通常存储全局变量和静态变量,如在程序代码中被初始化的。接下来,是未初始化的数据段304,其通常被称为BSS(或“由段初始化的块”)。未初始化的数据段304通常存储被初始化为零或在源代码中没有显式初始化的全局变量和静态变量。本文的实施例认为初始化的数据段303和/或未初始化的数据段304通常包括由线程共享的存储器。
未初始化的数据段303之后是被称为堆305的可动态调整大小的段。如图所示,在虚拟布局301中,堆305在未初始化的数据段304的结束处开始,并朝着更大的地址增长。堆305是过程中的(多个)线程可以被动态地分配存储空间的地方。因此,本文的实施例可以认为堆305通常包括由线程共享的存储器。
在未分配的存储器的部分之后是另一可动态调整大小的段,其被称为堆栈段306,该堆栈段可以包括一个或多个堆栈——每个堆栈对应于过程中的不同线程。因此,如果该过程是单线程的,则堆栈段306通常将包含单个堆栈。所描绘的堆栈段306包括三个堆栈(306a、306b和306c),这指示该过程包括三个线程。堆栈是后入先出(LIFO)结构,其中存储动态分配的变量以及每次函数被调用时保存的其他信息。如图所示,在虚拟布局301中,堆栈段306(以及每个个体堆栈)朝向堆305增长通过未分配的存储器到达较小地址。当堆栈段306包括多个堆栈时,每个个体堆栈通常被分配一个定义的存储器块(例如,通常以个位数的兆字节块为阶,诸如WINDOWS中的1MiB或LINUX中的8MiB)。
存储器布局300还包括存储器段307,其表示堆栈306c的简化概览。如图所示,堆栈306c包括多个堆栈帧(frame)(308a和308b)。每次函数的实例被调用时,新的堆栈帧都会被添加到堆栈,并在实例完成时被移除。一般地,函数将新的值“推送”到其堆栈帧上,并在这些值不再被需要时将这些值“弹出”。因此,函数的堆栈帧可以随着其对应的函数执行而动态增长和收缩。当函数完成时,其整个堆栈帧从堆栈中被“弹出”,并且先前的堆栈帧变为活动的。为了有利于此,在调用函数之前,调用函数通常在其堆栈帧上放置返回地址(即,当与该帧相对应的函数完成时要返回的地方)以及某些环境信息,诸如用于调用器的一些处理器寄存器值。
尽管(为简单起见)图3省略了堆栈中典型的一些元素,但图3确实示出了被用来标识当前堆栈帧的一些元素,并且这些元素与用于标识对线程本地存储器的存储器访问特别相关。最初,大多数处理器都包括“帧指针”寄存器,其存储当前堆栈帧的基址的存储器地址(并且通常被称为“指向”当前堆栈帧的基址)。例如,在x86ISA中,这是扩展基址指针(EBP)寄存器。因此,图3示出了帧指针(FP)309,其存储与帧308b的第一入口相对应的存储器地址。如图所示,该入口还存储先前帧308a的基址地址(即,该入口内的“FP-A”符号)。新调用的函数通常在堆栈上在该基址入口之后为其本地变量分配空间。因此,这些本地变量通常使用与FP 309的偏移而在机器代码中被引用(例如,EBP减去x86 ISA中的某个整数,其中堆栈通常向更小的地址增长)。
另外,大多数处理器还包括指向当前堆栈帧的“顶部”的“堆栈指针”寄存器。例如,在x86 ISA中,这是扩展堆栈指针(ESP)寄存器。因此,图3示出了堆栈指针(SP)310,其存储与帧308b的最后入口相对应的存储器地址(例如,将数据“推送”到堆栈中的最后地址)。堆栈上的位置通常使用与SP 310的偏移而在机器代码中被引用(例如,ESP加上x86 ISA中的某个整数,其中堆栈通常向更小的地址增长)。
存储器段307'图示了当函数被调用时FP 309和SP 310会发生什么。特别地,存储器段307'包括对应于该函数的新的堆栈帧308c。堆栈帧308c的第一入口(其可以是在SP310所指向的先前入口之后的一个入口)存储先前堆栈帧(即FP-B)的基址地址。新的堆栈指针(如用SP 310'所指示)和新的帧指针(如用FP 309'所指示)都用该第一入口的地址而被更新。因此,在x86 ISA中,用于创建新的堆栈帧的通用机器指令模式是:
PUSH EBP
MOV EBP,ESP
在该“函数序言”中,“PUSH EBP”指令将FP 309的值(EBP)放置到由SP 310所指向的堆栈入口(ESP)之后的堆栈入口中,并更新堆栈指针SP 310'(ESP)以指向此新入口。“MOVEBP,ESP”指令将新SP 310'的值(ESP)放置到新FP 309'(EBP)中。从这里开始,新调用的函数通常将其本地变量和其他数据“推送”到堆栈上,从而使SP 310'从FP 309'发散(diverge)(例如,如存储器段307的堆栈帧308b中的情况那样)。
在一些实施例中,如果存储器操作使用了来自被启发法标识为“堆栈得出的”寄存器的值,则该存储器操作被确定为访问堆栈存储器。例如,在一些情形中,如果存储器地址是从堆栈指针寄存器310和/或帧指针寄存器309获取的,则该存储器地址很可能位于线程的堆栈上。因此,在许多情形中,这些寄存器中的一个或两个都可以被认为是堆栈得出的。如下所述,紧跟在函数序言之后尤其如此。基于堆栈得出的寄存器获取其值的寄存器也可以被分类为是堆栈得出的。实施例可以采用数据流分析技术来在数据流经各种寄存器时跟踪数据,以确定每个寄存器在每个步骤中是否仍然是堆栈得出的。
稍后给出用于确定寄存器是否是堆栈得出的详细启发法。然而,作为总体概述,图4图示了方法400的示例,方法400用于将寄存器分类为“堆栈得出的”(即,其值是线程本地的,因此基于其值的任何存储器访问可以是无序的)或“全局的”(即,其值并不已知是线程本地的,因此基于其值的任何存储器访问可以是有序的),包括跟踪数据流。该方法400可以例如作为方法200的动作202的一部分由静态分析组件108b和/或运行时分析组件108c来执行。一般地,方法400保持了标识哪些通用处理器寄存器(例如,x86中的EAX、EBX、ECX、EDX、EDI、ESI、ESP、EBP等)是堆栈得出的或是全局的数据。虽然非通用寄存器(例如,在x86扩展中找到的那些,诸如X87、MMX、SSE、AVX等)也可以被跟踪,但其通常不包含指针,并且因此这样做可能会引入不必要的开销。
方法400在一个或多个块上进行操作,诸如在方法200的动作201中由代码输入组件108a所标识的那些块。因此,如图所示,方法400通过获取一个或多个处理器指令块来开始(动作401)。然后,方法400初始化寄存器分类状态(动作402)。例如,保守的实现可以将每个被跟踪的寄存器都初始化为“全局的”。然而,作为例外,较激进的实现动作402可以将堆栈指针寄存器310初始化为堆栈得出的状态,而不是全局的状态。其他更激进的实现可以完全省略对堆栈指针寄存器310的分类进行跟踪(即,始终认为其是堆栈得出的),这以更大风险的执行正确性问题为代价换取增加的性能。其他实现可以跟踪对堆栈指针寄存器310的分类,但是针对直接依赖于堆栈指针寄存器310的访问发出(多个)无障碍指令,即使堆栈指针寄存器310被分类为全局的。
接下来,在动作403处,方法400标识块中的(多个)“下一”指令。该“下一”可以立即被分析,也可以被放置在指令队列中。如果这是动作403的第一次迭代(并且指令尚未被分析),则通常将选择在该块的(多个)入口点之一处的指令。否则,“下一”指令的身份可能会基于先前指令而不同。如果先前指令不是分支指令(例如,x86中的“MOV EAX,1”),那么“下一”指令可以被定义为在(多个)块中包含的指令流中的先前指令之后出现的指令。如果先前指令是无条件分支指令(例如x86中的“JMP 0x1234”),那么“下一”指令可以被定义为分支的目标处的指令(例如地址0x1234处的指令)。如果先前指令是条件分支指令(例如x86中的“JE 0x1234”),那么可能存在两个“下一”指令:分支的目标处的指令(例如0x1234处的指令)和在指令流中的先前指令之后出现的指令。在一些实施例中,如果多于一个的指令被标识,则动作403可以选择其中的一个,并且将另一个进行排队,以供以后分析;然而,动作403也可以将两个指令都进行排队。
在动作404处,方法400针对动作403中标识的(多个)“下一”指令来更新寄存器分类。特别地,动作404采取针对当前指令的寄存器分类(或者如果“下一”指令是被分析的第一个指令——例如,块的入口点,则采取在动作402中做出的初始分类),并且基于那些分类确定在每个“下一”指令的入口处如何变换每个寄存器的分类(如果有必要的话)。当确定如何变换针对指令的入口的寄存器分类时,动作404可以应用各种启发法中的一种或多种启发法。这些将在后面进行更详细的讨论,但是在一些实施例中,如果(a)指令的执行可能使寄存器包含指向堆栈的指针,并且指向堆栈的指针不太可能已经“逸出”(escape)线程,那么动作404通常确定寄存器变为堆栈得出的。相反,如果(b)指令的执行可能导致除(a)以外的任何情况,那么动作404可以确定寄存器变为全局的。
在一些实现中,方法400为块中的每个指令维持寄存器分类数据,诸如针对每个指令的单独的数组结构或列表。因此,在这些实现中,动作404可以将通过对先前指令的分析而生成的数组或列表作为输入,并且基于当前指令的执行来产生经变换的数组或列表作为输出。
如图所示,动作403和404可以重复直到不再有要考虑的“下一”指令为止。注意,取决于分析的激进性,该块中的一些指令可以被分析多于一次。例如,如果该块包含循环,则该循环中的指令可以被考虑多次。方法400可以基于诸如以下各项来确定何时停止分析循环:循环自然地完成,执行循环的定义次数的迭代,寄存器分类状态随着循环的迭代而达到稳定状态等等。
例如,当执行对作为循环的一部分的指令的后续分析时,动作404可以检查针对该指令的已经定义的寄存器分类是否与来自先前指令的传入分类相同(例如,与该指令相关联的先前生成的数组是否与通过对先前指令的分析所生成的输出数组相同)。如果其相同,则此分析的分支可以终止。如果其不同,则可以将指令的分类与传入分类合并。例如,如果使用每个指令的数组,并且如果在任一指令的数组中寄存器都被分类为全局的,则在当前指令的数组中寄存器被调整以被分类为全局的;否则,当前指令的数组中的寄存器仍然被分类为堆栈得出的。
如所提及的,存在可以在动作404中被执行的各种启发法。要被使用的特定启发法可以基于以下而不同:基于方法400正被静态分析组件108b还是被运行时分析组件108c执行(即,静态分析可以执行比运行时分析更多数目和/或更复杂的启发法)、基于(多个)处理器处的当前负载、基于计算机系统101处的当前能量可用性(例如,剩余电池容量、耗能率、电力可用性等)等等。
一些实现包括一种或多种启发法,其被设计为回答以下问题:给定一个寄存器,该寄存器的状态是堆栈得出的或全局的,则从该寄存器得出的值是否也是堆栈得出的?不同的启发法可以基于如何从寄存器中得出该值来回答该问题。因此,以下是可以被用来回答此问题的一些启发法。这些示例不被认为是详尽的,并且由于这些是启发法,因此备选实现可以基于与给出的那些理由不同的理由而做出不同的决策。
第一启发法可以对值应用与从其中获取该值的寄存器相同的分类。因此,如果寄存器是堆栈得出的,那么这些启发法也可以认为该寄存器的值是堆栈得出的。在一些实现中,这可能意味着:(i)对寄存器中的地址的存储器访问可能是堆栈得出的,并且指令可能不需要排序。为了说明,如果ECX寄存器已被分类为堆栈得出的,则x86指令“MOV[ECX],EAX”(其将被存储在EAX寄存器中的值放置到被存储在ECX寄存器中的存储器位置中)可能不需要排序。类似地,如果ECX是全局的,那么存储器访问将是全局的(并且将需要排序)。这也可能意味着:(ii)将堆栈得出的寄存器复制到目的地寄存器的指令使目标寄存器也变为堆栈得出的。为了说明,如果ECX寄存器已被分类为堆栈得出的,则x86指令“MOV EDX,ECX”(其将被存储在ECX寄存器中的值放置到EDX寄存器中)使EDX变为堆栈得出的。类似地,如果ECX是全局的,那么EDX也将变为全局的。
第二启发法可以在寄存器被设置为常数值的情况下将寄存器分类为全局的。因此,不管寄存器是堆栈得出的还是全局的,如果其被指派了新的常数值,则这些启发法可以将其标记为全局的。例如,x86指令“MOV ECX,0xABADCAFE”(其将常数值0xABADCAFE放置到ECX寄存器中)将使用这些启发法使ECX成为全局的。这是因为,该常数值是否对应于堆栈存储器位置可能不是已知的。但是,备选实现可以确定常数值是否指向堆栈,并且如果是,则将寄存器标记为堆栈得出的。
第三启发法可以在值是将全局的值(例如,来自被分类为全局的寄存器中的值)与堆栈得出的值(例如,来自被分类为堆栈得出的寄存器中的值)相加的结果的情况下,将该值分类为堆栈得出的。这些启发法基于以下观察而被构建:如果程序将全局值与堆栈得出的值相加,则很可能会将堆栈得出的值与指针偏移相加以生成堆栈得出的值。例如,如果一个寄存器是全局的,并且另一寄存器是堆栈得出的,那么使用这些启发法:(i)对作为两个寄存器之和的地址的存储器访问很可能是堆栈得出的值。例如,如果ESI是全局的并且ECX是堆栈得出的,则x86指令“MOV[ESI+ECX],EAX”(其将被存储在EAX寄存器中的值放置到由ESI和ECX寄存器中的值之和所寻址的存储器位置中)可能针对存储器地址使用堆栈得出的值(反之亦然)。此外,使用这些启发法:(ii)将两个寄存器相加的指令使目的地寄存器变为堆栈得出的。例如,如果ESI是全局的并且ECX是堆栈得出的,则x86指令“ADD ESI,ECX”(其将ESI和ECX寄存器中的值相加并将总和放置到ESI寄存器中)使ESI变为堆栈得出的(或相反亦然)。表1中总结了用于在加上或减去寄存器的值时应用这些启发法的一些通用化准则。
表1
第四启发法可以得出结论:如果“相对小的”常数与堆栈衍生的值相加或从堆栈衍生的值中被减去,则结果将很可能仍是堆栈得出的。例如,如果寄存器是堆栈得出的,那么使用这些启发法:(i)对存储器中存储的地址的存储器访问加上相对小的常数(例如4)将很可能是堆栈得出的。例如,如果ECX已经是堆栈得出的,则x86指令“MOV[ECX+4],EAX”(其将被存储在EAX寄存器中的值放置到通过将ECX寄存器的值加4而获取的存储位置中)很可能使用堆栈上的地址。另外,如果寄存器是堆栈得出的,那么使用这些启发法:(ii)将寄存器加上相对小的常数(例如4)的指令将保持寄存器是堆栈得出的。例如,如果ECX先前是堆栈得出的,则x86指令“ADD ECX,4”(其将ECX的值加4,并将结果存储在ECX中)或“LEA ECX,[ECX+4]”(其执行相同的动作但不更新标志寄存器,EFLAGS)都将使ECX保留为堆栈得出的。
然而,如所提及的,堆栈是有限大小的,因此将堆栈得出的值加上较大常数或从堆栈得出的值中减去较大常数的结果将不太可能仍然指向堆栈。如此,实施例可以应用一些阈值大小,在该阈值大小处,不再将该常数视为“相对小的”。所使用的特定阈值可以取决于实现而不同,但是作为示例,此阈值可以是常规堆栈大小限制的某个分数(例如,如果堆栈通常限于最大1MiB,则该阈值或许可能被定义为2^14(16KiB))。表2中总结了用于将寄存器的值加上或减去小的常数的一些通用化准则。
寄存器值 | 常数 | 结果 |
堆栈得出的 | 小 | 堆栈得出的 |
堆栈得出的 | 大 | 全局的 |
全局的 | 无所谓 | 全局的 |
表2
第五启发法可以基于对堆栈得出的值的按位操作来更新分类。例如,如果指令修改了值的“低”位,则其具有与加上或减去小的值相似的效果。“低”的定义可以基于实现而不同。一些实现可以将其与被用来定义“相对较小”的阈值常数值相匹配。因此,仅作为示例,如果该阈值是2^14(如上),则通过将“低”定义为值的较低14位,“低”位的定义可以与阈值匹配。作为示例,表3概述了:假设在每次操作之前寄存器REG1被分类为堆栈得出的且寄存器REG2被分类为全局,在寄存器REG1和寄存器REG2上的按位操作的一些可能结果。
表3
第六启发法可以在寄存器的值被破坏性地改变的情况下将寄存器分类为全局寄存器。例如,如果操作以急剧的方式改变了堆栈得出的寄存器,并且关于被放置在寄存器中的值都是未知的,则一些实施例将寄存器分类为全局的。为了清楚起见,表4示出了使用x86指令和寄存器的一些非限制性示例。
表4
不管寄存器是全局的还是堆栈得出的,第七启发法可以在来自存储器的值被加载到寄存器中的情况下将寄存器分类为全局的。例如,对于x86指令“MOV ECX,[EAX]”(其将来自EAX的值所寻址的存储器位置中的值放置到ECX中),这些启发法可以使ECX成为全局的,而不管EAX是堆栈得出的还是全局的。这是因为被存储在存储器位置(即使该存储器位置在堆栈上)处的值是否对应于基于堆栈的存储器地址通常不是已知的。但是,类似于第二启发法(即,将寄存器设置为常数值),实现可以确定被存储在存储器位置处的值是否指向堆栈,并且如果是,则将该寄存器(例如,上例中的ECX)标记为堆栈得出的。
第八启发法可以在堆栈得出的值被存储在全局地址中的情况下,将所有寄存器分类设置为全局的。这是因为,指向堆栈的指针正被发布(即,与另一线程共享)是可能的。如上面的动作404中可以确定的,这是指向堆栈的指针如何可能已经“逸出”线程。当指向堆栈的指针逸出线程时,所有未来的对堆栈的访问都可能要求同步以正确执行。结果,在这发生时,这些启发法将所有寄存器分类为全局的。为了进一步说明这些概念,表5呈现了对x86指令序列的分析,假设ECX和ESP开始为堆栈得出的,并且ESI是全局的。
表5
第九启发法可以考虑作用于少于整个寄存器的操作(即,子寄存器操作)。例如,x86指令“ADD CH,4”或“ADD CL,4”仅操纵ECX寄存器的一部分。当发生子寄存器操作时,启发法可以采取几种方法。保守的方法可以将正被操作的寄存器标记为全局的(即,例如,当执行前述操作时,ECX寄存器变为全局的)。一种备选方法可以将操作视为加上或减去一个相对小的常数(类似于第四启发法),或视为对“低”值的按位操作(类似于第五启发法)。因此,例如,取决于所使用的阈值,“ADD CH,4”指令可能会修改一些“高”位(类似于在第四和第五启发法中高于阈值的),因此该启发法可能将ECX转变为全局的。但是,“ADD CL,4”可以仅修改“低”位,因此,如果ECX先前是堆栈得出的,则启发法可能允许其保持堆栈得出的。
最后,第十启发法检测函数序言。由于先前描述的启发法和/或在块的开始处,所有寄存器都可以被认为是全局的(例如,因为其在动作402中被初始化为全局的,或者其被一种或多种其他启发法分类为全局的)。在这些情形下,需要有一种或多种启发法可以将寄存器转变为堆栈得出的,否则就没有机会省略存储器排序(即,选择发出无屏障指令)。因此,如果观察到可能的函数序言的一部分(以上结合图3所述)和/或本地变量分配,则第十启发法会将堆栈指针寄存器310转变为堆栈得出的。
例如,如果在x86代码中观察到“PUSH EBP”和“MOV EBP,ESP”的序列(即,函数序言),则将EBP(帧指针寄存器309)和ESP(堆栈指针寄存器310)分类为堆栈得出通常是安全的。更具体地,在PUSH指令之前,将ESP分类为堆栈得出通常是安全的,并且在MOV指令之后,将EBP分类为堆栈得出通常也是安全的。附加地或备选地,如果从堆栈指针寄存器310中减去一个小的非零数(例如,x86中的“SUB ESP,0x10”),则将堆栈指针寄存器310(例如,ESP)分类为堆栈得出可能是安全的,因为此指令可能将堆栈上的空间分配用于本地变量。
前述启发法可用于标识寄存器(或值)是堆栈得出的还是全局的,然后代码生成组件108d可使用该信息来在不同的处理器ISA中生成新的代码指令,包括:在不需要排序时发出无屏障指令(例如,因为操作对已被分类为堆栈得出的并且因此是线程本地的寄存器或值进行操作),或者在仍需要排序时发出被屏障指令(例如,因为操作对被分类为全局的并且因此不是已知为线程本地的寄存器或值进行操作)。
为了有利于对这是如何操作的进一步理解,图5图示了基于使用图4的过程400的寄存器分类以及基于上述的某些启发法将x86代码指令转换为对应的ARM代码指令的示例。ARM指令被标记为“简化的”,因为其省略了对于理解本发明是不必要的一些计算(例如,EFLAGS)。
最初,x86指令的第1行和第2行对应于典型的x86函数序言,并且因此ESP在PUSH指令的入口点处被分类为堆栈得出的寄存器,并且EBP在MOV指令之后被分类为堆栈得出的寄存器(即,按第十启发法)。另外,第3行将堆栈上的空间分配用于本地变量(即,从ESP中减去一个小的值),进一步证明这是函数的开始。第1行中的PUSH操作是存储器访问(即,将EBP的值放置在堆栈上)。然而,由于ESP被分类为堆栈得出的寄存器,所以代码生成组件108d可以发出无屏障ARM指令(即,“str wfp,[x28,#-4]!”)。如图所示,如果PUSH指令是可排序的,则代码生成组件108d可能已经发出了屏障“dmb ishst”(或类似的),但是由于寄存器分类,其已能够被省略。
接下来,由于第4行,寄存器分类发生变化,其中ESP的值被放置在EDI中。由于ESP是堆栈得出的,并且EDI现在具有其值,因此EDI现在可以在第5行中的指令的入口点处被分类为堆栈得出的(即,按第一启发法)。
出于相同的原因,由于第5行,EAX也变为堆栈得出的。然后,在第6行处,将常数8与EAX的值相加,并将结果存储在EAX中。由于EAX已经是堆栈得出的,并且由于其是要与其中的小的常数相加,因此其仍然是堆栈得出的(即,按第四启发法)。
在第7行处,常数10被放置在ECX中。其之前已被标记为全局的,但是无论如何其都保持是全局的,因为其已被设置为常数值(按第二启发法)。
第8行包括标签(LoopTop),该标签稍后将被用于跳转指令(行14)。其移动指令将值1放置到EAX中存储的存储器位置中。这本身并不会改变EAX的状态,并且一些实现可能会针对循环的第一次迭代而将其视为堆栈得出的。但是,由于第9行,其将变为全局的(按第四启发法,其中大的常数与其值相加),并针对循环的以后迭代而保持为全局的。因此,保守的方法可能在循环的所有迭代期间将其标记为全局的。如此,其被示出为在第8行和第9行处的堆栈得出的寄存器列表中被剔除。由于EAX是全局的,因此代码生成组件108d发出被屏障ARM指令以执行存储器操作(即,包括屏障“dmb ishst”的指令)。备选地,针对第8行的第一实例可以发出无屏障ARM指令,并且针对随后的实例发出被屏障指令。
在第10行处,将值2放置到EDI中存储的位置中。这不会影响其分类。由于EDI在循环之前是堆栈得出的,并且每次在第11行中都仅与小的常数(4)相加,因此EDI可以在整个循环中保持为堆栈得出的(按第四启发法)。如此,代码生成组件108d发出无屏障ARM指令(即,缺少“dmb ishst”屏障)。
在第12行中,从ECX中减去常数1,在第13行中,将其值与零进行比较,并且如果比较不等于零,则在第14行中,执行跳转到LoopTop(第8行)。在执行这些指令之前,ECX是全局的,并且保持如此。
在循环之后,在第15行中,由EAX所指向的存储器位置的值被放置在EBX中。由于第9行,EAX变为全局的,因此代码生成组件108d可以发出被屏障ARM指令(即,包括“dmbishld”屏障)。由于EBX从存储器中接收值,因此其保持是全局的(按启发法7)。
最后,在第16行中,由EDI所指向的存储器位置的值被放置在ECX中。由于EDI在循环之后保持是堆栈得出的,因此其正在访问堆栈存储器,并且代码生成组件108d可以发出无屏障ARM指令(即,排除“dmb ishld”屏障)。由于ECX从存储器中接收值,因此其保持为全局的(按启发法7)。
其他线程本地访问
一些架构和/或操作系统可以提供其他机制,这些机制可以被用来确定存储器访问针对线程本地的数据。任何这样的机制都落在本发明的范围内,对线程本地存储器位置的任何访问都可以被生成为无屏障指令。
例如,在x86处理器上执行的WINDOWS操作系统创建每个线程的线程信息块(TIB),其也被称为线程环境块(TEB)。TIB包含关于线程的信息,包括线程本地存储的部分。由于线程的TIB中的任何存储器位置都不太可能与另一线程共享,因此通常可以将对线程的TIB的访问视为线程本地的,并且可以将对那些存储器位置的访问生成为无屏障指令。通常基于与x86段寄存器的偏移来访问线程的TIB中的数据(例如,如32位处理器中的FS段超越(override)前缀或64位处理器中的GS所指的)。例如,用于访问线程的TIB的x86指令可能类似于:
MOV EAX,DWORD PTR FS:[0x24]
用于标识对纯数据的访问的分析
程序可能不依赖于对纯数据的存储器访问的相对排序。例如,其可能不依赖于将屏幕外缓冲器中的第一像素写入到第二像素之前或是之后。相反,其通常将依赖于对被存储在堆305、初始化的数据段303等中的诸如布尔值(例如,“FinishedWritingPixels”)之类的同步变量的访问以及对诸如纯数据(例如,那些像素)之类的非同步变量的访问的相对排序。因此,另一系列的启发法基于发明人的以下观察:对某些非线程本地数据(例如,堆305上的数据结构,视频存储器等)的一些访问也可以被视为无序的。特别地,一些数据访问模式可以通知:线程正在访问同步变量之外的纯数据。尽管下面给出了两个示例,但是用于标识对纯数据的访问的任何机制都落入本发明的范围内,对纯数据的任何这种访问可能能够被生成为无屏障指令。
重复字符串操作
例如,针对被显式地标记为重复的字符串操作生成无屏障指令可以是可能的。一些ISA包含用于操纵字符串或其他缓冲器的指令,并且这些指令可以成为用于标识纯数据并生成无屏障指令的基础。尽管这些原理可能也适用于其他ISA,但是x86架构现在被用来说明这些概念。
x86“MOVSD”指令将ESI寄存器所指向的4字节复制到EDI寄存器所指向的存储器位置。然后其将4加到ESI并且将4加到EDI。现在,假设x86程序包含五个紧接的MOVSD指令:
MOVSD
MOVSD
MOVSD
MOVSD
MOVSD
x86 ISA通过定义“REP”前缀来通知这种重复操作,从而使其更简单。因此,使用“REP”前缀来重新表达这些指令是可能的,其在概念上在循环中运行MOVSD指令。ECX寄存器指定循环执行的次数。如此,五个MOVSD指令可以被表达为:
MOV ECX,5
REP MOVSD
一些实现将针对由“REP MOVSD”执行的5个加载中的每个加载以及5个存储中的每个存储生成无屏障指令。这是因为,如果程序正在使用重复的字符串操作,则可能复制纯数据(例如,以实现C“memcpy”函数)。因此,某些数据包括同步变量是不太可能的。
x86 ISA的特征为针对REP的优化——被称为快速字符串操作——其中个体存储是显式地无序的。如果使用快速字符串操作的程序员假设重复存储是无序的,则其可能还假设重复加载也是无序的,并且对于同步而言将不依赖于加载。因此,与快速字符串操作有关的存储器操作也可以被视为无序的。
循环计数器得出的存储器访问(即,大数据缓冲器)
另外,检测迭代遍历大数据缓冲器的循环可以是可能的。如果检测到这些循环,则一些实施例假设对缓冲器的个体访问不需要相对于彼此被排序。这样的缓冲器可以是图像中的像素、音频数据、字符串或不包含同步值的任何其他数据。
例如,图6示出了一些注解的x86代码,其中,对于ESI所指向的缓冲器(例如,第7行)中的每个4字节值(例如,第43行),代码操纵加载的值(例如,第13行),并将新的值写入EDI所指向的缓冲器(例如,第20行)中。ECX包含循环计数器(例如,第4、17和44行)。如果该循环执行将被定义为“大”的阈值次数(例如1000次),则可以合理地推断出该循环正在操纵大的数据缓冲器。例如,循环不太可能正在操纵这样的数据结构的数组:其中每个数据结构包含至少一个同步变量。该循环也不太可能正在一千个同步变量上用另一线程来实现无锁编程逻辑。
因此,如果循环执行较大的次数,则循环计数器得出的访问(例如,第7和23行)最有可能是对数据缓冲器的访问,并且在一些实施例中可能能够针对这些操作发出无屏障指令。相反,如果指令访问不是循环计数器得出的地址——即使其执行的次数等于循环迭代的次数或与之成比例——则该指令不太可能迭代遍历数据缓冲器。相反,其可能正在访问同步变量,并且在一些实施例中针对这些指令可能需要发出被屏障指令(例如,第28行)。
因此,本文所描述的实施例提供了各种机制以确定在第一ISA中被排序的处理器指令是否可以被转换为第二ISA中的(多个)无屏障指令。这可以显著提高被转换代码的执行性能,并且可以能够减少整体代码大小。
尽管已经用特定于结构特征和/或方法动作的语言描述了主题,但是应该理解,所附权利要求书中定义的主题不必限于上面描述的特征或动作,或上述动作的次序。而是,所描述的特征和动作被公开为实现权利要求的示例形式。
在不脱离本发明的精神或基本特性的情况下,本发明可以以其他特定形式来体现。所描述的实施例在所有方面仅被认为是说明性的而非限制性的。因此,本发明的范围由所附权利要求书而不是前述描述来指示。落入权利要求等同含义和范围内的所有改变均应被包含在其范围之内。
Claims (15)
1.一种在包括一个或多个处理器的计算机系统上实现的用于当在指令集架构(ISA)之间转换处理器指令时减少被屏障指令的发出的方法,所述方法包括:
获取根据第一处理器ISA被格式化的一个或多个处理器指令块,所述一个或多个处理器指令块包括执行存储器操作的至少一个指令,所述存储器操作的执行次序基于所述第一处理器ISA的硬件存储器模型而被约束;
基于对所述一个或多个处理器指令块的分析,确定所述至少一个指令的所述存储器操作能够被使得在第二处理器ISA的硬件存储器模型中与次序无关;以及
基于所述确定,发出根据所述第二处理器ISA被格式化的一个或多个无屏障处理器指令,所述一个或多个无屏障处理器指令被构造为在没有排序约束的情况下执行所述存储器操作。
2.根据权利要求1所述的方法,还包括:
基于所述分析,确定所述一个或多个处理器指令块中的另一指令的另一存储器操作不能被使得在第二处理器ISA的所述硬件存储器模型中与次序无关;以及
基于所述确定,发出根据所述第二处理器ISA被格式化的一个或多个被屏障处理器指令,所述一个或多个被屏障处理器指令被构造为在具有排序约束的情况下执行所述另一存储器操作。
3.根据权利要求2所述的方法,其中发出一个或多个被屏障处理器指令包括:发出执行所述另一存储器操作的一个或多个第一指令以及强制实施所述排序约束的一个或多个第二指令。
4.根据权利要求3所述的方法,其中所述第二指令中的至少一个第二指令在所述第一指令中的至少一个第一指令之前被发出。
5.根据权利要求1所述的方法,其中所述分析的至少一部分在所述计算机系统处被执行。
6.根据权利要求1所述的方法,其中所述分析的至少一部分在另一计算机系统处被执行。
7.根据权利要求1所述的方法,其中确定所述至少一个指令的所述存储器操作能够被使得在第二处理器ISA的所述硬件存储器模型中与次序无关包括:确定所述存储器操作访问线程本地数据。
8.根据权利要求7所述的方法,其中基于所述存储器操作使用当前线程的堆栈内的存储器地址,所述存储器操作被确定为访问线程本地数据。
9.根据权利要求7所述的方法,其中基于所述存储器操作使用从堆栈指针寄存器或帧指针寄存器被获取的存储器地址,或者基于所述存储器操作使用从所述堆栈指针寄存器或所述帧指针寄存器被获取的所述存储器地址中得出的值,所述存储器操作被确定为访问线程本地数据。
10.根据权利要求9所述的方法,其中基于以下中的一项或多项,所述存储器操作被确定为使用从所述堆栈指针寄存器或所述帧指针寄存器被获取的所述存储器地址中得出的值:(i)所述值基于在从所述堆栈指针寄存器或所述帧指针寄存器被获取的所述存储器地址上被执行的一个或多个算术或按位操作,或(ii)所述值基于在从所述堆栈指针寄存器或所述帧指针寄存器被获取之后流经一个或多个处理器寄存器的所述存储器地址或所述存储器地址的得出物。
11.根据权利要求7所述的方法,其中基于段超越前缀的使用,所述存储器操作被确定为访问线程本地数据。
12.根据权利要求1所述的方法,其中确定所述至少一个指令的所述存储器操作能够被使得在第二处理器ISA的所述硬件存储器模型中与次序无关包括:确定所述存储器操作是重复加载或存储操作的一部分。
13.根据权利要求1所述的方法,其中确定所述至少一个指令的所述存储器操作能够被使得在第二处理器ISA的所述硬件存储器模型中与次序无关包括:确定所述存储器操作在执行阈值次数的循环内并且基于循环计数器得出的存储器地址。
14.一种计算机系统,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,具有被存储于其上的计算机可执行指令,所述计算机可执行指令由所述一个或多个处理器可执行,以使所述计算机系统当在指令集架构(ISA)之间转换处理器指令时减少被屏障指令的发出,所述计算机可执行指令包括指令,所述指令可执行以使所述计算机系统至少执行以下:
获取根据第一处理器ISA被格式化的一个或多个处理器指令块,所述一个或多个处理器指令块包括执行存储器操作的至少一个指令,所述存储器操作的执行次序基于所述第一处理器ISA的硬件存储器模型而被约束;
对所述一个或多个处理器指令块执行一种或多种类型的分析,以确定由所述一个或多个处理器指令块执行的一个或多个存储器操作的可排序性,所述一种或多种类型的分析包括以下中的一项或多项:堆栈得出的寄存器分析、段超越前缀分析、重复字符串操作分析或循环计数器得出的存储器访问分析;
基于对所述一个或多个处理器指令块执行所述一种或多种类型的分析,确定所述至少一个指令的所述存储器操作能够被使得在第二处理器ISA的硬件存储器模型中与次序无关;以及
基于所述确定,发出根据所述第二处理器ISA被格式化的一个或多个无屏障处理器指令,所述一个或多个无屏障处理器指令被构造为在没有排序约束的情况下执行所述存储器操作。
15.根据权利要求14所述的计算机系统,其中针对所述一个或多个处理器指令块,所述堆栈得出的寄存器分析包括:
初始化寄存器分类状态;以及
针对所述一个或多个处理器指令块中的每个指令,更新所述寄存器分类状态以指示在所述指令的入口处哪个(哪些)寄存器是堆栈得出的。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/784,299 | 2017-10-16 | ||
US15/784,299 US10552131B2 (en) | 2017-10-16 | 2017-10-16 | Barrier reduction during code translation |
PCT/US2018/054902 WO2019079058A1 (en) | 2017-10-16 | 2018-10-09 | BARRIER REDUCTION DURING CODE TRANSLATION |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111279308A true CN111279308A (zh) | 2020-06-12 |
CN111279308B CN111279308B (zh) | 2023-09-26 |
Family
ID=63966143
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880067059.9A Active CN111279308B (zh) | 2017-10-16 | 2018-10-09 | 代码转换期间的屏障减少 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10552131B2 (zh) |
EP (1) | EP3682322A1 (zh) |
CN (1) | CN111279308B (zh) |
WO (1) | WO2019079058A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10884720B2 (en) * | 2018-10-04 | 2021-01-05 | Microsoft Technology Licensing, Llc | Memory ordering annotations for binary emulation |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102707926A (zh) * | 2011-04-07 | 2012-10-03 | 威盛电子股份有限公司 | 可执行x86指令集及ARM指令集指令的微处理器及其运作方法 |
CN103907089A (zh) * | 2011-04-07 | 2014-07-02 | 威盛电子股份有限公司 | 一种乱序执行微处理器中的有条件加载指令 |
US20160313984A1 (en) * | 2015-04-23 | 2016-10-27 | Google Inc. | Compiler for translating between a virtual image processor instruction set architecture (isa) and target hardware having a two-dimensional shift array structure |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5822778A (en) * | 1995-06-07 | 1998-10-13 | Advanced Micro Devices, Inc. | Microprocessor and method of using a segment override prefix instruction field to expand the register file |
US6681385B1 (en) * | 1999-10-07 | 2004-01-20 | Microsoft Corporation | Method and apparatus for determining the relationships and useful lifetime of objects in a program |
US8447961B2 (en) * | 2009-02-18 | 2013-05-21 | Saankhya Labs Pvt Ltd | Mechanism for efficient implementation of software pipelined loops in VLIW processors |
US9304940B2 (en) | 2013-03-15 | 2016-04-05 | Intel Corporation | Processors, methods, and systems to relax synchronization of accesses to shared memory |
-
2017
- 2017-10-16 US US15/784,299 patent/US10552131B2/en active Active
-
2018
- 2018-10-09 CN CN201880067059.9A patent/CN111279308B/zh active Active
- 2018-10-09 WO PCT/US2018/054902 patent/WO2019079058A1/en unknown
- 2018-10-09 EP EP18793134.0A patent/EP3682322A1/en not_active Ceased
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102707926A (zh) * | 2011-04-07 | 2012-10-03 | 威盛电子股份有限公司 | 可执行x86指令集及ARM指令集指令的微处理器及其运作方法 |
CN103907089A (zh) * | 2011-04-07 | 2014-07-02 | 威盛电子股份有限公司 | 一种乱序执行微处理器中的有条件加载指令 |
US20160313984A1 (en) * | 2015-04-23 | 2016-10-27 | Google Inc. | Compiler for translating between a virtual image processor instruction set architecture (isa) and target hardware having a two-dimensional shift array structure |
Also Published As
Publication number | Publication date |
---|---|
US10552131B2 (en) | 2020-02-04 |
EP3682322A1 (en) | 2020-07-22 |
US20190114173A1 (en) | 2019-04-18 |
CN111279308B (zh) | 2023-09-26 |
WO2019079058A1 (en) | 2019-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9696966B2 (en) | Software development tool to automatically generate an optimized executable | |
US7596781B2 (en) | Register-based instruction optimization for facilitating efficient emulation of an instruction stream | |
US8108846B2 (en) | Compiling scalar code for a single instruction multiple data (SIMD) execution engine | |
US9213563B2 (en) | Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation | |
US9524178B2 (en) | Defining an instruction path to be compiled by a just-in-time (JIT) compiler | |
US9529610B2 (en) | Updating compiled native instruction paths | |
US9183018B2 (en) | Dynamic on/off just-in-time compilation in a dynamic translator using instruction code translation | |
US11379195B2 (en) | Memory ordering annotations for binary emulation | |
CN111279308B (zh) | 代码转换期间的屏障减少 | |
US9817669B2 (en) | Computer processor employing explicit operations that support execution of software pipelined loops and a compiler that utilizes such operations for scheduling software pipelined loops | |
US9747238B2 (en) | Computer processor employing split crossbar circuit for operand routing and slot-based organization of functional units | |
US9513921B2 (en) | Computer processor employing temporal addressing for storage of transient operands | |
US9043773B2 (en) | Identification and management of unsafe optimizations | |
US11347506B1 (en) | Memory copy size determining instruction and data transfer instruction | |
Hu | Efficient binary translation in co-designed virtual machines | |
Navarro et al. | A case study of different task implementations for multioutput stages in non-trivial parallel pipeline applications | |
US20150186168A1 (en) | Dedicating processing resources to just-in-time compilers and instruction processors in a dynamic translator | |
Ascott | JavaFlow: a Java DataFlow Machine | |
Georg Grasser | Security improvement in embedded systems via an efficient hardware bound checking architecture | |
Manzano et al. | Code Partition and Overlays: A reintroduction to High Performance Computing |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |