CN116893894A - 同步微线程化 - Google Patents
同步微线程化 Download PDFInfo
- Publication number
- CN116893894A CN116893894A CN202310202498.9A CN202310202498A CN116893894A CN 116893894 A CN116893894 A CN 116893894A CN 202310202498 A CN202310202498 A CN 202310202498A CN 116893894 A CN116893894 A CN 116893894A
- Authority
- CN
- China
- Prior art keywords
- instruction
- symt
- execution
- examples
- micro
- 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
Classifications
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- 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
- G06F9/3016—Decoding the operand specifier, e.g. specifier format
-
- 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/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30065—Loop control instructions; iterative instructions, e.g. LOOP, REPEAT
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/30087—Synchronisation or serialisation instructions
-
- 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/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/3009—Thread control instructions
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5083—Techniques for rebalancing the load in a distributed system
- G06F9/5088—Techniques for rebalancing the load in a distributed system involving task migration
-
- 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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/522—Barrier synchronisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread allocation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本申请公开了同步微线程化。描述了用于使用软屏障提示的技术。示例包括一种同步微线程(SyMT)协处理器,该SyMT协处理器耦合至逻辑处理器,以执行在执行进入SyMT模式的指令时执行多个微线程,其中每个微线程具有独立的寄存器状态,其中,SyMT协处理器进一步用于支持代码中的软屏障提示指令,该软屏障提示指令在由微线程处理时用于:至少部分地基于具有至少一个条目的数据结构来暂停要被重新开始的微线程的执行,该条目包括软屏障提示指令的指令指针以及在该指令指针处已遇到软屏障提示指令的微线程的计数。
Description
背景技术
任务并行性是指不同的程序/任务在多个的计算元件上对不同的数据进行操作。另一方面,数据并行性(Data Parallelism,DP)是指同一程序或指令并行地对不同的数据片进行操作。如果并行操作是以指令粒度的,则它被称为单指令多数据(SingleInstruction Multiple Data,SIMD)。如果并行操作是以程序粒度的,则它被称为单程序多数据(Single Program Multiple Data,SPMD)。SPMD有时也被称为单指令多线程(SingleInstruction Multiple Thread,SIMT)。
附图说明
将参考附图来描述根据本公开的各示例,在这些附图中:
图1是各示例可在其中被实现的计算机系统的示例的框图。
图2图示SyMT支持的示例。
图3图示整数集群的示例。
图4图示向量集群的示例。
图5图示存储器集群的示例。
图6图示微线程状态的示例。
图7图示SyMT状态区域的枚举的示例。
图8图示SyMT使用的示例。
图9图示由处理器执行以处理UTNTR指令的方法的示例。
图10图示用于使用仿真或二进制转译来处理UTNTR指令的方法的示例。
图11图示表示UTNTR指令的执行的伪代码的示例。
图12图示由处理器执行以处理UTRET指令的方法的示例。
图13图示用于使用仿真或二进制转译来处理UTRET指令的方法的示例。
图14图示表示UTRET指令的执行的伪代码的示例。
图15图示由处理器执行以处理UTGETCNTXT指令的方法的示例。
图16图示用于使用仿真或二进制转译来处理UTGETCNTXT指令的方法的示例。
图17图示表示UTGETCNTXT指令的执行的伪代码的示例。
图18图示由处理器执行以处理UTGETGLB指令的方法的示例。
图19图示用于使用仿真或二进制转译来处理UTGETGLB指令的方法的示例。
图20图示由处理器执行以处理UTGETCURRACTIVE指令的方法的示例。
图21图示用于使用仿真或二进制转译来处理UTGETCURRACTIVE指令的方法的示例。
图22图示由处理器执行以处理UTTST指令的方法的示例。
图23图示用于使用仿真或二进制转译来处理UTTST指令的方法的示例。
图24图示由处理器执行以处理SSAREAD指令的方法的示例。
图25图示用于使用仿真或二进制转译来处理SSAREAD指令的方法的示例。
图26图示由处理器执行以处理SSAWRITE指令的方法的示例。
图27图示用于使用仿真或二进制转译来处理SSAWRITE指令的方法的示例。
图28图示用于FRED事件递送的方法的示例。
图29图示一些示例在其中操作的虚拟机环境。
图30是用于在虚拟机环境中处置故障的过程的示例的流程图。
图31图示VMCS的示例。
图32图示批量页错误处置的示例。
图33图示使用SyMT编译器内联函数以C语言实现的DAXPY内核的示例。
图34(A)-图34(D)图示工作窃取的示例。
图35-图38示出可受益于屏障提示的代码的示例,诸如跨循环迭代共同的代码或同一函数但不同调用。
图39图示软屏障提示如何进行帮助。
图40图示屏障提示FSM的动作的示例。
图41图示由处理器执行以处理软屏障指令的方法的示例。
图42图示示例性系统的示例。
图43图示可具有多于一个的核心、可具有集成存储器控制器、并且可具有集成图形器件的处理器的示例的框图。
图44(A)是图示根据示例的示例性有序管线和示例性寄存器重命名、乱序发出/执行管线两者的框图。
图44(B)是图示根据示例的要被包括在处理器中的有序体系结构核心的示例性示例和示例性寄存器重命名、乱序发出/执行体系结构核心两者的框图。
图45图示(一个或多个)执行单元电路的示例,诸如图44(B)的(一个或多个)执行单元电路。
图46是根据一些示例的寄存器体系结构的框图。
图47图示指令格式的示例。
图48图示寻址字段的示例。
图49图示第一前缀的示例。
图50(A)-图50(D)图示如何使用第一前缀4701(A)的R、X和B字段的示例。
图51(A)-图51(B)图示第二前缀的示例。
图52图示第三前缀的示例。
图53图示根据示例的对照使用软件指令转换器将源指令集体系结构中的二进制指令转换成目标指令集体系结构中的二进制指令的框图。
具体实施方式
本公开涉及用于支持同步微线程化(Synchronous Microthreading,SyMT)的方法、装置、系统和非暂态计算机可读存储介质。
出于充分的理由,现代乱序(out-of-order,OoO)处理器具有许多功能单元,但是这些功能单元通常是空闲的——使性能“留待讨论”。这些微体系结构允许大量的并行性有时在“尘埃落定的”单线程工作负荷中被发现。然而,许多工作负荷将无法利用所有的此种硬件并行性。DP工作负荷包含常规和非常规控制和数据流的混合。一些解决方案擅长处置常规的控制、数据流,但任一者都无法对具有非常规控制和数据流的DP工作负荷进行向量化或对这些DP工作负荷执行不佳。
现有的解决方案具有一个或多个缺陷。例如,SIMT-X完全不涉及迁移机制或体系结构上可见的组件。GPGPU体系结构假定无法直接与操作系统交互的一种具有虚拟ISA的异构体系结构(并行代理必须使所有的事件均由设备驱动器解决)。由于一些操作花费多微秒来完成,因此通过设备驱动器与GPU进行交互施加很大的开销。这些种类的GPGPU体系结构中的这些限制使得某些并行代码由于开销而无法在并行处理器上被加速。它们还排除了某些构建软件的方式(例如,利用多个编译单元)。此外,诸如空间加速器之类的解决方案也不具有以上这些关键部分。空间加速器并非编程人员和/或编译器友好的,并且需要专业的程序员进行手工调整才能看到比竞争对手更多的性能优势。而且,空间加速器利用现有的并行代码(诸如CUDA代码)的能力未经证实。
SyMT是一种被设计成使数据并行应用极大地加速的硬件/软件技术。SyMT处置包括非常规控制、数据流在内的所有种类的DP。SyMT允许编程人员具有选择指定DP的方法的自由。SyMT使用标量执行路径作为最小缩放单位,并且不需要向体系结构和/或编程人员披露机器的向量宽度。通过将机器的向量宽度与体系结构解耦,SyMT使得多种向量宽度的实现方式在同一代系中共存。例如,第一核心类型可具有较小的向量宽度而第二核心类型可具有较大的向量宽度,并且核心类型可以执行相同的二进制文件。由此,SyMT处置若干种类的DP——常规控制、数据流(诸如密集SIMD)以及非常规控制流(分散)和非常规数据流(诸如稀疏SIMD)。
在SyMT中,程序流被拆分成要并发地被执行的多个程序流。在一些示例中,程序流切片被称为迭代。迭代的示例是循环和并行编程操作,诸如映射(map)或归约(reduce)。使用软件运行时将迭代静态地或动态地映射到微线程。SyMT支持(例如,加速器(或其他协处理器类型)或者核心的子部分)将一个或多个迭代绑定至硬件微线程。每个微线程具有其自身的寄存器状态的独立副本。然而,在一些示例中,微线程在其间共享一些系统寄存器,并且还与主机逻辑处理器共享控制状态寄存器(control status register,CSR)和型号特定寄存器(model specific register,MSR)。在一些示例中,每个微线程具有其自身的控制寄存器(例如,CR2寄存器),该控制寄存器用于存储任何页错误的线性地址。
SyMT允许这样的一种新的并行编程模型:其允许代码静态地被并行化但动态地允许重新汇聚以实现高效的执行。它可以在乱序超标量处理器上或者在专用协处理器硬件单元上实现以获得高效性。系统以低等待时间高性能方式来处置迁移和事件,这使得能够成功被加速的并行代码最大化。
SyMT利用轻量型微线程使硬件-软件合约得到升级。这允许编译器、编程人员在没有向量ISA的刚性约束的情况下披露细粒度的并行性,同时通过动态地利用ILP、TLP和/或DLP而避免了零总和游戏。SyMT的性能随功能单元的数量而缩放,启动微线程的开销很低,并且可以支持其他协处理器。
SyMT技术使数据并行工作负荷加速。此种体系结构可用标量微线程化抽象来增强指令集体系结构(instruction set architecture,ISA),这可以利用不同的微体系结构来实现。与诸如上文所详述的那些技术之类的关于数据并行工作负荷的现有技术相比,SyMT可以实现每时钟执行更多的指令,并且实现更好的每操作能耗。
通过一个指令(微线程(microthread,uT)进入(在本文中以助记符“UTNTR”来描述)),许多微线程被启动。微线程通过对uT返回(在本文中以助记符“UTNTR”来描述)指令的执行而以信号通知完成。在一些示例中,在微线程完成之前,启动处理器都暂停。在一些示例中,在微线程完成之前,启动处理器都不会暂停。微线程允许用户级指令,但可以采取异常并执行系统调用。OS需要是SyMT感知的。
SyMT为编程人员提供不具有体系结构分散指令或控制代码的标量微线程抽象。被提供给编程人员的抽象基于不被地址空间中现有的操作系统调用的轻量型线程。SyMT抽象的主要益处是:1)灵活性——披露细粒度或适度的并行性而不具有向量ISA的刚性约束;2)可移植性——二进制文件在具有很少的计算资源的机器或具有丰富的计算资源的机器上运行;和/或3)性能——硬件调度的线程允许轻量型的并行迁移。
存在可以被用于支持SyMT的许多不同的微体系结构风格。这提供等待时间非常低的迁移并且重新使用现有的处理器微体系结构来进行面积高效的实现方式。
图1是各示例可在其中实现的计算机系统100的示例的框图。计算机系统100可表示桌面型计算机系统、膝上型计算机系统、笔记本计算机、平板计算机、上网本、便携式个人计算机、智能电话、蜂窝电话、服务器、网络元件(例如,路由器或交换机)、智能电视、上网机、机顶盒、视频游戏控制器、媒体播放器、或另一类型的计算机系统或电子设备。
计算机系统100包括处理器101和存储器114。当处理器101和存储器114一起被部署在系统中时,处理器101和存储器114可通过互连机制198彼此耦合。互连机制198可包括一个或多个总线或其他互连、一个或多个中枢或其他芯片组组件、以及以上各项的组合。本领域中已知的将处理器101与存储器114耦合的各种方式都是合适的。虽然存储器114在图1中示出,但其他示例涉及不与存储器114耦合的单独的处理器101(例如,存储器114未被部署在计算机系统100中)。不同类型的存储器的示例包括但不限于动态随机存取存储器(dynamic random-access memory,DRAM)、闪存、以及通常用于主存储器的其他类型的存储器。
处理器101可提供至少两种类型的存储器管理:分段和分页。分段提供一种将各个代码、数据和栈模块隔离以使得多个程序(或任务)可以在不会彼此干扰的情况下在同一处理器上运行的机制。分页提供一种用于实现其中程序的执行环境的各部分根据需要被映射到物理存储器中的常规按需分页的虚拟存储器系统的机制。分页还可以用于提供多个任务之间的隔离。当在受保护模式下操作时(其中,受保护模式是其中分段被启用并且作为用于启用分页的先决条件的处理器操作的模式),某种形式的分段必须被使用。不存在模式比特来禁用分段。然而,分页的使用是可选的。这两种机制(分段和分页)可被配置成用于支持简单的单程序(或单任务)系统、多任务系统、或使用共享存储器的多处理器系统。分段提供了一种用于将处理器的可寻址存储器空间(被称为线性地址空间)划分成较小的、受保护的地址空间(被称为段)的机制。段可被用于保持代码、数据以及程序的栈,或者用于保持系统数据结构(诸如,任务状态段(task state segment,TSS)或局部描述符表(local descriptortable,LDT))。如果多于一个的程序(或任务)正在处理器101上运行,则每个程序可以被分派其自身的段集合。分段机制还允许按类型对段进行归类,以使得可对特定类型的段执行的操作可以被限制。系统中所有的段均被包含在处理器的线性地址空间中。
每一个段寄存器可具有“可见”部分和“隐藏”部分。(隐藏部分有时被称为“描述符缓存”或“影子寄存器”。)当段选择符被加载到段寄存器的可见部分中时,处理器还可利用来自由段选择符指向的段描述符的基址、段限制和访问控制信息来加载段寄存器的隐藏部分。被缓存在(可见的和隐藏的)段寄存器中的信息允许处理器在不花费额外的总线周期来从段描述符读取基址和限制的情况下对地址进行转译。在其中多个处理器具有对同一描述符表的访问权的系统中,当描述符表被修改时重新加载段寄存器是软件的责任。如果这一点未被完成,则被缓存在段寄存器中的旧的(例如,过期的)段描述符可在其存储器驻留版本已经被修改之后被使用。
为了在特定段中定位字节,必须提供逻辑地址(也被称为远指针)。逻辑地址由段选择符和偏移组成。段选择符是用于段的唯一标识符。段选择符可包括例如,2比特的所请求有特权级别(requested privileged level,RPL)(例如,比特1:0)、1比特的表指示符(table indicator,TI)(例如,比特2)、以及13比特的索引(例如,比特15:3)。除此之外,它向被称为段描述符的数据结构提供到描述符表(诸如,全局描述符表(global descriptortable,GDT))中的偏移。
每个段具有段描述符,该段描述符指定段的大小、针对该段的访问权和特权级别、段类型、以及段的第一字节在线性地址空间中的位置。逻辑地址的偏移部分与段的基址相加,以定位段内的字节。由此,基址加上偏移形成处理器的线性地址空间中的线性地址。
存储器114可存储有特权系统软件115。合适的有特权系统软件115的示例包括但不限于,一个或多个操作系统、虚拟机监视器(virtual machine monitor,VMM)、管理程序等等、以及以上各项的组合。存储器114还可存储一个或多个用户级应用116。用户级应用116可以可选地包括一个或多个用户级多线程应用。如将在下文进一步解释的,此类用户级多线程应用可以可选地使用本文中所公开的指令来帮助增加执行用户级多线程和/或执行用户级任务切换的效率。
在操作期间,存储器114还可存储栈119。栈119有时被称为调用栈、数据栈,或就被称为栈。栈119可表示可操作以存储数据118和控制117两者的栈型数据结构。数据118可表示软件想要入栈至栈上的各种各样的不同类型的数据中的任何数据(例如,被传递至子例程的参数和其他数据等)。通常,控制117可包括用于一个或多个先前执行的过程调用的一个或多个返回地址。这些返回地址可表示当所调用的过程结束并返回时所调用的过程要使控制流返回到的地方的指令地址。
栈119是连续的存储器位置阵列。它被包含在段中,并通过段选择符在栈段寄存器(例如,SS寄存器)中被标识。当使用平坦存储器模型时,栈119可以被定位在用于程序的线性地址空间中的任何地方。项目使用PUSH(入栈)指令被放置在栈119上,并且使用POP(出栈)指令从栈119被移除。当项目被入栈至栈119上时,栈指针寄存器(例如,ESP)被递减,并且随后该项目被写入在栈119的新的顶部处。当项目从栈119被出栈时,该项目从栈119的顶部被读取,并且随后栈指针寄存器被递增。以此种方式,当项目被入栈至栈119上时,栈119在存储器中向下生长(朝向较小的地址),并且当项目从栈119被出栈时,栈119向上缩减(朝向较大的地址)。程序或操作系统/执行文件可以建立许多栈119。例如,在多任务系统中,每个任务可以被给予其自身的栈119。系统中栈119的数量受段的最大数量和可用的物理存储器限制。当系统建立许多栈119时,一次仅一个栈119(当前栈)可用。当前栈是被包含在由SS寄存器引用的段中的一个栈。当前栈是由当前的栈指针寄存器引用并被包含在由SS寄存器引用的段中的一个栈。
段寄存器可包括段选择符,该段选择符是段的标识符(例如,16比特标识符)。该段选择符可能不直接指向段,而是替代地可指向定义段的段描述符。
段描述符可包括以下各项中的一项或多项:
1)描述符类型(S)标志——(例如,段描述符的第二双字中的比特12),其确定段描述符是用于系统段还是代码或数据段。
2)类型字段——(例如,段描述符的第二双字中的比特8至11),其确定代码、数据或系统段的类型。
3)限制字段——(例如,段描述符的第一双字的比特0至15以及段描述符的第二双字的比特16至19),其连同G标志和(用于数据段的)E标志一起确定段的大小。
4)G标志——(例如,段描述符的第二双字中的比特23),其连同限制字段和(用于数据段的)E标志一起确定段的大小。
5)E标志——(例如,数据段描述符的第二双字中的比特10),其连同限制字段和G标志一起确定段的大小。
6)描述符特权级别(Descriptor privilege level,DPL)字段——(例如,段描述符的第二双字中的比特13和14),其确定段的特权级别。
选择符中的所请求特权级别(Requested privilege level,RPL)字段指定段选择符的所请求的特权级别。
当前特权级别(Current privilege level,CPL)指示当前执行的程序或过程的特权级别。术语CPL指代该字段的设置。
以下是分页结构的各部分:用户/管理程序(User/supervisor,U/S)标志——(例如,分页结构条目的比特2),其确定页的类型:用户或管理程序;读取/写入(Read/write,R/W)标志——(例如,分页结构条目的比特1),其确定被允许的对页的访问的类型:只读或读取/写入;以及执行-可禁用(Execute-disable,XD)标志——(例如,某些分页结构条目的比特63),其确定被允许的对页的访问的类型:可执行或不可执行。
在面向返回的编程(return-oriented programming,ROP)、面向跳转的编程(jump-oriented programming,JOP)以及其他控制流颠覆攻击中,攻击者通常寻求获得对栈119的控制以劫持程序控制流。可能倾向于使常规的数据栈更容易受到ROP、JOP和其他控制流颠覆攻击的一个因素在于,栈119一般存储数据118和控制117两者(例如,数据和返回地址通常一起被混合在同一栈119上)。可能倾向于使常规的栈119更容易受到此类攻击的另一因素在于,栈119的切换一般可以作为无特权操作来执行。由于允许栈指针和/或控制流信息(例如,返回地址)被修改(例如,以指向恶意软件/受攻击者控制的存储器)的缺陷,这两种因素可倾向于增加对控制流颠覆攻击的暴露。
一个或多个影子栈120可被包括并被用于帮助保护栈119免受篡改和/或被用于帮助增加计算机安全性。(一个或多个)影子栈120可表示与栈119分开的一个或多个附加的栈型数据结构。如所示,(一个或多个)影子栈120可用于存储控制信息121而不是数据(例如,不是用户级应用程序116会需要以便能够写入和修改的栈119上所存储的类型的参数和其他数据)。存储在(一个或多个)影子栈120上的控制信息121可表示返回地址相关信息(例如,实际返回地址、用于验证返回地址的信息、其他返回地址信息)。作为一个可能的示例,(一个或多个)影子栈120可用于存储在函数或过程已经被调用时已经被入栈在栈119上的任何返回地址的副本(例如,同样已经被入栈至常规调用栈上的调用链中的每个返回地址的副本)。每个影子栈120还可包括可操作以用于标识影子栈120的顶部的影子栈指针(shadow stack pointer,SSP)。(一个或多个)影子栈120可以可选地被配置成用于单独地以无特权用户级模式(例如,环3特权级别)或以有特权的或管理程序特权级别模式(环0、环1、或环2特权级别)的操作。在一个方面,多个影子栈120可以潜在地被配置在系统中,并且针对每一逻辑处理器每次仅一个影子栈120可被配置为当前影子栈120。
如所示,(一个或多个)影子栈120可被存储在存储器114中。当前或活跃的(一个或多个)影子栈120可由线性地址范围来限定,以帮助在入栈和/或出栈操作在影子栈120上被执行时检测和防止栈上溢和/或栈下溢。为了帮助提供附加保护,(一个或多个)影子栈120可以可选地被存储在存储器114的受保护的或访问受控的部分中,无特权用户级应用116对该部分具有受限制的和/或不完整的访问。提供存储器114的合适的受保护部分以用于存储(一个或多个)影子栈120的不同方式是可能的。(一个或多个)影子栈120可以可选地被存储在存储器114的、受分页访问控制保护的部分中。例如,有特权系统软件115(例如,操作系统)可在与(一个或多个)影子栈120被存储在其中的页相对应的页表条目中配置访问许可(例如,读取-写入-执行许可),以使得页可读取但不可写入且不可访问。这可帮助防止用户级指令(诸如,存储到存储器114指令、移动到存储器114指令等等)能够被写入或防止其能够修改(一个或多个)影子栈120中的数据。作为另一选项,(一个或多个)影子栈120可以可选地被存储在存储器114的利用与用于软件防护扩展(Software GuardExtensions,SGX)安全飞地或其他受保护容器、隔离执行环境等等的那些访问控制保护类似的访问控制保护来保护的部分。
存储器114还可存储线程本地存储装置(thread local storage,TLS)122。
再次参考图1,例如,处理器101可以是通用处理器(例如,具有通常被用作桌面型电脑、膝上型电脑或其他计算机系统中的中央处理单元(central processing unit,CPU)的类型)。替代地,处理器101可以是专用处理器。合适的专用处理器的示例包括但不限于网络处理器、通信处理器、密码处理器、图形处理器、协处理器、嵌入式处理器、数字信号处理器(digital signal processor,DSP)以及控制器(例如,微控制器)。处理器101可具有各种复杂指令集计算(complex instruction set computing,CISC)体系结构、精简指令集计算(reduced instruction set computing,RISC)体系结构、超长指令字(very longinstruction word,VLIW)体系结构、混合式体系结构、其他类型的体系结构中的任一种,或者具有不同体系结构的组合(例如,不同的核心可具有不同的体系结构)。
处理器101的寄存器140可由逻辑处理器108、灵活返回和事件递送(flexiblereturn and event delivery,“FRED”)逻辑130、SyMT逻辑111和/或影子栈逻辑110使用。注意,各个逻辑110、111和/或130可包括电路、微代码等。这些寄存器140可包括图46的寄存器。处理器101的寄存器140的示例可包括以下各项中的一项或多项:标志存储装置(例如,EFLAGS、RFLAGS、FLAGS、条件代码寄存器,标志与数据一起被存储等)、指令指针(例如,EIP、RIP等)、当前特权级别(CPL)、栈指针、影子栈120、控制、型号特定寄存器、段寄存器(例如,代码段(code segment,CS)、数据段(data segment,DS)、栈段(stack segment,SS)、GS等),等等。RFLAGS至少包括陷阱标志(trap flag,TF)、中断启用标志(interrupt enable flag,IF)、以及重新开始标志(resume flag,RF)。注意,在一些示例中,寄存器140可被认为是前端和执行资源109的部分。
处理器101可具有一个或多个指令和逻辑来帮助管理和保护(一个或多个)影子栈120。处理器101具有指令集102。指令集102是处理器101的指令集体系结构(ISA)的部分,并且包括处理器101可操作以执行的原生指令。指令集的指令可以表示被提供给处理器101以供执行的宏指令、汇编语言指令或机器级指令,而不是已经从指令集的指令解码的微指令、微操作或其他经解码的指令或控制信号。
如所示,指令集102包括若干指令103,包括以下各项中的一项或多项:UTNTR、SSAWRITE、SSAREAD、CTGETCONTEXT、UTTST、UTRET、UTGETGBL和/或UTACTV(在下文详细进行描述)。处理器或核心可被提供以执行(例如,解码和执行)这些指令中的任何一个或多个指令。此外,执行(例如,解码和执行)这些指令中的任何一个指令的方法可被提供。
处理器101可包括至少一个处理元件或逻辑处理器108。出于简单性,仅示出单个逻辑处理器,但要领会,处理器101可以可选地包括其他逻辑处理器。合适的逻辑处理器的示例包括但不限于核心、硬件线程、线程单元、线程槽、以及其他逻辑处理器。逻辑处理器108可以可操作以处理指令集102的指令。逻辑处理器108可具有用于处理指令的管线或逻辑。作为示例,每个管线可包括用于取得指令的指令取得(fetch)单元、用于对指令解码的指令解码单元、用于执行经解码的指令的执行单元、用于存储指令的源操作对象和目的地操作对象的寄存器、以及被示出为前端和执行资源109的类似单元。逻辑处理器108可以可操作以处理(例如,解码、执行等)指令103中的任何指令。
SyMT逻辑111提供对SyMT模式的支持。在一些示例中,SyMT逻辑111包括微代码。在一些示例中,SyMT微代码被耦合至前端和执行资源109的解码器资源,或者作为该解码器资源的部分被包括。在一些示例中,SyMT逻辑111包括加速器。注意,加速器可以是核心的部分,或者可以在核心外部。
图2图示SyMT支持111的示例。注意,在一些示例中,一些方面与前端和执行资源109进行共享或者是前端和执行资源109的部分。尽管图2示出前端201和执行资源211的分组,但这些分组仅仅是说明性的。
片段数据结构202跟踪各个微线程的程序顺序。片段数据结构202可以是推测性的或非推测性的。注意,片段是SyMT支持111可以在其上分摊取得、解码、分配、调遣和/或引退的群组的子集(包括但不限于群组的所有成员)。在一些示例中,SyMT支持111支持逻辑处理器的ISA。在一些示例中,SyMT支持111支持逻辑处理器的ISA的适当子集。在整个控制流图的某个子集中,从最小为单个基本块到最大为程序的整个并行区域,这些微线程将共享指令的程序顺序。群组是被保证并行地执行的微线程的集合。群组中的所有微线程应当在另一群组能够使用这些微线程的资源被调度之前完成。
片段调度器203提供片段ID,确定是否要存在片段切换,并且将下一线性指令指针(next linear instruction pointer,NLIP)提供至分支预测单元204。分支预测单元204预测在SyMT期间用于SyMT支持111的分支。指令缓存和指令TLB 205存储指令和指令地址。
预取器电路207预取指令和/或数据。解码器电路208对SyMT指令进行解码,该SyMT指令诸如本文中详述的指令中的至少一些指令。例如,UTTST、UTCNTXT、UTRET、UTGETGBL和UTACTV是典型地由SyMT支持111解码和执行的指令。UTNTR、SSAREAD、SSAWRITE典型地由前端和执行资源109和/或SyMT支持111解码和执行。解码器电路208还支持前端和执行资源109的ISA指令,诸如布尔操作、存储器操作、和算术操作。在一些示例中,整数执行单元221、向量执行单元231和/或存储器单元241的集群至少支持前端和执行资源109的此类指令中的大多数指令(如果不是全部)。
在一些示例中,解码器208包括微代码(ucode)254。在其他示例中,微代码254在解码器208外部。当UTRET指令被执行时,微代码254使用SyMT保存区域124来确定机器的下一状态。在引退UTRET指令之后,微代码254可以启动微线程工作的下一区块(如果该区块是可用的),或者返回至单线程模式。
重放保护电路209跟踪由读取请求的并行处理引发的重复的请求,并且防止重复的操作被执行多于一次。
分配/重命名/引退电路215为包括重命名操作对象(逻辑到物理)的微操作分配资源,并引退已完成的操作。微操作的引退按程序顺序来完成。分配/重命名/引退电路215分配重排序缓冲器(reorder buffer,ROB)214、加载缓冲器212、以及存储缓冲器213,该ROB214是被用于在引退时保持对程序顺序的跟踪的有序缓冲器,该加载缓冲器212用于存储这些加载直到它们的目标地址已被确定,该存储缓冲器213用于缓冲这些存储操作直到它们被引退。
定向电路和集群复制电路216将经解码的指令等从整数执行单元221、向量执行单元231和/或存储器单元241定向至针对执行单元类型的适当集群。该电路216还对操作进行复制(例如,复制最多8次)以供调遣。
图3图示整数集群的示例。注意,可能存在多个此类集群。在一些示例中,这些集群中的至少一些集群并行地工作。
如所示,整数集群221包括预留站301、多个整数执行单元303……305、以及整数寄存器堆307。预留站301将操作(诸如微操作)调遣至多个整数执行单元303……305中的一个或多个。预留站301具有多个分区,这些分区中的每个分区可被用于向特定的执行单元进行调遣。整数寄存器堆307包括由执行单元使用的通用寄存器。在一些示例中,执行标志(进位(CF)、奇偶性(PF)、对齐(AF)、归零(ZF)、符号(SF)和溢出(OF))与数据一起被存储。
图4图示向量集群的示例。在一些示例中,两个整数集群共享向量集群。所示出的示例性向量集群231包括预留站401、多个向量执行单元403……405、以及向量寄存器堆407。示例性向量寄存器大小包括但不限于:64比特、128比特、256比特和512比特。预留站401将操作(诸如微操作)调遣至多个向量执行单元403……405中的一个或多个。预留站401具有多个分区,这些分区中的每个分区可被用于向特定的执行单元进行调遣。向量寄存器堆407包括由执行单元使用的向量寄存器。
图5图示存储器集群的示例。所示出的示例性存储器集群241包括预留站501、存储数据缓冲器503、加载和/或存储电路505、以及数据缓存和数据缓存控制电路507。预留站501将操作(诸如微操作)调遣至加载和/或存储电路505。存储数据缓冲器503跟踪所存储的排序。预留站501具有多个分区,这些分区中的每个分区可被用于向特定的执行单元进行调遣。数据缓存和数据缓存控制电路507将数据存储在数据缓存中并从数据缓存加载数据。
如所示,至少一个处理单元或逻辑处理器108的逻辑中的至少一些逻辑可以是处理器101的FRED逻辑130的部分。FRED逻辑130是专用电路。FRED逻辑130利用由执行单元和/或微控制器执行的一个或多个状态机。FRED逻辑130负责递送事件并支持FRED指令。FRED逻辑130支持事件递送。通常会引起IDT事件递送的事件(例如,中断或异常)将替代地在不访问传统数据结构(例如,IDT)中的任一个的情况下建立新的上下文。
FRED逻辑130使用栈级别。栈的编号被称为其栈级别。当前栈级别(current stacklevel,CSL)是在CPL=0时处理器101跟踪的、处于范围0-3中的值,并且是当前使用中的栈级别。注意,栈级别的数量可与所列出的4个有所不同。FRED事件递送确定与正在被递送的事件相关联的栈级别,并且如果它大于CSL(或者如果CPL尚不为0),则从与事件的栈级别相关联的FRED_RSP MSR加载栈指针。FRED返回指令(事件返回至管理程序或ERETS)恢复旧的栈级别。(如果管理程序影子栈120被启用,则栈级别也应用于影子栈指针SSP,该影子栈指针SSP可从FRED_SSP MSR加载。)
上文所详述的影子栈指针包括令牌管理机制,以确保在切换影子栈120时的影子栈完整性。该机制使用可能不利地影响最坏情况性能的被锁定的读取-修改-写入操作。FRED逻辑130使用经修改的令牌管理机制,该机制避免了用于大多数转变的这些操作。此种新的机制通过在FRED_SSP MSR中定义新的经验证的比特来支持。
寄存器140可包括若干个型号特定寄存器(model specific registers,MSR)。
存储器114还可用于存储SyMT状态区域124。SyMT状态区域124包括用于处置可重启异常或诊断终端异常的信息。SyMT状态区域124包括一个或多个微线程的状态的存储器内表示。图6图示微线程状态601的示例。例如,SyMT状态601包括针对每个微线程的通用寄存器(general purpose register,GPR)603的值、向量/SIMD寄存器(例如,128比特、256比特等)605的值、掩码和/或谓词寄存器(例如,K0至K7)615的值、一个或多个标志(或条件代码)寄存器607的值、以及至少一些系统和/或控制寄存器(例如,CR2、FS.base、GS.base、错误代码、RIP、MXCSR)的值。其他寄存器611也可作为非微线程特定寄存器而被包括,非微线程特定寄存器诸如用于指示SyMT错误的寄存器、用于存储所使用的SyMT版本的寄存器、用于存储微线程的数量的寄存器、用于存储SyMT状态的指示的寄存器等。操作系统(operating system,“OS”)读取和写入SyMT状态区域124中的字段,以支持异常、陷阱和其他OS相关任务。
SyMT状态区域124使用的一些示例利用型号特定寄存器(MSR)来指向其中存在状态区域的存储器中的位置。在一些示例中,使用SyMT模式的每一个进程分配物理存储器的逐逻辑处理器的页对齐的区域,以存储SyMT状态区域124。该存储器可以在新的OS线程被创建时通过系统调用被分配,或者可以在SyMT第一次被使用时惰性地被分配。状态区域124可以在虚拟存储器中或在物理存储器中。
使用物理存储器会要求OS将虚拟到物理转译“固定(pin)”在页表中;然而,支持SyMT的虚拟化实现方式会造成增加附加的复杂性。
在上下文切换时更新MSR(例如,MSR SYMT SAVE)是系统软件的责任。在一些示例中,一个SyMT状态区域124逐逻辑处理器地退出,并且如果多个逻辑处理器共享同一SyMT状态区域124,则行为未被定义。
图7图示SyMT状态区域的枚举的示例。如所示,枚举具有针对GP寄存器701、标志和系统寄存器703、向量寄存器705、写入掩码寄存器707、以及其他寄存器709的微线程特定的枚举。
这些寄存器中的每个寄存器的大小也可被枚举。软件可以利用状态枚举值来对SyMT状态枚举大小数组进行索引,以查找存储给定的状态元素需要存储器的多少字节。例如,由于RAX的大小为8字节,因此SYMT STATE ENUM SIZES[SYMT RAX]将返回8。
图8图示SyMT使用的示例。代码801包括非SyMT用户代码803。有时,用户代码非SyMT用户代码803包括用于整个SyMT模式的UTNTR指令,该UTNTR指令将工作迁移至作为SyMT模式下的用户代码811的部分的微线程(示出为UT0……UTN)。在一些示例中,初始微线程状态对于所有的GPR均为0(其中RIP被UTNTR设置),即没有GRP或向量状态被传递。
如所示,非SyMT用户代码803的UTNTR指令引起SyMT模式在一个或多个相关联的UTRET指令的执行时运行和退出(典型地)。然而,一些事件可能引起处理器异常地退出SyMT模式并生成异常或错误。在一些实施例中,每个微线程在完成时执行UTRET指令,并且最终微线程对UTRET指令的执行引起SyMT模式退出。
微线程可以生成异常/错误/系统调用。当异常/错误/系统调用发生时,微线程执行停止,所有的微线程状态被保存在SyMT状态区域825,并且SyMT事件类型被递送至主机非SyMT用户代码803线程。在一些示例中,物理寄存器与正常标量执行来自同一池,并且必须被释放以用于异常处置的发生。
操作系统821查询逐微线程子错误代码,以处置特定的错误(例如,#PF)。对于OS事件处置程序823读取或写入SyMT状态区域825,诸如SyMT保存区域(SyMT save area,SSA)读取(在本文中由助记符SSAREAD来描述)和SSA写入(在本文中由助记符SSAWRITE来描述)之类的指令被使用。这些指令的示例在稍后进行详述。事件返回至用户指令(ERETU)由OS821用来重新进入SyMT模式811。SSA的物理地址被存储在MSR中(例如,SyMT_SSA)。SyMT的大小取决于ISA特征所使用的和所支持的微线程的数量。在一些示例中,针对每一逻辑处理器存在一个SSA。
在一些示例中,存在多个微线程退出条件。这些条件包括以下各项中的一项或多项:1)所有的微线程均已经由UTRET完成(当这一点发生时,执行在UTNTR指令之后的指令处以主机模式继续);2)在至少一个微线程上存在错误/异常(当这一点发生时,执行在管理程序模式下以主机模式继续,并且SyMT事件类型被提供);3)至少一个微线程执行系统调用(当这一点发生时,执行在系统调用处置程序处在管理程序模式下以主机模式继续);4)机器条件异步地停止微线程执行(例如,外部中断)(当这一点发生时,执行将在启动主机线程上在管理程序模式下继续,并且事件将被常规地处置);和/或5)在启动期间,UTNTR指令出错(当这一点发生时,执行在#SYMT异常被设置的情况下在管理程序模式下以主机模式继续)。
SyMT指令
图9图示由处理器执行以处理UTNTR指令的方法的示例。例如,如图44(B)中所示的处理器核心、如下文详述的管线等、或者SyMT逻辑111执行该方法。UTNTR指令与主机线程同步地开始微线程的执行。具体而言,在退出或终止条件发生之前,启动主机线程都暂停。当终止条件发生时,所有的微线程停止执行。在一些示例中,UTNTR指令是使用SyMT状态区域中保存的状态可重启的。在一些示例中,UTNTR还设置SyMT状态区域的一些方面,诸如全局指针、指令指针等。
在901处,取得单个指令的实例。例如,取得UTNTR指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于提供第一指令指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于提供第二指针;用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于提供计数值,其中,操作码用于指示执行电路要尝试到微线程执行中的进入。在一些示例中,源操作对象中的一个或多个隐式地被引用。
UTNTR的格式的示例为UTNTR SRC1,SRC2,SRC3。在一些示例中,UTNTR是指令的操作码助记符,并且在操作码字段4703中被具体化。SRC1、SRC2和SRC3是用于诸如紧缩(packed)数据寄存器和/或存储器之类的源的字段。这些源可以使用寻址字段4705和/或(一个或多个)前缀4701来标识。在一些示例中,UTNTR指令使用第二前缀4701(B)或第三前缀4701(C),该第二前缀4701(B)或第三前缀4701(C)在稍后进行详述。例如,在一些示例中,使用REG 4844、R/M 4846、以及来自字节1 5105、字节2 5117或有效载荷字节5217的VVVV来标识相应的源。
由此,UTNTR指令的示例可使用三个变量——线程执行开始所在之处的指令指针、指向全局变量的指针、以及计数。典型地,这些变量被传递至UTNTR指令中,作为64比特寄存器。指令指针是指向微线程执行在其中开始的代码的指针,并且全局变量指针是供编程人员使用的通用指针。从主机线程传递至微线程的任何状态均经由全局变量指针来提供。
在一些示例中,UTNTR计数变量与底层硬件支持的微线程的数量之间的关系如下——SyMT逻辑111微代码将按给定实现方式上支持的微线程的数量迭代最多计数变量次。计数变量可能大于所支持的微线程的数量,并且当这一点发生时,不能保证并发性。如果并发性对于正确性是所要求的,则软件必须确保计数变量等于硬件支持的微线程的数量。软件应当使用CPUID或具有适当变量的其他函数来查询针对给定实现方式的硬件支持的微线程的数量。在一些示例中,计数与算法循环相关,该算法循环是编程人员想要如应用所定义的那样进行并行化的迭代空间。在一些示例中,UTNTR迭代空间为从8至1024。微线程迭代空间为从1至32(取决于微体系结构)(在一些示例中,这可在SYMT_UTHREADS(SYMT_微线程)中被发现)。UTACTV是群组中微线程的数量。当从正常执行迁移到SyMT时,SyMT恢复SSA微线程的一小部分,并运行它们达一时间切片。SyMT将它们保存到SSA并从SSA恢复其余微线程中的一些,并且以此种方式在微线程之间循环,直到SSA中的所有微线程均完成。
在903处,对单个指令的所取得的实例进行解码。
在905处,取回与经解码的指令的源操作对象相关联的数据值并且调度经解码的指令。例如,当源操作对象中的一个或多个源操作对象是存储器操作对象时,从所指示的存储器位置取回数据。
在907处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTNTR指令,执行将使得执行电路执行到微线程执行中的进入(如果可能的话)的尝试。在一些示例中,微线程执行进入包括使用加速器。
在一些示例中,当UTNTR指令执行时,(例如,通过微代码)作出SyMT保存区域是否适当地被设置的检查。如果它并未适当地被设置(例如,如在SSA头部中所指示),则UTNTR指令将失败,并且以信号通知具有特定的错误子代码的#SYMT异常代码,以准确地描述UTNTR指令为何失败。在异常时可见的主机寄存器状态是UTNTR指令时的主机寄存器状态。UTNTR报告非致命性错误,并通过标志寄存器(诸如通过设置ZF)来重新开始行为。执行还可包括设置活跃线程的比特向量(例如,存储ACTIVE_BITVEC(活跃_比特向量)的SSA的SyMT_ACTIVE_BITVEC(SyMT_活跃_比特向量))、使微线程寄存器归零(如果初始清除启动)、和/或将指令指针设置为所提供的指令指针(如果初始清除启动)。
在一些示例中,SSA具有头部,SyMT支持使用该头部来启用可重启的UTNTR执行。在执行UTNTR指令时,保存区域的头部针对空(null)指针和有效加速器ID被检查。如果指针为空或能力id与有效能力id匹配,则#SyMT异常在主机线程上以信号被通知。在错误代码中提供了足够的细节,以便编程人员对错误为何发生进行分类。在一些示例中,UTNTR第一次被执行时,执行不引起到SyMT模式的进入。
在一些示例中,在909处,对指令进行提交或引退。
图10图示用于使用仿真或二进制转译来处理UTNTR指令的方法的示例。例如,如图44(B)中所示的处理器核心、如下文详述的管线和/或仿真/转译层等执行该方法的各方面。
在1001处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于提供第一指令指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于提供第二指针;用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于提供计数值,其中,操作码用于指示执行电路要尝试到微线程执行中的进入。在一些示例中,源操作对象中的一个或多个源操作对象隐式地被引用。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
UTNTR的格式的示例为UTNTR SRC1,SRC2,SRC3。在一些示例中,UTNTR是指令的操作码助记符,并且在操作码字段4703中被具体化。SRC1、SRC2和SRC3是用于诸如紧缩数据寄存器和/或存储器之类的源的字段。这些源可以使用寻址字段4705和/或(一个或多个)前缀4701来标识。在一些示例中,UTNTR指令使用第二前缀4701(B)或第三前缀4701(C),该第二前缀4701(B)或第三前缀4701(C)在稍后进行详述。例如,在一些示例中,使用REG 4844、R/M4846、以及来自字节1 5105、字节2 5117或有效载荷字节5217的VVVV来标识相应的源。
由此,UTNTR指令的示例可使用三个变量——线程执行开始所在之处的指令指针、指向全局变量的指针、以及计数。典型地,这些变量被传递至UTNTR指令中,作为64比特寄存器。指令指针是函数指针,并且全局变量是通用指针。在一些示例中,UTNTR计数变量与底层硬件支持的微线程的数量之间的关系如下——SyMT逻辑111微代码将按给定实现方式上支持的微线程的数量迭代最多计数变量次。计数变量可能大于所支持的微线程的数量,并且当这一点发生时,不能保证并发性。如果并发性对于正确性是所要求的,则软件必须确保计数变量等于硬件支持的微线程的数量。软件应当使用CPUID或具有适当变量的其他函数来查询针对给定实现方式的硬件支持的微线程的数量。
在1003处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在1005处,取回与第二指令集体系结构的经解码的一个或多个指令的(一个或多个)源操作对象相关联的数据值,并且对一个或多个指令进行调度。例如,当源操作对象中的一个或多个源操作对象是存储器操作对象时,从所指示的存储器位置取回数据。
在1007处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTNTR指令,执行将使得执行电路执行如该UTNTR指令的操作码指示的操作。在一些示例中,微线程执行进入包括使用加速器。执行还可包括设置活跃线程的比特向量(例如,存储ACTIVE_BITVEC的SSA的SyMT_ACTIVE_BITVEC)、使微线程寄存器归零(如果初始清除启动)、和/或将指令指针设置为所提供的指令指针(如果初始清除启动)。
在一些示例中,在1009处,对(一个或多个)指令进行提交或引退。
图11图示表示UTNTR指令的执行的伪代码的示例。
图12图示由处理器执行以处理UTRET指令的方法的示例。例如,SyMT逻辑111处理该指令。UTRET指令指示执行电路要停止微线程执行,并且在一些实例中,指示到非SyMT模式的转变。具体而言,在执行UTRET指令时,微线程终止。
在1201处,取得单个指令的实例。例如,取得UTRET指令。单个指令具有用于操作码的字段,该操作码用于指示微线程的执行的停止(或中止)。UTRET的格式的示例。在一些示例中,UTRET是指令的操作码助记符,并且在操作码字段4703中被具体化。
在1203处,对单个指令的所取得的实例进行解码。
在1205处,对经解码的指令进行调度。例如,当源操作对象中的一个或多个源操作对象是存储器操作对象时,从所指示的存储器位置取回数据。
在1207处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTRET指令,执行将使得执行电路执行微线程的执行的停止。当执行UTRET的微线程是最后的微线程(如由活跃比特向量所指示)时,SyMT模式被设置为0(例如,ZF被清除)。当执行UTRET的微线程不是最后的微线程(如由活跃比特向量所指示)时,活跃比特向量被更新,以指示微线程已经停止。
在一些示例中,在1209处,对指令进行提交或引退。
图13图示用于使用仿真或二进制转译来处理UTRET指令的方法的示例。例如,SyMT逻辑111处理该指令。UTRET指令指示微线程执行的停止,并且在一些实例中,指示到非SyMT模式的转变。具体而言,在执行UTRET指令时,微线程终止。
在1301处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要停止(或中止)微线程的执行。UTRET的格式的示例。在一些示例中,UTRET是指令的操作码助记符,并且在操作码字段4703中被具体化。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在1303处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在1305处,取回与第二指令集体系结构的经解码的一个或多个指令的(一个或多个)源操作对象相关联的数据值,并且对一个或多个指令进行调度。例如,当源操作对象中的一个或多个源操作对象是存储器操作对象时,从所指示的存储器位置取回数据。
在1307处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTRET指令,执行将使得执行电路执行如由该UTRET指令的操作码指示的操作,以执行微线程的执行的停止。当执行UTRET的微线程是最后的微线程(如由活跃比特向量所指示)时,SyMT模式被设置为0(例如,ZF被清除)。当执行UTRET的微线程不是最后的微线程(如由活跃比特向量所指示)时,活跃比特向量被更新,以指示微线程已经停止。
在一些示例中,在1309处,对(一个或多个)指令进行提交或引退。
图14图示表示UTRET指令的执行的伪代码的示例。
图15图示由处理器执行以处理UTGETCNTXT指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETCNTXT指令的执行引起对执行该UTGETCNTXT指令的微线程的标识符的取回。
在1501处,取得单个指令的实例。例如,取得UTGETCNTXT指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要取回执行UTGETCNTXT指令的微线程的标识符。在一些示例中,UTGETCNTXT是指令的操作码助记符,并且在操作码字段4703中被具体化。
在1503处,对所取得的、单个指令的实例进行解码。
在1505处,对经解码的指令进行调度。
在1507处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTGETCNTXT指令,执行将使得执行电路取回执行该UTGETCNTXT指令的微线程的标识符。
在一些示例中,在1509处,对指令进行提交或引退。
图16图示用于使用仿真或二进制转译来处理UTGETCNTXT指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETCNTXT指令的执行引起对执行该UTGETCNTXT指令的微线程的标识符的取回。
在1601处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要取回执行UTGETCNTXT指令的微线程的标识符。UTGETCNTXT的格式的示例。在一些示例中,UTGETCNTXT是指令的操作码助记符,并且在操作码字段4703中被具体化。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在1603处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在1605处,对第二指令集体系结构的经解码的一个或多个指令进行调度。例如,当源操作对象中的一个或多个源操作对象是存储器操作对象时,从所指示的存储器位置取回数据。
在1607处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTGETCNTXT指令,执行将使得执行电路执行如由该UTGETCNTXT指令的操作码指示的操作,以取回执行该UTGETCNTXT指令的微线程的标识符。
在一些示例中,在1609处,对(一个或多个)指令进行提交或引退。
图17图示表示UTGETCNTXT指令的执行的伪代码的示例。
图18图示由处理器执行以处理UTGETGLB指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETGLB指令的执行引起全局指针的加载。在一些实施例中,该全局指针由UTNTR指令设置。全局指针被存储在存储器中(例如,作为SSA的部分,诸如在SyMT_GLOBAL_POINTER(SyMT_全局_指针)中)。
在1801处,取得单个指令的实例。例如,取得UTGETGLB指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要加载全局指针。在一些示例中,UTGETGLB是指令的操作码助记符,并且在操作码字段4703中被具体化。
在1803处,对所取得的、单个指令的实例进行解码。
在1805处,对经解码的指令进行调度。
在1807处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTGETGLB指令,执行将使得执行电路取回先前设置的全局指针值。
在一些示例中,在1809处,对指令进行提交或引退。
图19图示用于使用仿真或二进制转译来处理UTGETGLB指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETGLB指令的执行引起对执行该UTGETGLB指令的微线程的标识符的取回。
在1901处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要取回先前设置的全局指针值。UTGETGLB的格式的示例。在一些示例中,UTGETGLB是指令的操作码助记符,并且在操作码字段4703中被具体化。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在1903处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在1905处,对第二指令集体系结构的经解码的一个或多个指令进行调度。
在1907处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTGETGLB指令,执行将使得执行电路执行如由该UTGETGLB指令的操作码指示的操作,取回先前设置的全局指针值。
在一些示例中,在1909处,对(一个或多个)指令进行提交或引退。
在一些示例中,针对UTGETGLB指令的执行的伪代码为:
图20图示由处理器执行以处理UTGETCURRACTIVE指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETCURRACTIVE指令的执行引起活跃的微线程的数量的返回。
在2001处,取得单个指令的实例。例如,取得UTGETCURRACTIVE指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要返回活跃的微线程的数量。在一些示例中,UTGETCURRACTIVE是指令的操作码助记符,并且在操作码字段4703中被具体化。
在2003处,对单个指令的所取得的实例进行解码。
在2005处,对经解码的指令进行调度。
在2007处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTGETCURRACTIVE指令,执行将使执行电路返回活跃的微线的程数量。
在一些示例中,在2009处,对指令进行提交或引退。
图21图示用于使用仿真或二进制转译来处理UTGETCURRACTIVE指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTGETCURRACTIVE指令的执行引起活跃的微线程的数量的返回。
在2101处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要返回活跃的微线程的数量。UTGETCURRACTIVE的格式的示例。在一些示例中,UTGETCURRACTIVE是指令的操作码助记符,并且在操作码字段4703中被具体化。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在2103处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在2105处,对第二指令集体系结构的经解码的一个或多个指令进行调度。
在2107处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTGETCURRACTIVE指令,执行将使得执行电路执行如该UTGETCURRACTIVE指令的操作码指示的操作,以返回活跃的微线程的数量。
在一些示例中,在2109处,对(一个或多个)指令进行提交或引退。
在一些示例中,针对UTGETCURRACTIVE指令的执行的伪代码为:
图22图示由处理器执行以处理UTTST指令的方法的示例。例如,SyMT逻辑111处理该指令。对UTTST指令的执行引起对SyMT是否活跃的指示的返回。
在2201处,取得单个指令的实例。例如,取得UTTST指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要返回对SyMT是否活跃的指示。在一些示例中,UTTST是指令的操作码助记符,并且在操作码字段4703中被具体化。
在2203处,对单个指令的所取得的实例进行解码。
在2205处,对经解码的指令进行调度。
在2207处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于UTTST指令,执行将使执行电路返回对SyMT是否活跃的指示。在一些实施例中,对SyMT是否活跃的指示是特定的标志(诸如ZF或用于指示SyMT模式活跃的其他标志)是否被设置。
在一些实施例中,在2209处,对指令进行提交或引退。
图23图示用于使用仿真或二进制转译来处理UTTST指令的方法的示例。例如,SyMT逻辑111处理该指令。UTTST指令的执行引起对SyMT是否活跃的指示的返回。
在2301处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,该操作码用于指示执行电路要返回对SyMT是否活跃的指示。UTTST的格式的示例。在一些示例中,UTTST是指令的操作码助记符,并且在操作码字段4703中被具体化。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在2303处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在2305处,对第二指令集体系结构的经解码的一个或多个指令进行调度。
在2307处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于UTTST指令,执行将使得执行电路执行如由该UTTST指令的操作码指示的操作,以返回对SyMT模式是否活跃的指示。在一些实施例中,对SyMT模式是否活跃的指示是特定的标志(诸如ZF或用于指示SyMT模式活跃的其他标志)是否被设置。
在一些示例中,在2309处,对(一个或多个)指令进行提交或引退。
在一些示例中,针对UTTST指令的执行的伪代码为:
在一些示例中,使用特定的指令来读取SSA和/或向SSA写入,这些特定的指令在下文被详述为SSAREAD和SSAWRITE。
如果发生异常,则SyMT保存区域在从微线程执行模式转变回到主机模式时被写入。如果执行干净地转变至主机模式(例如,所有的微线程使用UTRET指令终止),则保存区域将不被更新。贯穿整个主机模式处置程序处理,SyMT保存区域对于读取和写入两者都是有效的。当在微线程模式下执行时对SyMT保存区域的任何主机访问都将引起未定义的行为。
SSAREAD和SSAWRITE指令具有三个变量。这些变量被定义如下:1)指向被用于从SyMT保存区域存储(SSAREAD)或加载(SSAWRITE)的存储器位置的指针;2)作为正在从SyMT保存区域被访问的状态的微线程ID的线程ID(thread ID,TID)(如果值对于SyMT保存区域中的所有微线程是全局的,则值“-1”可被使用);3)作为要被访问的状态的枚举值的寄存器ID(register ID,REGID)。在一些示例中,这些变量中的一个或多个变量由指令的显式操作对象提供。在一些示例中,这些变量中的一个或多个变量由指令的隐式操作对象提供。在一些示例中,操作对象是寄存器。
图24图示由处理器执行以处理SSAREAD指令的方法的示例。例如,SyMT逻辑111处理该指令。在一些示例中,SSAREAD指令的执行也引起对SyMT是否活跃的指示的返回。
在2401处,取得单个指令的实例。例如,取得SSAREAD指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于存储针对SyMT保存区域的指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于存储微线程id;和/或用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于存储要被访问的状态(寄存器)的枚举值,操作码用于指示特定微线程的所复制的寄存器状态(如由指向SyMT保存区域的指针中存储的微线程ID所标识)的读取。在一些示例中,枚举允许对特定微线程的寄存器状态的子集的读取。
SSAREAD的格式的示例为SSAREAD SR1,SRC2,SRC3。在一些示例中,SSAREAD是指令的操作码助记符,并且在操作码字段4703中被具体化。SRC1、SRC2和SRC3是用于诸如紧缩数据寄存器和/或存储器之类的源的字段。这些源可以使用寻址字段4705和/或(一个或多个)前缀4701来标识。在一些示例中,SSAREAD指令使用第二前缀4701(B)或第三前缀4701(C),该第二前缀4701(B)或第三前缀4701(C)在稍后进行详述。例如,在一些示例中,使用REG4844、R/M 4846、以及来自字节1 5105、字节2 5117或有效载荷字节5217的VVVV来标识相应的源。
在2403处,对所取得的、单个指令的实例进行解码。
在2405处,取回与源操作对象相关联的值并对经解码的指令进行调度。
在2407处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于SSAREAD指令,执行将使执行电路读取SSA的特定位置。特定位置的地址是通过使用指向通用SSA的指针并随后进一步从线程ID(其指示SSA的用于该线程的特定部分)以及随后从枚举值(其指示SSA的特定部分的特定位置)进一步细化在SSA中的何处来提供的。
在一些示例中,在2409处,对指令进行提交或引退。
图25图示用于使用仿真或二进制转译来处理SSAREAD指令的方法的示例。例如,SyMT逻辑111处理该指令。在一些示例中,SSAREAD指令的执行也引起对SyMT是否活跃的指示的返回。
在2501处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于存储针对SyMT保存区域的指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于存储微线程id;和/或用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于存储要被访问的状态(寄存器)的枚举值,操作码用于指示特定微线程的所复制的寄存器状态的读取。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在2503处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在2505处,对第二指令集体系结构的经解码的一个或多个指令进行调度。
在2507处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于SSAREAD指令,执行将使执行电路读取SSA的特定位置。特定位置的地址是通过使用指向通用SSA的指针并随后进一步从线程ID(其指示SSA的用于该线程的特定部分)以及随后从枚举值(其指示SSA的特定部分的特定位置)进一步细化在SSA中的何处来提供的。在一些示例中,在2509处,对(一个或多个)指令进行提交或引退。
图26图示由处理器执行以处理SSAWRITE指令的方法的示例。例如,SyMT逻辑111处理该指令。在一些示例中,SSAWRITE指令的执行也引起对SyMT是否活跃的指示的返回。
在2601处,取得单个指令的实例。例如,取得SSAWRITE指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于存储针对SyMT保存区域的指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于存储微线程id;和/或用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于存储要被写入到SSA中的状态(寄存器)的枚举值,操作码用于指示特定微线程的寄存器状态的写入。
SSAWRITE的格式的示例为SSAWRITE SRC1,SRC2,SRC3。在一些示例中,SSAWRITE是指令的操作码助记符,并且在操作码字段4703中被具体化。SRC1、SRC2和SRC3是用于诸如紧缩数据寄存器和/或存储器之类的源的字段。这些源可以使用寻址字段4705和/或(一个或多个)前缀4701来标识。在一些示例中,SSAWRITE指令使用第二前缀4701(B)或第三前缀4701(C),该第二前缀4701(B)或第三前缀4701(C)在稍后进行详述。例如,在一些示例中,使用REG 4844、R/M 4846、以及来自字节1 5105、字节2 5117或有效载荷字节5217的VVVV来标识相应的源。在2603处,对单个指令的所取得的实例进行解码。
在2605处,取回与源操作对象相关联的值并对经解码的指令进行调度。
在2607处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行经解码的指令。对于SSAWRITE指令,执行将使执行电路写入SSA的特定位置。特定位置的地址是通过使用指向通用SSA的指针并随后进一步从微线程ID(其指示SSA的用于该微线程的特定部分)以及随后从枚举值(其指示SSA的特定部分的特定位置)进一步细化在SSA中的何处来提供的。
在一些实施例中,在2609处,对指令进行提交或引退。
图27图示用于使用仿真或二进制转译来处理SSAWRITE指令的方法的示例。例如,SyMT逻辑111处理该指令。在一些示例中,SSAWRITE指令的执行也引起对SyMT是否活跃的指示的返回。
在2701处,将第一指令集体系结构的单个指令的实例转译为第二指令集体系结构的一个或多个指令。单个指令具有用于操作码的字段,并且在一些示例中具有以下各项中的一项或多项:用于指示第一源操作对象的一个或多个字段,该第一源操作对象用于存储针对SyMT保存区域的指针;用于指示第二源操作对象的一个或多个字段,该第二源操作对象用于存储微线程id;和/或用于指示第三源操作对象的一个或多个字段,该第三源操作对象用于存储要被写入的状态(寄存器)的枚举值,操作码用于指示特定微线程的寄存器状态的写入。在一些示例中,此种转译由软件的转译和/或仿真层来执行。在一些示例中,转译由转译电路来执行。
在2703处,对第二指令集体系结构的一个或多个经转译的指令进行解码。在一些示例中,转译和解码被合并。
在2705处,对第二指令集体系结构的经解码的一个或多个指令进行调度。
在2707处,由诸如本文中所详述的执行电路(硬件)之类的执行电路(硬件)执行第二指令集体系结构的经解码的(一个或多个)指令,以执行由第一指令集体系结构的单个指令的操作码指示的(一个或多个)操作。对于SSAWRITE指令,执行将使执行电路写入SSA的特定位置。特定位置的地址是通过使用指向通用SSA的指针并随后进一步从微线程ID(其指示SSA的用于该写入的特定部分)以及随后从枚举值(其指示SSA的特定部分的特定位置)进一步细化在SSA中的何处来提供的。在一些示例中,在2709处,对(一个或多个)指令进行提交或引退。
微线程(uT)执行中的异常
微线程模式下发生的异常将使状态转储(dump)到SSA,并且将代理执行回到正常的主机执行。在大多数示例中,微线程状态不被复制回到主机线程。在异常时可见的主机寄存器状态是UTNTR指令时的主机寄存器状态。所有的微线程状态均被保持在保持区域中,并且在一些示例中,异常向量被用于定义SyMT错误(例如,使用SyMT_EXCEPTION_VECTOR(SyMT_异常_向量))。在一些示例中,在异常时,所有的微线程均在异常时中止。在一些示例中,仅有问题的微线程中止。在一些示例中,异常、错误等处置在微代码的控制之下进行。
可能存在支持针对SyMT的新的异常类型的若干理由,诸如以下中各项的一项或多项:1)由于微线程并非OS可见的线程,因此在一些示例中,在“正常操作”与微线程执行之间,行为可能是不同的;2)批量错误递送避免在微线程模式与OS内核之间多次往返;和/或3)异常向量在OS内核中定位针对SyMT的改变并防止对在现有错误处置程序中引入微线程特定的处置代码的需要。
在主机模式下,SyMT特定的错误处置程序可以访问SSA以诊断错误,执行所要求的动作,并且潜在地重启SyMT模式的执行。为了指示错误是否在微线程模式下发生,在一些示例中,软件使用FRED事件类型来对事件进行诊断。
与批量SyMT错误一起被递送的错误代码不保证是唯一的。也就是说,多种错误类型可以同步地被递送。例如,针对微线程的子集的#PF和针对微线程的不相交的子集的#DIV错误两者能够在SyMT错误递送机制的同一调用中被递送是可能的。对出错的线程向量进行走查并适当地诊断故障是系统软件的工作。
先前描述的批量错误体系结构具有潜在的竞争——如果在SyMT模式下发生外部中断而线程的某个子集将要引退捕获(trapping)指令,则必须注意避免丢失所捕获的微线程状态。存在至少两种解决方案来解决该问题:1)防止中断在捕获指令被引退的同时被递送(如果在SyMT模式期间发生外部中断,则该外部中断将以与它在非SyMT模式下会被递送的方式相同的方式被递送至主机OS。微代码将使适当的微线程状态保存至保存区域,使得SyMT模式可以在中断已经被处理之后被重新进入);2)向SyMT状态区域添加附加标量字段,以处置在SyMT模式下发生的任何外部事件/中断(在SyMT模式下发生的事件将导致执行被重定向至SyMT批量错误处置程序。作为该处置程序的部分,软件将必须通过检查SSA中的适当字段来检查外部中断是否已经发生。微代码将适当的微线程状态保存至保存区域,使得SyMT模式可以在中断已经被处理之后被重新进入)。
在一些示例中,SyMT将FRED事件递送机制用于微线程错误。FRED事件递送将48字节的信息保存在主机处理器的栈上。通过FRED事件递送入栈的前8个字节传输与正在被递送的事件有关的信息。SyMT模式向FRED体系结构添加新的事件类型来指示在微线程模式下发生的异常。
图28图示用于FRED事件递送的方法的示例。例如,该方法要由FRED逻辑130执行。在2801处,作出对FRED事件递送是否被配置的确定。例如,是否CR4.FRED=IA32_EFER.LMA=1?如果否(在2801中,“否”),则在2803处使用非FRED事件递送。
当FRED被配置(在2801中,“是”),则在2805处作出对新上下文的状态的确定。由FRED事件递送调用的事件处置程序的上下文包括一个或多个段寄存器(例如,CS和SS)、指令指针(例如,RIP)、标志寄存器(例如,EFLAGS、RFLAGS)、栈指针(RSP)、以及段的基址(例如,GS.base)。如果管理程序影子栈被启用,则上下文还包括影子栈指针(SSP)。
FRED事件递送通过在必要时加载这些寄存器来建立该上下文。要被加载到RIP、RFLAGS、RSP和SSP的值取决于旧上下文、正在被递送的事件的性质、以及软件配置。
取决于事件发生时的CPL,FRED事件递送使用两个入口点。这允许事件处置程序标识适当的返回指令(例如,ERETU——返回至用户模式,或者ERETS——返回至管理程序模式)。具体而言,对于CPL=3时发生的事件,FRED事件递送建立的新的RIP值是(IA32_FRED_CONFIG&~FFFH),并且对于在CPL=0时发生的事件,该值是(IA32_FRED_CONFIG&~FFFH)+26。
由FRED事件递送建立的新的RFLAGS值可以是具有在IA32_FMASK MSR中被设置的位置中的、以及由ISA定义的某些固定位置处的被清除的比特(后者确保特定的比特(例如RFLAGS.RF和RFLAGS.TF)将为零)的旧值。
FRED转变可支持多个(例如,4个)不同的栈以供在环0中使用。当前使用中的栈用被称为当前栈级别(CSL)的2比特值来标识。
FRED事件递送确定事件的栈级别,并且随后使用该栈级别来确定CSL是否应当改变。事件的栈级别基于CPL、事件的性质和类型、事件的向量(对于某些事件类型)和/或由系统软件配置的MSR:1)如果事件在CPL=3时发生,不是在事件递送期间遇到的嵌套异常,并且不是双重故障(#DF),则事件的栈级别为0;2)如果事件在CPL=0时发生,是在事件递送期间遇到的嵌套异常,或者是#DF,则至少一项以下项目适用:如果事件是可掩蔽的中断,则事件的栈级别是用于中断的栈级别(在IA32_FRED_CONFIG[10:9]中);如果事件是具有由ISA固定的向量的异常或特殊的中断(例如,NMI),则事件的栈级别是值IA32_FRED_STKLVLS[2v+1:2v],其中v是事件的向量(在范围0-31中);以及,所有其他事件的栈级别均为0。
如果事件在CPL=3时发生,则新的栈级别是该事件的栈级别;否则,新的栈级别是CSL和该事件的栈级别中的最大值。
在确定了新的栈级别之后,新的RSP值被标识如下:1)如果CPL或栈级别中的任一者正在改变,则新的RSP值将是与新的栈级别相对应的FRED_RSP MSR的RSP值;2)否则,新的RSP值将是当前RSP值被递减操作系统指定的、栈上的受保护区域的大小。在任一情况下,随后可将新的RSP值与64字节边界对齐。
如果管理程序影子栈被启用,则新的SSP值可被确定如下:如果CPL或栈级别中的任一者正在改变,则新的SSP值将为与新的栈级别相对应的FRED_SSP MSR的SSP值。新的SSP可受制于以下情况:如果新的栈级别为0并且IA32_PL0_SSP[2]=1,则通用保护错误(#GP)发生。由于每个FRED_SSP MSR的比特0为MSR的经验证的比特,因此该比特不被加载到SSP中,并且替代地,新的SSP值的比特0始终为零。否则,新的SSP将是当前SSP值递减OS指定的、栈上的受保护区域的大小。
在2807处,至少将旧状态保存到一个或多个栈上。FRED事件递送可将与旧上下文有关的信息保存在事件处置程序的栈上。事件处置程序的栈的最高的40字节可包含按与遵循IDT事件递送的格式相同的格式的上下文。FRED事件递送还可保存与正在被递送的事件有关的信息以及将引导后续的返回指令的辅助信息。当管理程序影子栈被启用时,FRED事件递送还可将信息保存在事件处置程序的影子栈上。注意,用于将信息存储在栈上的存储器访问可利用管理程序特权来执行。
FRED事件递送可将信息的64个字节保存在常规栈上。在这样做之前,RSP用上文所讨论的新的所确定的值来加载,并且该值被用于引用新的栈。注意,如果FRED事件递送在该点之后引发嵌套异常或VM退出,则嵌套异常或VM退出在CPU递送该嵌套异常或VM退出之前恢复在第一事件发生之前在RSP中的值。
以下各项中的一项或多项被入栈至栈上:被入栈的前8个字节(64字节栈框架的字节63:56)始终为零;被入栈的接下来的8个字节(字节55:48)包含事件数据并被定义如下:1)如果正在被递送的事件是页错误(#PF),则被入栈的值是页错误加载到诸如CR2之类的控制寄存器中的值(一般而言,这是出错的线性地址);2)如果正在被递送的事件是调试异常,则事件数据标识调试异常的性质(例如,比特3:0——当被设置时,这些比特中的每个比特指示对应的断点条件被满足。这些比特中的任何比特即使在其对应的、DR7中的启用比特未被设置的情况下也可被设置;比特10:4当前未被定义;比特11指示调试异常的原因是总线锁的获取;比特12当前未被定义;比特13指示调试异常的原因是“调试寄存器访问被检测到。”;比特14指示调试异常的原因是单个指令的执行;比特15当前未被定义;比特16指示调试异常(#DB)或断点异常((#BP)在RTM区域内部发生,同时事务性区域的高级调试被启用;比特63:17当前未被定义);3)如果正在被递送的时间是设备不可用异常,则被入栈的值是设备不可用异常在扩展特征禁用(extended feature disable,XFD)错误MSR(例如,IA32_XFD_ERR MSR)中建立的值,该MSR在扩展特征禁用引起设备不可用错误时被加载;以及4)对于任何其他事件,被入栈的值为0。注意,在一些示例中,不可掩蔽的中断和/或双重错误常规地被递送,而除法、调试、无效操作码、通用保护、页错误、对齐检查、机器检查、SIMD异常、CET异常、和/或虚拟化异常使用FRED来处置并且由SSA的SyMT_EXCEPTION_VECTOR(SyMT_异常_向量)来指示。
被入栈的接下来的8字节(字节47:40)包含事件信息。在一些示例中,这些64比特的信息具有以下格式:比特15:0包含错误代码(仅针对某些异常被定义;如果不存在这些异常,则为0)(注意,对于SyMT,错误代码由SSA的SyMT_ERROR_CODE提供);比特31:16未被使用并被保存为零;比特39:32包含事件的向量(在一些示例中,针对使用FRED事件递送而非IDT事件递送的系统调用或系统进入指令,向量1和向量2分别被使用);比特47:40未被使用并被保存为0;比特51:48如下对事件类型进行编码:0=外部中断;2=不可掩蔽的中断;3=硬件异常(例如,页错误);4=软件中断(INT n);5=有特权软件异常(INT1);6=软件异常(INT3或INTO);7=其他事件(用于例如SYSCALL和SYSENTER);8=SyMT;比特63:53不被使用并被保存为0。
被入栈的其余40字节(字节39:0)是返回状态,并且例如一般具有与由IDT事件递送使用的格式相同的格式。这些反映主机模式状态(即,在UTNTR被执行之前的状态)。以下项目详述栈上的从底部(最高地址)到顶部的返回状态的格式:1)被中断的上下文的SS选择符(64比特字段的低16比特),其中该字段的比特63:16被清除为0;2)被中断的上下文的RSP(64比特);3)被中断的上下文的RFLAGS(64比特),其中RFLAGS字段的比特16(对应于RF比特)在与IDT事件递送做同样的事情对事件进行递送时(这些是除指令断点以外的错误)以及指令的部分执行之后(例如,在REP前缀的串指令的迭代之间)递送的任何陷阱或中断时被保存为1。其他事件的递送将RFLAGS.RF在事件发生时所具有的值保存在比特16中;4)被中断的上下文的CS选择符(64比特字段的低16比特)。FRED事件递送将附加信息保存在该字段的较高部分中(该信息引导FRED返回指令的执行):如果正在被递送的事件是不可掩蔽的中断(non-maskable interrupt,NMI),则比特16被设置为1,并且否则被清除为0,比特17针对SYSCALL、SYSENTER或INT n(对于任何n值)的FRED事件递送被设置为1,并且否则被清除为0;如果通过STI进行的中断封锁在异常发生时生效,则针对异常的FRED事件递送,比特18被设置为1,并且否则比特18被清除为0;比特23:19被清除为0;比特25:24:针对在CPL=0时发生的事件的递送,这些比特报告事件发生时的当前栈级别(CSL),并且针对在CPL=3时发生的事件的递送,这些比特被清除为0;比特63:26被清除为0;5)被中断的上下文的RIP(64比特)。如果事件类型是软件中断(INT n)、有特权软件异常(INT1)、软件异常(INT3或INTO)或其他事件(当用于SYSCALL或SYSENTER时);则所保存的RIP值引用引起正在被递送的事件的指令之后的指令。(如果此类事件的递送遇到异常,则由异常的递送保存的RIP值将引用引起原始事件的指令。)
当管理程序影子栈被启用时,信息被保存在影子栈(例如,影子栈120)上。FRED事件递送如何与影子栈进行交互取决于新的值是否正在被加载到SSP中。如果CPL或栈级别中的任一者正在改变,则新的SSP值从与新的栈级别相对应的FRED_SSP MSR被加载。在此种情况下,对该新的影子栈检查令牌。此种令牌管理可不同于针对IDT事件递送进行的令牌管理。FRED令牌管理取决于FRED_SSP MSR是否已经被验证(通过MSR的比特0被设置来指示)。如果MSR尚未被验证,则FRED事件递送如下所述将新的影子栈的基址标记为具有忙令牌。它从SSP(其恰从该MSR被加载)中的地址读取8字节,锁定地址读取。如果读取的值等于SSP值(指示有效的空闲令牌),则锁被释放,并且该值被写回但其中比特0被设置(指示令牌现在为忙)。该同一值被加载到MSR中。这对MSR的比特0设置,指示该MSR已经被验证。否则,锁被释放,值在不变的情况下被写回,并且发生通用保护错误。如果MSR已经被验证,则新的影子栈的基址具有有效的忙令牌的确认通过从SSP中的地址读取8字节来执行。如果所读取的值不等于比特0被设置(指示忙令牌)的SSP值,则发生通用保护错误。
在任一情况下(CPL或栈级别改变),SSP用新的值来加载。注意,如果FRED事件递送随后引发嵌套异常或VM退出,则旧的SSP值隐式地被恢复。
如果CPL和栈级别两者均不是正在变化,则SSP并非从FRED_SSP MSR被加载。替代地,如果当前的SSP值不是8字节对齐的,则4字节的0被入栈在影子栈上,从而得到8字节对齐的SSP值。
如果正在被递送的事件在CPL=0时发生,则旧的CS选择符、旧的线性指令指针、以及旧的SSP被入栈至影子栈上。如果SSP已经从FRED_SSP MSR被加载,则在上文概述的令牌管理之后,这些入栈操作到的新的影子栈上;如果其尚未被加载,则现有的影子栈(例如,影子栈120)被使用。这三个值中的每个值被入栈在影子栈(例如,影子栈120)上的单独的8字节字段中。
在保存旧的上下文和其他信息之后,在2809处,寄存器被加载以建立新的上下文。对于在CPL=3时发生的事件,CS、SS和GS段以及IA32_KERNEL_GS_BASE MSR可被更新。对于CS,选择符被设置为IA32_STAR[47:32]AND(“与”)FFFCH(强迫CS.RPL为0),基址被设置为0。限制被设置为FFFFFH并且G比特被设置为1,类型被设置为11(执行/读取所访问的代码)并且S比特被设置为1,并且DPL被设置为0,P比特和L比特各自被设置为1,并且D比特被设置为0。对于SS,选择符被设置为IA32_STAR[47:32]+8,基址被设置为0。限制被设置为FFFFFH并且G比特被设置为1,类型被设置为3(读取/写入所访问的数据)并且S比特被设置为1,并且DPL被设置为0,并且P比特和B比特各自被设置为1。对于GS,GS基址的值和IA32_KERNEL_GS_BASE MSR中所存储的值被交换。
对于在CPL=0时发生的事件,不存在对CS、SS或GS的修改。在更新段寄存器之后(如果完成),RIP、RFLAGS和CSL利用之前确定的值被更新。
如果事件在CPL=3时发生并且用户影子栈被启用,则IA32_PL3_SSP MSR用SSP的旧值来加载。被加载到MSR中的值可被调整,以使得比特63:N得到比特N-1的值,其中N是CPU的最大线性地址宽度。
如果管理程序间接分支跟踪被启用,则IA32_S_CET MSR可被更新,以将TRACKER(跟踪器)的值设置为WAIT_FOR_ENDBRANCH(等待_分支结束)并将SUPPRESS(抑制)比特清除为0。
下文是对处置页不存在异常的粗略描述。微线程“n”生成最终针对指令“i”导致页错误的地址。当指令i尝试引退时,分配/重命名/引退电路215中的逻辑检测异常。微代码将来自所有微线程的状态保存至SSA。这包括保存除GPR和向量寄存器状态之外的逐微线程控制寄存器和错误代码。微代码在SSA中的SYMT FAULT BITMAP(SyMT错误比特映射)比特向量中标记出错的线程。由此,微代码在SSA中保存了足够的微体系结构特定状态,使得执行可以在错误已经被处置之后被重启。
微代码随后转变至正常的主机执行模式,代表SyMT模式标记异常,并且跳转至具有在异常帧中设置的SyMT事件类型的FRED错误入口点。微代码将主机UTNTR的IP作为出错的指令进行报告。出错微线程的错误向量将反映错误类型。
非SyMT OS错误处置程序检查错误是否由于SyMT执行而引起的。如果是,则它使用SSA中的状态适当地处置错误。OS错误处置程序最终将利用UTNTR指令的IP来执行ERETU(或类似的)指令。ERETU指令将重启UTNTR指令处的执行。微代码使用保存的状态来重启执行。
图32图示批量页错误处置的示例。如所示,OS使用SyMT区域中的SyMT_EXCEPTION_VECTOR字段来接收SyMT错误,以对逐微线程页错误进行解码。
在一些示例中,在SyMT中支持系统调用。在SyMT模式下,被递送的FRED事件类型保持为“SYMT”事件(例如,在该情况下,FRED系统调用事件类型未被递送)。来自SSA的异常向量字段和出错微线程比特映射(SyMT_FAULT_BITMAP被设置,以指示哪个微线程出错)被操作系统用来对给定的微线程正在执行系统调用操作进行解码。
如稍早时所述,处理器(诸如,处理器101)可以支持虚拟化(例如,典型地在计算机上运行并向其他软件呈现一个或多个虚拟机(VM)的抽象的虚拟机监视器(VMM)或管理程序的使用)。每个虚拟机可以作为自包含平台来运作,运行其自身的“宾客机操作系统”(即,由VMM主控的操作系统(OS))和其他软件,统称为宾客机软件。宾客机软件期望像在专用计算机而不是虚拟机上运行一样地操作。即,宾客机软件期望控制各种事件并具有对硬件资源的访问权。硬件资源可以包括处理器驻留的资源(例如,控制寄存器)、驻留在存储器中的资源(例如,描述符表)、以及驻留在底层硬件平台上的资源(例如,输入-输出设备)。事件可以包括内部中断、外部中断、异常、平台事件(例如,初始化(INIT)或系统管理中断(systemmanagement interrupt,SMI)),等等。
在虚拟机环境中,VMM应当能够对先前段落中所描述的事件和硬件资源具有最终控制,以提供在虚拟机上运行的宾客机软件的适当操作,并提供来自在虚拟机上运行的宾客机软件以及在虚拟机上运行的宾客机软件之间的保护。为了实现这一点,VMM典型地在宾客机软件访问受保护的资源时或在发生其他事件(诸如,中断或异常)时接收控制。例如,当VMM支持的虚拟机中的操作使得系统设备生成中断时,当前运行的虚拟机被中断,并且处理器的控制被传递至VMM。VMM随后接收中断并自己处置该中断,或者调用适当的虚拟机并将该中断递送至该虚拟机。
图29图示一些示例在其中操作的虚拟机环境2900。在虚拟机器环境2900中,裸机平台硬件2910包括可以例如能够执行标准操作系统(OS)和/或虚拟机器监视器(VMM)(诸如,VMM 2912)的计算平台。图29示出三个VM——2930、2940和2950。在每个虚拟机上运行的宾客机软件可以包括宾客机OS,诸如,宾客机OS 2954、2960或2970以及各种宾客机软件应用2952、2962和2972。
宾客机OS 2954、2960和2970期望访问这些宾客机OS正在其上运行的对应VM(例如,VM 2930、2940和2950)内的物理资源(例如,处理器寄存器、存储器、以及输入-输出(input-output,I/O)设备),并期望执行其他功能。例如,根据VM中呈现的处理器和平台的体系结构,宾客机OS期望具有对所有寄存器、缓存、结构、I/O设备、存储器等等的访问权。可以由宾客机软件访问的资源可以被分类为“有特权的”或“无特权的”。对于有特权资源,VMM2912在保留对这些有特权资源的最终控制的同时促进宾客机软件期望的功能。无特权资源不需要受VMM 2912控制,并且可以由宾客机软件访问。
进一步地,每个宾客机OS期望处置各种错误事件,诸如,异常(例如,页错误、通用保护错误等)、中断(例如,硬件中断、软件中断)和平台事件(例如,初始化(INIT)和系统管理中断(SMI))。这些错误事件中的一些是“有特权的”,这是因为它们必须由VMM 2912处置以确保VM2930至2950的适当操作并确保来自宾客机软件以及在宾客机软件之间的保护。
当有特权错误事件发生或宾客机软件尝试访问有特权资源时,控制可被转移至VMM 2912。控制从宾客机软件到VMM 2912的转移在本文中被称为VM退出。在促成资源访问或适当地处置事件之后,VMM 2912可将控制返回至宾客机软件。控制从VMM 2912到宾客机软件的转移中被称为VM进入。VMM 2912可通过执行VM进入指令来请求处理器2918执行VM进入。
处理器2918(例如,处理器101)可根据虚拟机控制结构(virtual machinecontrol structure,VMCS)2926中所存储的数据来控制VM 2930、2940和2950的操作。VMCS2926是可包含以下各项的结构:宾客机软件的状态、VMM 2912的状态、指示VMM 2912希望如何控制宾客机软件的操作的执行控制信息、控制VMM 2912与VM之间的转变的信息。VMCS可被存储在存储器2920中。可使用多个VMCS结构来支持多个VM。
当发生有特权错误事件时,VMM 2912可自己处置错误,或者决定错误需要由适当的VM来处置。如果VMM 2912决定错误要由适当的VM来处置,则VMM 2912请求处理器2918调用该VM并将错误递送至该VM。VMM 2912可以通过将错误指示符设置为递送值并生成VM进入请求来完成这一点。错误指示符可以被存储在VMCS 2926中。
处理器2918包括错误递送逻辑2924,该错误递送逻辑2924接收VMM 2912对VM进入的请求,并确定VMM 2912是否已经请求了错误到VM的递送。错误递送逻辑2924可基于VMCS2926中所存储的错误指示符的当前值来作出此种确定。如果错误递送逻辑2924确定VMM已经请求了错误到VM的递送,则它在将控制转变至VM时将错误递送至该VM。注意,FRED逻辑130可以是错误递送逻辑2924的部分,或者与错误递送逻辑2924一起工作。
错误的递送可涉及:对重定向结构搜索与正在被递送的错误相关联的条目,从该条目提取被指定用于处置该错误的例程的位置的描述符,以及使用该描述符跳转至该例程的起始。被指定用于处置对应中断、异常或任何其他错误的例程被称为处置程序。在一些指令集体系结构(ISA)中,某些错误与错误代码相关联,这些错误代码可能需要在跳转到处置程序的起始之前被入栈至栈上(或被提供在硬件寄存器中或通过其他手段被提供)。
在错误的递送期间,处理器2918可执行一个或多个地址转译,将地址从虚拟形式转换成物理形式。例如,中断表的地址或相关联的处置程序的地址可以是虚拟地址。处理器还可能需要在错误的递送期间执行各种检查。例如,处理器可执行一致性检查,诸如,分段寄存器和访问地址的验证(引起限制违反错误、段不存在错误、栈错误等)、许可级别检查(其可引起保护错误(例如,通用保护错误))等。
错误向量化期间进行的地址转译和检查可能引起各种错误,诸如页错误、通用保护操作等。在当前错误的递送期间发生的一些错误可能引起VM退出。例如,如果VMM 2912要求在页错误时的VM退出以保护物理存储器并使物理存储器虚拟化,则在当前错误到VM的递送期间发生的页错误将引起VM退出。
错误递送逻辑2924可通过检查当前错误的递送是否成功来解决以上附加错误的可能出现。如果错误递送逻辑2924确定递送未成功,则它进一步确定得到的附加错误是否引起VM退出。如果是,则错误递送逻辑2924生成VM退出。如果否,则错误递送逻辑2924将附加错误递送至VM。
图30是用于在虚拟机环境中处置故障的过程的示例的流程图。要注意的是,如图30中示出的此种示例独立于其他示例性方法。过程可以由处理逻辑执行,该处理逻辑可以包括硬件(例如,电路、专用逻辑、可编程逻辑、微代码等)、软件(诸如,在通用计算机系统或专用机器上运行的软件)或这两者的组合。过程3000可以由错误递送逻辑2924和/或FRED逻辑130执行。
参考图30,过程3000开始于:处理逻辑接收将控制从VM转变至VMM的请求(框3002)。转变控制的请求可通过由VMM执行的VM进入指令而被接收。
在决策框3004处,处理逻辑确定VMM是否已请求错误到要被调用的VM的递送。错误可以是内部中断(例如,软件中断)、外部中断(例如,硬件中断)、异常(例如,页错误)、平台事件(例如,初始化(INIT)或系统管理中断(SMI))或任何其他错误事件。处理逻辑可以通过读取由VMM维护的错误指示符的当前值来确定VMM是否已请求错误的递送。错误指示符可驻留在VMCS中或者驻留在VMM和处理逻辑可访问的任何其他数据结构中。当VMM想要使错误被递送到VM时,VMM可将错误指示符设置为递送值,并随后生成将控制转移至该VM的请求。如果在VM进入期间不需要错误递送,则VMM在请求控制到VM的转移之前将错误指示符设置为无递送值。
如果处理逻辑确定VMM已经请求了错误的递送,则处理逻辑将该错误递送至VM,同时将控制转变至VM(框3006)。处理逻辑随后检查错误的递送是否成功(决策框3008)。如果是,则过程3000结束。如果否,则处理逻辑确定得到的附加错误是否引起VM退出(决策框3010)。如果是,则处理逻辑生成VM退出(框3012)。如果否,则处理逻辑将附加错误递送至VM(框3014),并且返回至框3008,检查该附加错误是否被成功递送。如果是,则过程3000结束。如果否,则处理逻辑返回至决策框3010。
如果处理逻辑确定VMM还未请求错误的递送,则处理逻辑在不执行任何错误相关操作的情况下将控制转变至VM(框3018)。
当处理逻辑需要向VM递送错误时,它可以对重定向结构(例如,本文中被称为IA-32ISA中的中断描述符表)搜索与正在被递送的错误相关联的条目,可以从该条目提取与该错误相关联的处置程序的描述符,并且可以使用该描述符跳转到该处置程序的起始。中断描述符表可以使用错误标识信息进行搜索,该错误标识信息诸如错误标识符和错误类型(例如,外部中断、内部中断、不可掩蔽的中断(NMI)、异常等)。某些错误(例如,一些异常)可能与错误代码相关联,这些错误代码需要在跳转到处置程序的起始之前被入栈至栈上(或被提供在硬件寄存器中或通过其他手段被提供)。错误标识信息和相关联的错误代码可由VMM使用指定的数据结构来提供。指定的数据结构可以是VMCS的部分。
图31图示VMCS的示例。每个虚拟机是支持栈(并潜在地支持影子栈)的宾客机软件环境,包括例如操作系统和应用软件。每个VM可独立于其他虚拟机来操作,并且使用去往由物理平台提供的(一个或多个)处理器、存储器、存储装置、图形器件和I/O的同一接口。软件栈像软件栈在不具有VMM的平台上运行一样地行动。例如,根据VMM的设计或支配VMM的策略,在虚拟机中执行的软件以降低的特权级别或其原始特权级别操作,以使得VMM可以保留对平台资源的控制。
VMM可开始虚拟机扩展(VMX)根操作模式。VMM通过调用VM进入指令来开始宾客机执行。VMM调用启动指令,以用于虚拟机的第一VM进入的执行。VMM调用重新开始,以用于该虚拟机的所有后续VM进入的执行。
在虚拟机的执行期间,各种操作或事件(例如,硬件中断、软件中断、异常、任务切换、以及某些VM指令)可引起到VMM的VM退出,此后,VMM再次获得控制。VM退出将控制转移至由VMM指定的入口点,例如,主机指令指针。VMM可进行对于VM退出的原因而言适当的行动,并且随后可使用VM进入返回至虚拟机。
在一些示例中,SyMT模式要求对VMX和管理程序的添加。与非虚拟化行为类似,批量VM退出将针对非VMX根模式下的微线程的退出条件(异常、VM退出)而被生成。SyMT模式下的批量VMX退出的现实示例是自旋环路锁,其使用“暂停”指令作为用于未能对锁进行采集的线程的节流机制。尽管可以想象到VMX控制可被配置成用于避免SyMT模式下的大多数批量VMX退出,但是为了支持VMX体系结构并提供与非VMX模式的正交性,我们已经决定将批量错误机制扩展到SyMT模式。
VM进入和VM退出的这些转变受存储器中存储的VMCS2926数据结构控制。处理器通过由VMM设置的被称为VMCS指针的处理器状态的分量(针对每个虚拟处理器有一个)来控制对VMCS 2926的访问。VMM可针对它支持的每个虚拟处理器使用不同的VMCS。对于具有多个虚拟处理器的虚拟机,VMM可以针对每个虚拟处理器使用不同的VMCS 2926。
VMCS 2926可包括六个逻辑字段组:宾客机状态区域3102、主机状态区域3104、VM执行控制字段3106、VM退出控制字段3108、VM进入控制字段3110、以及VM退出信息字段3112。这六个逻辑字段组仅仅是示例性的,并且其他处理器可具有更多的或更少的字段组。
VM执行控制字段3106定义处理器2918应当如何响应于在VM中发生的不同事件而作出反应。VM退出控制字段3108可定义处理器在其从虚拟机退出时应当做什么,例如,将VM的宾客机状态存储在VMCS 2926中并从VMCS 2926加载VMM(或主机)状态。VMM状态可以是包括与处理器寄存器相对应的字段的主机状态,包括VMCS指针、针对段寄存器的选择符字段、针对相同段寄存器中的一些的基址字段、以及被用于以下各项的型号特定寄存器(MSR)的列表的值:调试、程序执行追踪、计算机性能监测、以及切换某些处理器特征。
在SyMT模式下,并非所有的退出条件都有意义,例如,由于外部异常引起的VM退出预期是SyMT不知晓的。下表中的一列VMX退出是出于正确性而在SyMT模式下要求专门的处置的退出。下表提供VM执行控制字段3106的示例。
为了在VMX模式下支持SyMT批量错误机制工作,在一些示例中,VMCS中的若干现有字段被扩展用于微线程。具体而言,以下VMCS退出字段3108对于每个微线程都是必要的:退出原因(对VM退出的原因进行编码);退出资格(与由于调试异常、页错误异常、启动IPI、任务切换、控制寄存器访问、I/O指令、等待等造成的退出有关的附加信息);宾客机线性地址;以及宾客机物理地址。
在一些示例中,VMCS 2926被扩展,以容纳附加的逐微线程字段。在一些示例中,这些附加的值被存储在SSA中。被添加至SyMT状态区域的附加字段仅在VMX根模式下是可访问的,并且SSA中的VMX相关字段在VMResume(VM重新开始)指令时被清除。
VM进入控制字段3110可定义处理器在进入到虚拟机时应当做什么,例如,以便有条件地从VMCS加载虚拟机的宾客机状态(包括调试控制)并在必要时在进入期间向虚拟机注入中断或异常。
宾客机状态区域3102可以是在从虚拟机退出或进入到虚拟机时处理器将VM处理器状态存储在的位置。
宾客机状态区域3104可以是在从虚拟机退出时处理器将VMM处理器(或主机)状态存储在的位置。
VM退出信息字段3112可以是处理器将描述从虚拟机退出的原因的信息存储在的位置。VM嵌套异常支持改变VM退出建立某些VM退出信息字段3112的方式以及VM进入使用相关的VM进入控制字段3110的方式。
VMM(或其主控操作系统)应当能够使用FRED转变以及所允许的宾客机软件来这样做。出于该原因,VM转变(VM进入和VM退出)必须建立足以支持紧接在该转变之后的FRED事件递送的上下文。另外,VM退出应当能够在为VMM加载对应的宾客机上下文之前保存该宾客机上下文。
VMM(或其主控操作系统)应当能够使用FRED转变并允许宾客机软件这样做。出于该原因,VM转变(VM进入和VM退出)建立足以支持紧接在该转变之后的FRED事件递送的上下文。另外,VM退出应当能够在为VMM加载对应的宾客机上下文之前保存该宾客机上下文。
在一些示例中,SyMT支持调试。例如,当发生调试异常时,操作系统对SyMT保存区域进行扫描,以确定是哪个线程引起了该调试异常。此种方案对代码断点有效,因为RIP被保存在SyMT状态区域中;然而,它将对数据断点无效,这是因为当前不存在体系结构上定义的方式来逐微线程地跟踪上一数据地址。
在一些示例中,为了支持数据断点,SyMT状态区域可以被扩充为具有用于将调试状态寄存器(DR6)扩展为微线程感知的比特向量。
4比特向量中的每一个都与给定的调试寄存器相关联(例如,调试寄存器0与比特向量0相关联)。比特向量中的条目与微线程相对应。当微线程遇到调试时(地址由DR0至DR3跟踪),与该微线程ID相对应的比特位置在适当的比特向量中被更新。作为示例,如果线程3执行到由DR2跟踪的地址的存储,则第3调试比特向量的第4比特将被设置。
在一些示例中,调试控制寄存器(DR7)是具有用于使寄存器是线程感知的类似比特向量方案的扩充。在此种方案中,附加的4比特向量逐微线程地控制DR0至DR3寄存器中的每一者。
在一些示例中,DR0至DR7针对每个线程重复。
一般而言,SyMT模式下的性能计数针对引退处的每个微线程被更新。此种方案通过给定指令的活跃线程的数量来更新每个计数。针对SyMT特定事件,附加计数被添加以跟踪一些示例中的聚合方案丢失的信息。
在一些示例中,在SyMT模式下对最后分支记录(last branch record,LBR)的支持是向LBR栈添加“LBR_SyMT_信息(“LBR_SYMT_INFO”)”字段。将LBR栈扩充为具有“LBR_SYMT_INFO”允许对引退SyMT微线程掩码的跟踪。
为了支持SyMT模式下的处理器追踪能力,在一些示例中,引退微线程掩码被包括在输出记录流中。处理器追踪解码器可以使用输出流中的保存的掩码来重建每个微线程的执行流。
图33图示使用SyMT编译器内联函数按C语言实现的DAXPY内核的示例。示例的逐行描述如下:1)行1至行4定义用于向微线程传递变量的结构;2)行5至行14对由微线程执行以实现在SyMT模式下执行的实际DAXPY内核的代码进行具体化。“_builtin_ia32_ugetgbl()”内联函数访问与所有活跃线程共享的不透明指针。编程人员已将该指针投射(cast)至类型“arg_t*”以提取内核变量。“__builtin_ia32_utcntxt()”内联函数访问当前正在执行的微线程的线程id。UTRET中止线程。
DAXPY具有被构造成使得工作在微线程之间交织的循环参数,以便提高存储器系统效率。最后几行设置、for、并且汇合微线程,并且在常规模式下被执行。“__builtin_ia32_utntr()”内联函数启动微线程。
软屏障提示
工作窃取是可被用于一些微线程化的程序的调度策略。为了实现工作窃取,每个核心或线程具有要执行的工作项(线程、任务等)的队列。典型地,工作项由要顺序地执行的一系列指令组成,但在其执行过程中,工作项可能生成要与它的其他工作并行地执行的新的工作项。当分叉出新的线程时,该新的线程被置于本地队列的顶部。当任务在处理器或线程上完成时,处理器或线程通过首先查看本地队列的顶部来查找准备好执行的任务。如果它发现任务,则它将任务从队列取出并运行该任务。如果本地队列为空,则处理器或线程检查其他处理器或线程的队列并从第一队列的底部窃取任务。
图34(A)-图34(D)图示工作窃取的示例。这些图示出多个微线程UT0 3411、UT13413、UT2 3415和UT3 3417以及它们相应的队列3401、3403、3405和3407。图34(A)示出UT03411执行任务A,这生成任务B,该任务B被置于针对UT0的工作队列(工作队列3401)中。图34(B)示出UT0 3411在任务A被完成后执行来自针对UT0的工作队列(工作队列3401)的任务B。注意,没有其他线程正在执行任务。
图34(C)示出UT0 3411执行任务B,这生成任务C和D,该任务C和D被置于针对UT0的工作队列(工作队列3401)中。如图34(D)中所示,尽管任务B仍正在UT0 3411上执行,但UT13413和UT2 3415分别窃取任务D和任务C。
SyMT效率可以被定义为程序执行期间群组中活跃的线程的平均数量。本文中详述了支持软屏障提示指令的实施例。在一些示例中,软屏障提示指令是针对具有控制流分散的程序(其中微线程可执行共同代码序列,但微线程由于路径串行化而在时间上是未对齐的)的硬件-软件解决方案。与软件屏障不同,所描述的软屏障提示同步化条件是采用硬件来管理的。软件屏障提示指令对于程序的正确性而言是不必要的,但传达了改善SyMT效率的机会。
图35-图38示出可受益于屏障提示的代码的示例,诸如跨循环迭代共同的代码或同一函数但不同调用。图35示出具有数据依赖的控制流分散的循环的示例。编译器辅助的PDOM或硬件最小IP启发法通常会在内循环之后在第5行处引发重新汇聚。在第3行处插入软屏障提示使得微线程不采用进行至下一迭代并潜在地执行由软屏障守护的区域中的昂贵的工作的分支。
图36图示具有含有变化的工作量的内循环的循环的示例。编译器辅助的后支配者(post-dominator,PDOM)或硬件最小IP(minimum-IP,min-IP)启发法通常会在内循环之后在第5行5引发重新汇聚。在第3行处插入软屏障提示有助于收集跨外层迭代的微线程并使SyMT效率最大化。图39图示软屏障提示如何进行帮助。在图的上半部中,微线程由于最小IP和PDOM而被串行化。注意,蓝色是序言,红色是昂贵的工作,并且绿色是结尾。由此,微线程的执行是交错的且低效的。下半部示出软屏障重新汇聚如何使得所有的微线程都能够并行地执行昂贵的工作。
图37图示其中共同函数调用具有昂贵的工作的示例。微线程多次执行函数调用,但并未保证这些微线程在时间上是对齐的。如所示在第2行处插入软屏障提示使微线程暂停,直到充分的条件被满足,以改善SyMT效率。
图38图示工作窃取运行时循环的更复杂的示例。执行循环的微线程针对任务检查其本地队列,并且如果未发现,则基于选择策略来挑选牺牲者以窃取任务。最终,设法得到有效任务的线程执行任务。由于工作窃取运行时典型地被用于表达分叉-汇合并行性,因此任务是类似的,并且恰在任务在“execute_task(执行_任务)”函数(在第6行和第11行处被调用)中被执行之前插入软屏障提示指令允许线程暂停和聚集,直到充分的条件被达到,以使SyMT效率最大化。注意,针对重新汇聚的基于编译器的解决方案会无法实现此类可能的重新汇聚提示,并且保证向前进展的纯软件解决方案可能无法在没有软屏障提示指令的情况下实现同样的效率。
如在上文的示例中所示,软屏障提示向底层硬件传输用于潜在的重新汇聚的区域。本文中详述的示例允许硬件实现方式能够负责标识候选微线程并管理重新汇聚。
软屏障提示指令在微线程的处理的解码阶段被检测。在一些示例中,在对提示指令进行解码时,取得阶段被清除,以暂停已经到达软屏障提示指令指针(instructionpointer,IP)处的微线程。微线程的暂停使得片段调度器203扼制那些微线程的指令被BPU204评估和/或被预取和/或被缓存。
解码阶段对软屏障数据结构255进行索引,该软屏障数据结构255存储软屏障IP以及与这些IP相关联的计数。例如,软屏障数据结构255可具有多个条目,其中每个条目包括IP和计数值。在一些示例中,计数值在重置时被设置为2。计数表示预期的微线程数量,在超时周期(其中软屏障提示指令发生的数量少于阈值(例如,0))之后被减半(或以其他方式被缩小),并且在预期微线程数量在超时之前达到软屏障IP时被加倍(或以其他方式被增加)。在一些示例中,软屏障提示有限状态机(finite state machine,FSM)253维护软屏障数据结构255。在没有发现匹配条目时,新的条目在软屏障数据结构255中被创建,以记录和跟踪参与软屏障区域的微线程的状态。
在一些示例中,软屏障提示指令在首次被取得时作为NOP来执行,不清除前端,并且仅经由FSM 253将其自身记录在软屏障数据结构255中。在一些示例中,软屏障数据结构255与BPU中现有的表合并,例如,通过扩展分支目标缓冲器(branch target buffer,BTB)的字段而与该BTB合并。
图40图示屏障提示FSM的动作的示例。如所提及,屏障提示FSM 253维护对已经到达软屏障的微线程的数量进行跟踪的计数器(并更新软屏障数据结构255),并且屏障提示FSM 253还维护满足屏障就绪条件所要求的预期微线程计数。最初,计数器开始于计数1,并且被重置为递增状态4001。如果预期数量的微线程到达软屏障提示IP,则屏障被视为就绪,并且在处于递增状态4001状态的同时,预期计数被加倍(在一些示例中,上限为群组大小的最大值)。为了确保向前进展,在屏障处被暂停的微线程最终将在超时计数器点火时被迫重新开始,并且状态转变至递减状态4003,其中预期的线程计数减半。反复的超时减少了预期的线程计数,在递减状态4003下,其上限为最小值1,并且如果在处于递减状态4003状态下的同时预期微线程计数达到提示IP,则状态转变至递增状态4001状态。当屏障被视为准备好被释放(由于超时或者在满足微线程阈值计数时)时,解码阶段将取得阶段重定向至提示指令之后的下一IP,以重新开始被暂停的微线程的并行执行。在一些示例中,微代码254使用屏障提示FSM 253作出对屏障何时被视为准备好被释放的确定。
在一些实施例中,针对超时的计数值取决于微体系结构以及程序。在一些示例中,屏障提示FSM 253对超时计数值进行学习。在一些示例中,超时条件使用引退指令计数或代替于周期的其他微体系结构计数器。
不同于先前的方式(其使用硬编码值),软屏障提示硬件基于程序执行和可用的并行性针对SyMT效率动态地调整预期的微线程计数。
图41图示由处理器执行以处理软屏障指令的方法的示例。例如,SyMT逻辑111处理该指令。软屏障指令的执行引起软屏障提示操作发生。
在4101处,取得单个指令的实例。例如,取得SOFT-BARRIER HINT(软屏障提示)指令。单个指令具有用于操作码的字段,该操作码用于指示要发生软屏障提示操作。软屏障提示操作包括以下各项中的一项或多项:1)清除取得阶段;2)使调用该单个指令的实例(设置软屏障)的微线程的执行暂停;和/或使用FSM或其他机制来确定何时强迫微线程重新开始(例如,基于计数和/或超时)并维护软屏障数据结构。在一些示例中,SOFT-BARRIER HINT指令包括用作用于重新开始线程的阈值的计数的指示(例如,如果低于该计数并且超时期满则重新开始,或者在阈值已被满足时重新开始)。计数可被编码在立即数值中,或者被存储在所标识的位置(诸如寄存器)中。在一些示例中,SOFT-BARRIER HINT是指令的操作码助记符,并且在操作码字段4703中被具体化。
在4103处,对单个指令的所取得的实例进行解码。在解码阶段期间,经解码的指令如下文所详述的被处置,以使得软屏障提示操作中的一个或多个发生。在一些示例在,此种处置在解码器本身中发生(例如,使用微代码)。
在一些实施例中,在4109处,对指令进行引退。在一些实施例中,引退使得解码器208往回传输到片段数据结构202和/或片段调度器203。
下文详述的是执行以上示例的示例性体系结构、系统、指令格式等。
示例性计算机体系结构
下面详细描述示例性计算机体系结构。本领域中已知的用于膝上型电脑、桌面型电脑、以及手持式个人计算机(personal computer,PC)、个人数字助理、工程工作站、服务器、分解式服务器、网络设备、网络集线器、交换机、路由器、嵌入式处理器、数字信号处理器(digital signal processor,DSP)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备、以及各种其他电子设备的其他系统设计和配置也是适当的。总之,能够包含本文公开的处理器和/或其他执行逻辑的各种系统或电子设备一般都是适当的。
图42图示了示例性系统的示例。多处理器系统4200是一种点对点互连系统,并包括多个处理器,其中包括经由点到点互连4250耦合的第一处理器4270和第二处理器4280。在一些示例中,第一处理器4270和第二处理器4280是同构的。在一些示例中,第一处理器4270和第二处理器4280是异构的。虽然示例性系统4200被示出为具有两个处理器,但系统可具有三个或更多个处理器,或者可以是单个处理器系统。
处理器4270和4280被示为分别包括集成存储器控制器(integrated memorycontroller,IMC)电路4272和4282。处理器4270还包括作为其互连控制器的部分的点到点(point-to-point,P-P)接口4276和4278;类似地,第二处理器4280包括P-P接口4286和4288。处理器4270、4280可以利用点到点(P-P)接口电路4278、4288经由P-P互连4250交换信息。IMC 4272和4282将处理器4270、4280耦合到各自的存储器,即存储器4232和存储器4234,这些存储器可以是在本地附接到各个处理器的主存储器的一部分。
处理器4270、4280可以各自利用点到点接口电路4276、4294、4286、4298,经由各个P-P互连4252、4254来与芯片组4290交换信息。芯片组4290可以可选地经由接口4292与协处理器4238交换信息。在一些示例中,协处理器4238是专用处理器,例如高吞吐量处理器、网络或通信处理器、压缩引擎、图形处理器、通用图形处理单元(general purpose graphicsprocessing unit,GPGPU)、神经网络处理单元(neural-network processing unit,NPU)、嵌入式处理器,等等。
共享缓存(未示出)可以被包括在任一处理器4270、4280中,或者在两个处理器之外但经由P-P互连与这些处理器相连接,从而使得:如果一处理器被置于低功率模式,任一个或两个处理器的本地缓存信息也可以被存储在该共享缓存中。
芯片组4290可以经由接口4296耦合到第一互连4216。在一些示例中,第一互连4216可以是外围组件互连(Peripheral Component Interconnect,PCI)互连,或者是诸如PCI快速(PCI Express)互连或者另一I/O互连之类的互连。在一些示例中,这些互连中的一个耦合到功率控制单元(power control unit,PCU)4217,PCU 4217可以包括电路、软件和/或固件来执行关于处理器4270、4280和/或协处理器4238的功率管理操作。PCU 4217向电压调节器(未示出)提供控制信息,以使得电压调节器生成适当的调节电压。PCU 4217还提供控制信息以控制所生成的操作电压。在各示例中,PCU 4217可以包括各种功率管理逻辑单元(电路)来执行基于硬件的功率管理。这种功率管理可以是完全由处理器控制的(例如,由各种处理器硬件控制,并且可以由工作负载和/或功率约束、热约束或其他处理器约束所触发),和/或功率管理可以响应于外部源而被执行(例如平台或功率管理源或系统软件)。
PCU 4217被图示为作为与处理器4270和/或处理器4280分开的逻辑而存在。在其他情况下,PCU 4217可以在处理器4270或4280的核心(未示出)中给定的一个或多个核心上执行。在一些情况下,PCU4217可以被实现为微控制器(专用的或通用的)或者其他控制逻辑,其被配置为执行其自己的专用功率管理代码(有时称为P代码)。在另外的其他示例中,PCU 4217要执行的功率管理操作可以被实现在处理器外部,例如借由单独的功率管理集成电路(power management integrated circuit,PMIC)或者在处理器外部的另一组件来实现。在另外的其他示例中,PCU 4217要执行的功率管理操作可被实现在BIOS或其他系统软件内。
各种I/O设备4214以及总线桥4218可以耦合到第一互连4216,总线桥4218将第一互连4216耦合到第二互连4220。在一些示例中,一个或多个额外的处理器4215被耦合到第一互连4216,例如协处理器、高吞吐量集成众核(many integrated core,MIC)处理器、GPGPU、加速器(诸如图形加速器或数字信号处理(digital signal processing,DSP)单元)、现场可编程门阵列(field programmable gate array,FPGA)、或者任何其他处理器。在一些示例中,第二互连4220可以是低引脚数(low pin count,LPC)互连。各种设备可以耦合到第二互连4220,这些设备例如包括键盘和/或鼠标4222、通信设备4227、以及存储电路4228。存储电路4228可以是如下文所描述的一个或多个非暂态机器可读存储介质,诸如盘驱动器或者其他大容量存储设备,其在一些示例中可包括指令/代码和数据4230并且可实现存储装置。另外,音频I/O 4224可以耦合到第二互连4220。注意,除了上述的点到点体系结构以外其他体系结构也是可能的。例如,诸如多处理器系统4200之类的系统可以实现多点分支(multi-drop)互连或者其他这种体系结构,而不是点到点体系结构。
示例性核心体系结构、处理器和计算机体系结构
处理器核心可以按不同的方式、为了不同的目的、在不同的处理器中实现。例如,这些核心的实现方式可以包括:1)通用有序核心,针对通用计算目的;2)高性能通用乱序核心,针对通用计算目的;3)专用核心,主要针对图形和/或科学(吞吐量)计算目的。不同处理器的实现方式可以包括:1)CPU,包括针对通用计算目的的一个或多个通用有序核心和/或针对通用计算目的的一个或多个通用乱序核心;以及2)协处理器,包括主要针对图形和/或科学(吞吐量)计算目的的一个或多个专用核心。这些不同处理器导致不同的计算机系统体系结构,这些体系结构可以包括:1)协处理器与CPU在分开的芯片上;2)协处理器与CPU在同一封装中分开的管芯上;3)协处理器与CPU在同一管芯上(在此情况下,这种协处理器有时被称为专用逻辑,例如集成图形和/或科学(吞吐量)逻辑,或者被称为专用核心);以及4)片上系统(system on chip,SoC),其可以在与所描述的CPU(有时称为(一个或多个)应用核心或者(一个或多个)应用处理器)同一管芯上包括上述的协处理器以及另外的功能。接下来描述示例性核心体系结构,然后是对示例性处理器和计算机体系结构的描述。
图43图示了示例处理器4300的框图,该处理器4300可以具有多于一个的核心并且可以具有集成存储器控制器。实线框图示的处理器4300具有单个核心4302(A)、系统代理单元电路4310和一组一个或多个互连控制器单元电路4316,而可选地添加的虚线框将替代性处理器4300图示为具有多个核心4302(A)-(N)、系统代理单元电路4310中的一组一个或多个集成存储器控制单元电路4314、专用逻辑4308以及一组一个或多个互连控制器单元电路4316。注意,处理器4300可以是图42的处理器4270或4280或者协处理器4238或4215之一。
从而,处理器4300的不同实现方式可以包括:1)CPU,其中专用逻辑4308是集成图形和/或科学(吞吐量)逻辑(可以包括一个或多个核心,未示出),核心4302(A)-(N)是一个或多个通用核心(例如,通用有序核心、通用乱序核心、或这两者的组合);2)协处理器,其中核心4302(A)-(N)是主要针对图形和/或科学(吞吐量)目的的大量专用核心;以及3)协处理器,其中核心4302(A)-(N)是大量的通用有序核心。从而,处理器4300可以是通用处理器、协处理器或者专用处理器,例如网络或通信处理器、压缩引擎、图形处理器、GPGPU(通用图形处理单元电路)、高吞吐量集成众核(many integrated core,MIC)协处理器(包括30个或更多个核心)、嵌入式处理器,等等。该处理器可被实现在一个或多个芯片上。处理器4300可以是一个或多个衬底的一部分和/或可以使用多种工艺技术中的任何技术来实现在一个或多个衬底上,这些工艺技术例如互补金属氧化物半导体(complementary metal oxidesemiconductor,CMOS)、双极CMOS(bipolar CMOS,BiCMOS)、P型金属氧化物半导体(P-typemetal oxide semiconductor,PMOS)或者N型金属氧化物半导体(N-type metal oxidesemiconductor,NMOS)。
存储器层次体系包括核心4302(A)-(N)内的一级或多级缓存单元电路4304(A)-(N)、一组一个或多个共享缓存单元电路4306、以及耦合到该组(一个或多个)集成存储器控制器单元电路4314的外部存储器(未示出)。该组一个或多个共享缓存单元电路4306可以包括一个或多个中间级别缓存,例如第2级(L2)、第3级(L3)、第4级(4)或者其他级别的缓存,例如最后一级缓存(last level cache,LLC),和/或这些的组合。虽然在一些示例中基于环的互连网络电路4312对专用逻辑4308(例如,集成图形逻辑)、该组(一个或多个)共享缓存单元电路4306和系统代理单元电路4310进行互连,但替代性示例使用任何数目的公知技术来对这些单元进行互连。在一些示例中,在(一个或多个)共享缓存单元电路4306中的一个或多个与核心4302(A)-(N)之间维持一致性。
在一些示例中,核心4302(A)-(N)中的一个或多个具有多线程能力。系统代理单元电路4310包括对核心4302(A)-(N)进行协调和操作的那些组件。系统代理单元电路4310可以包括例如功率控制单元(power control unit,PCU)电路和/或显示单元电路(未示出)。PCU可以是(或者可以包括)对核心4302(A)-(N)和/或专用逻辑4308(例如,集成图形逻辑)的功率状态进行调节所需的逻辑和组件。显示单元电路用于驱动一个或多个在外部连接的显示器。
核心4302(A)-(N)就指令集体系结构(instruction set architecture,ISA)而言可以是同构的。替代地,核心4302(A)-(N)就ISA而言可以是异构的;也就是说,核心4302(A)-(N)的子集可能能够执行一种ISA,而其他核心可能能够只执行该ISA的子集或者能够执行另一ISA。
示例性核心体系结构——有序和乱序核心框图。
图44(A)的框图图示了根据示例的示例性有序管线和示例性寄存器重命名、乱序发出/执行管线两者。图44(B)的框图图示了根据示例,要被包括在处理器中的有序体系结构核心的示例性示例和示例性寄存器重命名、乱序发出/执行体系结构核心两者。图44(A)-图44(B)中的实线框图示了有序管线和有序核心,而可选地添加的虚线框图示了寄存器重命名、乱序发出/执行管线和核心。考虑到有序方面是乱序方面的子集,将描述乱序方面。
在图44(A)中,处理器管线4400包括取得阶段4402、可选的长度解码阶段4404、解码阶段4406、可选的分配(Alloc)阶段4408、可选的重命名阶段4410、调度(也称为调遣或发出)阶段4412、可选的寄存器读取/存储器读取阶段4414、执行阶段4416、写回/存储器写入阶段4418、可选的异常处置阶段4422、以及可选的提交阶段4424。在这些处理器管线阶段的每一者中可以执行一个或多个操作。例如,在取得阶段4402期间,从指令存储器取得一个或多个指令,并且在解码阶段4406期间,可以对取得的一个或多个指令进行解码,可以生成使用转发寄存器端口的地址(例如,加载存储单元(load store unit,LSU)地址),并且可以执行分支转发(例如,立即数偏移或者链接寄存器(link register,LR))。在一种示例中,解码阶段4406和寄存器读取/存储器读取阶段4414可以被组合到一个管线阶段中。在一种示例中,在执行阶段4416期间,可以执行经解码的指令,可以执行到高级微控制器总线(Advanced Microcontroller Bus,AMB)接口的LSU地址/数据管线化,可以执行乘法和加法操作,可以执行具有分支结果的算术操作,等等。
作为示例,图44(B)的示例性寄存器重命名、乱序发出/执行体系结构核心可以通过以下方式实现管线4400:1)指令取得电路4438执行取得和长度解码阶段4402和4404;2)解码电路4440执行解码阶段4406;3)重命名/分配器单元电路4452执行分配阶段4408和重命名阶段4410;4)(一个或多个)调度器电路4456执行调度阶段4412;5)(一个或多个)物理寄存器堆电路4458和存储器单元电路4470执行寄存器读取/存储器读取阶段4414;(一个或多个)执行集群4460执行执行阶段4416;6)存储器单元电路4470和(一个或多个)物理寄存器堆电路4458执行写回/存储器写入阶段4418;7)在异常处置阶段4422中可能涉及各种电路;并且8)引退单元电路4454和(一个或多个)物理寄存器堆电路4458执行提交阶段4424。
图44(B)示出了处理器核心4490包括耦合到执行引擎单元电路4450的前端单元电路4430,并且两者都耦合到存储器单元电路4470。核心4490可以是精简指令集体系结构计算(reduced instruction setarchitecture computing,RISC)核心、复杂指令集体系结构计算(complex instruction set architecture computing,CISC)核心、超长指令字(verylonginstruction word,VLIW)核心、或者混合或替代性核心类型。作为另外一个选项,核心4490可以是专用核心,例如网络或通信核心、压缩引擎、协处理器核心、通用计算图形处理单元(general purpose computing graphics processing unit,GPGPU)核心、图形核心,等等。
前端单元电路4430可以包括分支预测电路4432,该分支预测电路耦合到指令缓存电路4434,该指令缓存电路耦合到指令转译后备缓冲器(translation lookaside buffer,TLB)4436,该指令TLB耦合到指令取得电路4438,该指令取得电路耦合到解码电路4440。在一种示例中,指令缓存电路4434被包括在存储器单元电路4470中,而不是前端电路4430中。解码电路4440(或解码器)可以对指令解码,并且生成一个或多个微操作、微代码入口点、微指令、其他指令或其他控制信号作为输出,这些微操作、微代码入口点、微指令、其他指令或其他控制信号是从原始指令解码来的,或者以其他方式反映原始指令,或者是从原始指令得出的。解码电路4440还可以包括地址生成单元(address generation unit,AGU,未示出)电路。在一种示例中,AGU使用经转发的寄存器端口来生成LSU地址,并且可以进一步执行分支转发(例如,立即数偏移分支转发,LR寄存器分支转发,等等)。可以利用各种不同的机制来实现解码电路4440。适当机制的示例包括但不限于查找表、硬件实现方式、可编程逻辑阵列(programmable logic array,PLA)、微代码只读存储器(read only memory,ROM),等等。在一种示例中,核心4490包括微代码ROM(未示出)或其他介质,其存储用于某些宏指令的微代码(例如,在解码电路4440中或者以其他方式在前端电路4430内)。在一种示例中,解码电路4440包括微操作(micro-op)或操作缓存(未示出),以保存/缓存在处理器管线4400的解码或其他阶段期间生成的经解码的操作、微标记或微操作。解码单元电路4440可以耦合到执行引擎电路4450中的重命名/分配器单元电路4452。
执行引擎电路4450包括重命名/分配器单元电路4452,其耦合到引退单元电路4454和一组一个或多个调度器电路4456。调度器电路4456代表任意数目个不同调度器,包括预留站、中央指令窗口,等等。在一些示例中,(一个或多个)调度器电路4456可以包括算术逻辑单元(arithmetic logic unit,ALU)调度器/调度电路、ALU队列、地址生成单元(address generation unit,AGU)调度器/调度电路、AGU队列,等等。(一个或多个)调度器电路4456耦合到(一个或多个)物理寄存器堆电路4458。(一个或多个)物理寄存器堆电路4458的每一者代表一个或多个物理寄存器堆,这些物理寄存器堆中的不同物理寄存器堆存储一个或多个不同的数据类型,例如标量整数、标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点、状态(例如,指令指针,即要执行的下一指令的地址),等等。在一种示例中,(一个或多个)物理寄存器堆电路4458包括向量寄存器单元电路、写入掩码寄存器单元电路、以及标量寄存器单元电路。这些寄存器单元可以提供体系结构式向量寄存器、向量掩码寄存器、通用寄存器,等等。(一个或多个)物理寄存器堆电路4458耦合至引退单元电路4454(也称为引退队列),以展示可以用来实现寄存器重命名和乱序执行的各种方式(例如,利用(一个或多个)重排序缓冲器(reorder buffer,ROB)和(一个或多个)引退寄存器堆;利用(一个或多个)未来的堆、(一个或多个)历史缓冲器、以及(一个或多个)引退寄存器堆;利用寄存器图谱和寄存器的池;等等)。引退单元电路4454和(一个或多个)物理寄存器堆电路4458耦合到(一个或多个)执行集群4460。(一个或多个)执行集群4460包括一组一个或多个执行单元电路4462和一组一个或多个存储器访问电路4464。(一个或多个)执行单元电路4462可以对各种类型的数据(例如,标量整数、标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点)执行各种算术、逻辑、浮点或其他类型的操作(例如,移位、加法、减法、乘法)。虽然一些示例可以包括专用于特定功能或功能集合的若干个执行单元或执行单元电路,但其他示例可以只包括一个执行单元电路或者全部执行所有功能的多个执行单元/执行单元电路。(一个或多个)调度器电路4456、(一个或多个)物理寄存器堆电路4458以及(一个或多个)执行集群4460被示为可能是多个,因为某些示例为某些类型的数据/操作创建单独的管线(例如,标量整数管线、标量浮点/紧缩整数/紧缩浮点/向量整数/向量浮点管线和/或存储器访问管线,它们各自具有其自己的调度器电路、(一个或多个)物理寄存器堆电路和/或执行集群——并且在单独的存储器访问管线的情况下,所实现的某些示例中只有该管线的执行集群具有(一个或多个)存储器访问单元电路4464)。还应当理解,在使用分开的管线的情况下,这些管线中的一个或多个可以是乱序发出/执行,而其余是有序的。
在一些示例中,执行引擎单元电路4450可以执行到高级微控制器总线(AMB)接口(未示出)的加载存储单元(LSU)地址/数据管线化,以及地址阶段和写回、数据阶段加载、存储、以及分支。
一组存储器访问电路4464耦合到存储器单元电路4470,该存储器单元电路包括数据TLB电路4472,该数据TLB电路耦合到数据缓存电路4474,该数据缓存电路耦合到第2级(L2)缓存电路4476。在一个示例性示例中,存储器访问电路4464可以包括加载单元电路、存储地址单元电路、以及存储数据单元电路,它们中的每一者耦合到存储器单元电路4470中的数据TLB电路4472。指令缓存电路4434进一步耦合到存储器单元电路4470中的第2级(L2)缓存电路4476。在一种示例中,指令缓存4434和数据缓存4474被组合成L2缓存电路4476、第3级(L3)缓存电路(未示出)和/或主存储器中的单个指令和数据缓存(未示出)。L2缓存电路4476耦合到一个或多个其他级别的缓存并且最终耦合到主存储器。
核心4490可以支持一个或多个指令集(例如,x86指令集体系结构(可选地带有已随着更新版本添加的一些扩展);MIPS指令集体系结构;ARM指令集体系结构(可选地带有可选的额外扩展,例如NEON)),该指令集包括本文描述的(一个或多个)指令。在一种示例中,核心4490包括支持紧缩数据指令集体系结构扩展(例如,AVX1、AVX2)的逻辑,从而允许利用紧缩数据来执行被许多多媒体应用使用的操作。
(一个或多个)示例性执行单元电路
图45图示了(一个或多个)执行单元电路的示例,例如图44(B)的(一个或多个)执行单元电路4462。如图所示,(一个或多个)执行单元电路4462可以包括一个或多个ALU电路4501、可选的向量/单指令多数据(single instruction multiple data,SIMD)电路4503、加载/存储电路4505、分支/跳转电路4507、和/或浮点单元(Floating-point unit,FPU)电路4509。ALU电路4501执行整数算术和/或布尔操作。向量/SIMD电路4503对紧缩数据(例如SIMD/向量寄存器)执行向量/SIMD操作。加载/存储电路4505执行加载和存储指令,以将数据从存储器加载到寄存器中,或者从寄存器存储到存储器。加载/存储电路4505也可以生成地址。分支/跳转电路4507取决于指令而引起到某个存储器地址的分支或跳转。FPU电路4509执行浮点算术。例如,(一个或多个)执行单元电路4462的宽度取决于示例而有所不同,并且可以在从16比特到1024比特的范围中。在一些示例中,两个或更多个更小的执行单元被逻辑地组合以形成更大的执行单元(例如,两个128比特执行单元被逻辑组合以形成256比特执行单元)。
示例性寄存器体系结构
图46是根据一些示例的寄存器体系结构4600的框图。如图所示,寄存器体系结构4600包括向量/SIMD寄存器4610,其宽度从128比特到1024比特不等。在一些示例中,向量/SIMD寄存器4610在物理上是512比特的,并且取决于映射,只有一些低位比特被使用。例如,在一些示例中,向量/SIMD寄存器4610是512比特的ZMM寄存器:低位256比特被用于YMM寄存器,并且低位128比特被用于XMM寄存器。因此,存在寄存器的覆盖。在一些示例中,向量长度字段在最大长度和一个或多个其他更短的长度之间作出选择,其中每个这种更短长度是前一长度的一半长度。标量操作是对ZMM/YMM/XMM寄存器中的最低阶数据元素位置执行的操作;更高阶数据元素位置或者被保持为与其在该指令之前相同,或者被归零,这取决于示例。
在一些示例中,寄存器体系结构4600包括写入掩码/谓词(predicate)寄存器4615。例如,在一些示例中,有8个写入掩码/谓词寄存器(有时称为k0至k7),它们各自的大小是16比特、32比特、64比特或128比特。写入掩码/谓词寄存器4615可以允许合并(例如,允许目的地中的任何元素集合在任何操作的执行期间被保护免于更新)和/或归零(例如,归零向量掩码允许目的地中的任何元素集合在任何操作的执行期间被归零)。在一些示例中,给定的写入掩码/谓词寄存器4615中的每个数据元素位置对应于目的地的数据元素位置。在其他示例中,写入掩码/谓词寄存器4615是可缩放的,并且由针对给定向量元素的设定数目个使能比特组成(例如,给每个64比特向量元素8个使能比特)。
寄存器体系结构4600包括多个通用寄存器4625。这些寄存器可以是16比特、32比特、64比特等等,并能够被用于标量操作。在一些示例中,这些寄存器用名称RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP以及R8至R15来称呼。
在一些示例中,寄存器体系结构4600包括标量浮点(FP)寄存器4645,它被用于使用x87指令集体系结构扩展对32/64/80比特浮点数据进行标量浮点操作,或者作为MMX寄存器,来对64比特紧缩整数数据执行操作,以及针对在MMX和XMM寄存器之间执行的一些操作保存操作对象。
一个或多个标志寄存器4640(例如,EFLAGS,RFLAGS,等等)存储状态和控制信息,用于算术、比较和系统操作。例如,一个或多个标志寄存器4640可以存储条件代码信息,例如进位、奇偶性、辅助进位、零、符号、以及溢出。在一些示例中,一个或多个标志寄存器4640被称为程序状态和控制寄存器。
段寄存器4620包含用于访问存储器的段点。在一些示例中,这些寄存器由名称CS、DS、SS、ES、FS和GS来称呼。
机器特定寄存器(machine-specific register,MSR)4635对处理器性能进行控制和报告。大多数MSR 4635处置与系统有关的功能,并且是应用程序不可访问的。机器检查寄存器4660由用于对硬件错误进行检测和报告的控制、状态和错误报告MSR组成。
一个或多个指令指针寄存器4630存储指令指针值。(一个或多个)控制寄存器4655(例如,CR0-CR4)确定处理器(例如,处理器4270、4280、4238、4218和/或4300)的操作模式和当前在执行的任务的特性。调试寄存器4650控制并允许监视处理器或核心的调试操作。
存储器(mem)管理寄存器4665指定用于保护模式存储器管理中的数据结构的位置。这些寄存器可以包括GDTR、IDTR、任务寄存器、以及LDTR寄存器。
替代性示例可以使用更宽或更窄的寄存器。此外,替代性示例可以使用更多、更少或不同的寄存器堆和寄存器。寄存器体系结构4600例如可被用于寄存器堆/存储器或(一个或多个)物理寄存器堆电路中。
指令集体系结构
指令集体系结构(instruction set architecture,ISA)可以包括一个或多个指令格式。给定的指令格式可以定义各种字段(例如,比特的数目、比特的位置)来指定要执行的操作(例如,操作码)和要被执行该操作的(一个或多个)操作对象和/或其他(一个或多个)数据字段(例如,掩码),等等。一些指令格式通过指令模板(或子格式)的定义被进一步分解。例如,给定的指令格式的指令模板可以被定义为具有该指令格式的字段的不同子集(所包括的字段通常是按相同顺序的,但至少一些具有不同的比特位置,因为所包括的字段更少)和/或被定义为具有以不同方式解读的给定字段。从而,ISA的每个指令是利用给定的指令格式来表达的(并且如果定义了的话,则以该指令格式的指令模板中的一个给定指令模板来表达),并且包括用于指定操作和操作对象的字段。例如,示例性ADD指令具有特定的操作码和指令格式,该指令格式包括操作码字段来指定该操作码,并且包括操作对象字段来选择操作对象(源1/目的地和源2);并且这个ADD指令在指令流中的出现将在选择特定操作对象的操作对象字段中具有特定内容。另外,虽然下文的描述是在x86 ISA的情境下作出的,但将本公开的教导应用于另一ISA在本领域技术人员的知识范围内。
示例性指令格式
可以按不同的格式来实现本文描述的(一个或多个)指令的示例。此外,下文详述了示例性系统、体系结构和管线。(一个或多个)指令的示例可以在这些系统、体系结构和管线上被执行,但不限于详述的那些。
图47图示了指令格式的示例。如图所示,指令可以包括多个成分,这些成分包括但不限于用于以下项的一个或多个字段:一个或多个前缀4701、操作码4703、寻址信息4705(例如,寄存器标识符、存储器寻址信息,等等)、位移值4707、和/或立即数值4709。注意,一些指令利用了该格式的一些或所有字段,而其他指令可能只使用操作码4703的字段。在一些示例中,图示的顺序是这些字段要被编码的顺序,然而应当明白,在其他示例中,这些字段可以被按另外的顺序来编码、被组合,等等。
(一个或多个)前缀字段4701在被使用时对指令进行修改。在一些示例中,一个或多个前缀被用于重复字符串指令(例如,0xF0、0xF2、0xF3,等等)、提供节超控(sectionoverride)(例如,0x2E、0x36、0x3E、0x26、0x64、0x65、0x2E、0x3E,等等)、执行总线锁定操作、和/或改变操作对象(例如,0x66)和地址大小(例如,0x67)。某些指令要求强制性的前缀(例如,0x66、0xF2、0xF3,等等)。这些前缀中的某些可以被认为是“传统”前缀。其他前缀(本文详述了其一个或多个示例)指示出和/或提供了进一步的能力,例如指定特定的寄存器等等。这些其他前缀通常跟随在“传统”前缀之后。
操作码字段4703被用于至少部分地定义在指令的解码时要执行的操作。在一些示例中,在操作码字段4703中编码的主操作码的长度为一个、两个或三个字节。在其他示例中,主操作码可以是其他的长度。额外的3比特操作码字段有时被编码在另一个字段中。
寻址字段4705被用于对指令的一个或多个操作对象进行寻址,例如存储器中的位置或者一个或多个寄存器。图48图示了寻址字段4705的示例。在这个图示中,示出了可选的MOD R/M字节4802和可选的缩放、索引、基址(Scale,Index,Base,SIB)字节4804。MOD R/M字节4802和SIB字节4804被用来编码指令的最多两个操作对象,每个操作对象是直接寄存器或有效存储器地址。注意,这些字段中的每一者是可选的,即,不是所有的指令都包括这些字段中的一个或多个。MOD R/M字节4802包括MOD字段4842、寄存器(reg)字段4844、以及R/M字段4846。
MOD字段4842的内容区分存储器访问和非存储器访问模式。在一些示例中,当MOD字段4842具有二进制值11(11b)时,利用寄存器直接寻址模式,否则使用寄存器间接寻址。
寄存器字段4844可以编码目的地寄存器操作对象或者源寄存器操作对象,或者也可以编码操作码扩展而不被用于编码任何指令操作对象。寄存器索引字段4844的内容直接指定或者通过地址生成来指定源或目的地操作对象的位置(在寄存器中或者在存储器中)。在一些示例中,寄存器字段4844得到来自前缀(例如,前缀4701)的额外比特的补充,以允许更大的寻址。
R/M字段4846可以用来编码引用了存储器地址的指令操作对象,或者可以用来编码目的地寄存器操作对象或源寄存器操作对象。注意,在一些示例中,R/M字段4846可以被与MOD字段4842相组合以规定寻址模式。
SIB字节4804包括缩放字段4852、索引字段4854、以及基址字段4856,以用于地址的生成。缩放字段4852指示缩放因子。索引字段4854指定要使用的索引寄存器。在一些示例中,索引字段4854得到来自前缀(例如,前缀4701)的额外比特的补充,以允许更大的寻址。基址字段4856指定了要使用的基址寄存器。在一些示例中,基址字段4856得到来自前缀(例如,前缀4701)的额外比特的补充,以允许更大的寻址。在实践中,缩放字段4852的内容允许缩放索引字段4854的内容以进行存储器地址生成(例如,对于使用2缩放*索引+基址的地址生成)。
一些寻址形式利用位移值来生成存储器地址。例如,可以根据2缩放*索引+基址+位移、索引*缩放+位移、r/m+位移、指令指针(RIP/EIP)+位移、寄存器+位移等等来生成存储器地址。该位移可以是1字节、2字节、4字节等等的值。在一些示例中,位移字段4707提供这个值。此外,在一些实施例中,位移因子的使用被编码在寻址字段4705的MOD字段中,它指示出压缩位移方案,对于该方案,位移值被计算并且被存储在位移字段4707中。
在一些示例中,立即数字段4709为指令指定立即数值。立即数值可以被编码为1字节值、2字节值、4字节值等等。
图49图示了第一前缀4701(A)的示例。在一些示例中,第一前缀4701(A)是REX前缀的示例。使用这个前缀的指令可以指定通用寄存器、64比特紧缩数据寄存器(例如,单指令多数据(SIMD)寄存器或向量寄存器)、和/或控制寄存器和调试寄存器(例如,CR8-CR15和DR8-DR15)。
使用第一前缀4701(A)的指令可以使用3比特字段指定最多三个寄存器,这取决于格式:1)使用MOD R/M字节4802的reg字段4844和R/M字段4846;2)使用MOD R/M字节4802与SIB字节4804,包括使用reg字段4844以及基址字段4856和索引字段4854;或者3)使用操作码的寄存器字段。
在第一前缀4701(A)中,比特位置7:4被设置为0100。比特位置3(W)可以被用于确定操作对象大小,但不能单独确定操作对象宽度。因此,当W=0时,操作对象大小由代码段描述符(code segment descriptor,CS.D)决定,而当W=1时,操作对象大小为64比特。
注意,添加另一个比特允许对16(24)个寄存器进行寻址,而单独的MOD R/M reg字段4844和MOD R/M的R/M字段4846各自只能寻址8个寄存器。
在第一前缀4701(A)中,比特位置2(R)可以是MOD R/M的reg字段4844的扩展,并且当该字段编码了通用寄存器、64比特紧缩数据寄存器(例如,SSE寄存器)或者控制或调试寄存器时,可被用来修改MOD R/M的reg字段4844。当MOD R/M字节4802指定其他寄存器或定义扩展操作码时,R被忽略。
比特位置1(X)可以修改SIB字节索引字段4854。
比特位置0(B)可以修改MOD R/M的R/M字段4846或SIB字节基址字段4856中的基址;或者它可以修改用于访问通用寄存器(例如,通用寄存器4625)的操作码寄存器字段。
图50(A)-图50(D)图示了如何使用第一前缀4701(A)的R、X和B字段的示例。图50(A)图示了当SIB字节4804不被用于存储器寻址时,来自第一前缀4701(A)的R和B被用来扩展MOD R/M字节4802的reg字段4844和R/M字段4846。图50(B)图示了当不使用SIB字节4804时,来自第一前缀4701(A)的R和B被用来扩展MOD R/M字节4802的reg字段4844和R/M字段4846(寄存器-寄存器寻址)。图50(C)图示了当SIB字节4804被用于存储器寻址时,来自第一前缀4701(A)的R、X和B被用于扩展MOD R/M字节4802的reg字段4844以及索引字段4854和基址字段4856。图50(D)图示了当寄存器被编码在操作码4703中时,来自第一前缀4701(A)的B被用来扩展MOD R/M字节4802的reg字段4844。
图51(A)-图51(B)图示了第二前缀4701(B)的示例。在一些示例中,第二前缀4701(B)是VEX前缀的示例。第二前缀4701(B)编码允许指令具有多于两个操作对象,并且允许SIMD向量寄存器(例如,向量/SIMD寄存器4610)长于64比特(例如,128比特和256比特)。第二前缀4701(B)的使用提供了三操作对象(或更多)的语法。例如,先前的两操作对象指令执行诸如A=A+B之类的操作,这覆写了源操作对象。对第二前缀4701(B)的使用使得操作对象能够执行非破坏性操作,比如A=B+C。
在一些示例中,第二前缀4701(B)有两种形式——两字节形式和三字节形式。两字节的第二前缀4701(B)主要被用于128比特、标量和一些256比特指令;而三字节的第二前缀4701(B)提供了3字节操作码指令和第一前缀4701(A)的紧凑替换。
图51(A)图示了第二前缀4701(B)的两字节形式的示例。在一个示例中,格式字段5101(字节0 5103)包含值C5H。在一个示例中,字节1 5105在比特[7]中包括“R”值。这个值是第一前缀4701(A)的“R”值的补码。比特[2]被用来规定向量的长度(L)(其中0的值是标量或者128比特向量,而1的值是256比特向量)。比特[1:0]提供等同于一些传统前缀的操作码扩展性(例如,00=无前缀,01=66H,10=F3H,并且11=F2H)。被示为vvvv的比特[6:3]可以被用于:1)编码第一源寄存器操作对象,该操作对象以反转(反码)形式指定,并且对于具有2个或更多个源操作对象的指令有效;2)编码目的地寄存器操作对象,该操作对象以反码形式指定,用于某些向量移位;或者3)不编码任何操作对象,该字段被保留并且应当包含某个值,例如1111b。
使用这个前缀的指令可以使用MOD R/M的R/M字段4846,以编码引用存储器地址的指令操作对象,或者编码目的地寄存器操作对象或源寄存器操作对象。
使用这个前缀的指令可以使用MOD R/M的reg字段4844,以编码目的地寄存器操作对象或者源寄存器操作对象,被作为操作码扩展来对待而不被用于编码任何指令操作对象。
对于支持四个操作对象的指令语法,vvvv、MOD R/M的R/M字段4846和MOD R/M的reg字段4844编码了四个操作对象中的三个。然后立即数4709的比特[7:4]被用来编码第三源寄存器操作对象。
图51(B)图示了第二前缀4701(B)的三字节形式的示例。在一种示例中,格式字段5111(字节0 5113)包含值C4H。字节1 5115在比特[7:5]中包括“R”、“X”和“B”,它们是第一前缀4701(A)的这些值的补码。字节1 5115的比特[4:0](示为mmmmm)包括根据需要来对一个或多个隐含的前导操作码字节进行编码的内容。例如,00001意味着0FH前导操作码,00010意味着0F38H前导操作码,00011意味着0F3AH前导操作码,等等。
字节2 5117的比特[7]的使用与第一前缀4701(A)的W类似,包括帮助确定可提升的操作对象大小。比特[2]被用来规定向量的长度(L)(其中0的值是标量或者128比特向量,而1的值是256比特向量)。比特[1:0]提供等同于一些传统前缀的操作码扩展性(例如,00=无前缀,01=66H,10=F3H,并且11=F2H)。被示为vvvv的比特[6:3]可以被用于:1)编码第一源寄存器操作对象,该操作对象以反转(反码)形式指定,对于具有2个或更多个源操作对象的指令有效;2)编码目的地寄存器操作对象,该操作对象以反码形式指定,用于某些向量移位;或者3)不编码任何操作对象,该字段被保留并且应当包含某个值,例如1111b。
使用这个前缀的指令可以使用MOD R/M的R/M字段4846,以编码引用存储器地址的指令操作对象,或者编码目的地寄存器操作对象或源寄存器操作对象。
使用这个前缀的指令可以使用MOD R/M的reg字段4844,以编码目的地寄存器操作对象或者源寄存器操作对象,或者被作为操作码扩展来对待而不被用于编码任何指令操作对象。
对于支持四个操作对象的指令语法,vvvv、MOD R/M的R/M字段4846和MOD R/M的reg字段4844编码了四个操作对象中的三个。然后立即数4709的比特[7:4]被用来编码第三源寄存器操作对象。
图52图示了第三前缀4701(C)的示例。在一些示例中,第三前缀4701(C)是EVEX前缀的示例。第三前缀4701(C)是四字节前缀。
第三前缀4701(C)能够在64比特模式中编码32个向量寄存器(例如,128比特、256比特和512比特寄存器)。在一些示例中,利用写入掩码/操作掩码(参见对于先前图中的寄存器的论述,例如图46)或谓词的指令利用这个前缀。操作掩码寄存器允许条件处理或选择控制。操作掩码指令——其源/目的地操作对象是操作掩码寄存器并且将操作掩码寄存器的内容视为单个值——是使用第二前缀4701(B)而被编码的。
第三前缀4701(C)可以编码特定于指令类别的功能(例如,具有“加载+操作”语义的紧缩指令可以支持嵌入式广播功能,具有舍入语义的浮点指令可以支持静态舍入功能,具有非舍入算术语义的浮点指令可以支持“抑制所有异常”功能,等等)。
第三前缀4701(C)的第一字节是格式字段5211,它在一种示例中具有62H的值。随后的字节被称为有效载荷字节5215-5219,并且共同形成P[23:0]的24比特值,以(本文中详述的)一个或多个字段的形式提供特定的能力。
在一些示例中,有效载荷字节5219的P[1:0]与低位的两个mm比特相同。在一些示例中,P[3:2]被保留。比特P[4](R')在与P[7]和MOD R/M的reg字段4844相组合时允许访问高16向量寄存器集合。当不需要SIB类型寻址时,P[6]也可以提供对高16向量寄存器的访问。P[7:5]由R、X和B构成,它们是针对向量寄存器、通用寄存器、存储器寻址的操作对象指定符修饰符比特,并且当与MOD R/M寄存器字段4844和MOD R/M的R/M字段4846相组合时,允许访问超出低8个寄存器的下一组8个寄存器。P[9:8]提供等同于一些传统前缀的操作码扩展性(例如,00=无前缀,01=66H,10=F3H,并且11=F2H)。P[10]在一些示例中是固定值1。被示为vvvv的P[14:11]可以被用于:1)编码第一源寄存器操作对象,该操作对象以反转(反码)形式指定,对于具有2个或更多个源操作对象的指令有效;2)编码目的地寄存器操作对象,该操作对象以反码形式指定,用于某些向量移位;或者3)不编码任何操作对象,该字段被保留并且应当包含某个值,例如1111b。
P[15]类似于第一前缀4701(A)和第二前缀4711(B)的W,并且可以作为操作码扩展比特或操作对象大小提升。
P[18:16]指定操作掩码(写入掩码)寄存器(例如,写入掩码/谓词寄存器4615)中的寄存器的索引。在一种示例中,特定值aaa=000具有特殊行为,暗示着没有操作掩码被用于这个特定的指令(这可以通过多种方式实现,包括使用硬连线到全一的操作掩码或者绕过掩蔽硬件的硬件)。当合并时,向量掩码允许目的地中的任何元素集合在(由基本操作和增强操作指定的)任何操作的执行期间被保护免于更新;在另一示例中,保留目的地的每个元素的旧值(如果相应的掩码比特具有0值)。与之不同,当归零时,向量掩码允许目的地中的任何元素集合在(由基本操作和增强操作指定的)任何操作的执行期间被归零;在一种示例中,目的地的元素在相应掩码比特具有0值时被设置到0。这个功能的子集是对于正被执行的操作的向量长度(即,被修改的元素的跨度,从第一个到最后一个)进行控制的能力;然而,被修改的元素不一定要连续。从而,操作掩码字段允许了部分向量操作,包括加载、存储、算术、逻辑,等等。虽然在描述的示例中,操作掩码字段的内容选择若干个操作掩码寄存器中包含要使用的操作掩码的那一个(从而操作掩码字段的内容间接标识了要执行的掩蔽),但替代地或附加地,替代性示例允许掩码写入字段的内容直接指定要执行的掩蔽。
P[19]可以与P[14:11]相组合,来以非破坏性源语法编码第二源向量寄存器,该语法可以利用P[19]来访问高16个向量寄存器。P[20]编码多种功能,这些功能在不同类别的指令中有所不同,并且可以影响向量长度/舍入控制指定符字段(P[22:21])的含义。P[23]指示出对合并-写入掩蔽的支持(例如,当被设置为0时)或者对归零和合并-写入掩蔽的支持(例如,当被设置为1时)。
下面的表格详述了在使用第三前缀4701(C)的指令中对寄存器的编码的示例性示例。
表格1:64比特模式中的32寄存器支持
表格2:在32比特模式中编码寄存器指定符
表格3:操作掩码寄存器指定符编码
程序代码可被应用到输入信息以执行本文描述的功能并且生成输出信息。输出信息可以按已知的方式被应用到一个或多个输出设备。对于本申请而言,处理系统包括任何具有处理器的系统,处理器例如是数字信号处理器(digital signal processor,DSP)、微控制器、专用集成电路(application specific integrated circuit,ASIC)、现场可编程门阵列(field programmable gate array,FPGA)、微处理器、或其任何组合。
可以用面向过程或面向对象的高级编程语言来实现程序代码以与处理系统进行通信。如果希望,也可以用汇编或机器语言来实现程序代码。实际上,本文描述的机制在范围上不限于任何特定的编程语言。在任何情况下,该语言可以是编译语言或者解释语言。
本文公开的机制的实施例可以用硬件、软件、固件或者这些实现途径的组合来实现。示例可以被实现为计算机程序或程序代码,在包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备和至少一个输出设备的可编程系统上执行。
至少一个示例的一个或多个方面可以由被存储在机器可读介质上的代表性指令来实现,这些指令代表处理器内的各种逻辑,这些指令当被机器读取时,使得该机器制作用于执行本文所述技术的逻辑。这些表现形式被称为“IP核”,可以被存储在有形机器可读介质上并被提供给各种客户或制造设施,以加载到实际上制作该逻辑或处理器的制作机器中。
这些机器可读存储介质可包括——但不限于——由机器或设备制造或形成的物品的非暂态有形布置形式,包括存储介质,例如:硬盘,任何其他类型的盘(包括软盘、光盘、致密盘只读存储器(compact disk read-only memory,CD-ROM)、可重写致密盘(compactdisk rewritable,CD-RW)、以及磁光盘),半导体器件(例如,只读存储器(read-onlymemory,ROM),诸如动态随机访问存储器(dynamic random access memory,DRAM)、静态随机访问存储器(static random access memory,SRAM)之类的随机访问存储器(randomaccess memory,RAM),可擦除可编程只读存储器(erasable programmable read-onlymemory,EPROM),闪速存储器,电可擦除可编程只读存储器(electrically erasableprogrammable read-only memory,EEPROM),相变存储器(phase change memory,PCM)),磁卡或光卡,或者适合用于存储电子指令的任何其他类型的介质。
因此,示例还包括非暂态有形机器可读介质,这些介质包含指令或者包含定义本文描述的结构、电路、装置、处理器和/或系统特征的设计数据,例如硬件描述语言(Hardware Description Language,HDL)。这种示例也可以被称为程序产品。
仿真(包括二进制转译、代码变形,等等)
在一些情况下,指令转换器可以被用于将指令从源指令集体系结构转换到目标指令集体系结构。例如,指令转换器可以将指令转译(例如,利用静态二进制转译、包括动态编译的动态二进制转译)、变形、仿真或者以其他方式转换到要被核心处理的一个或多个其他指令。可以用软件、硬件、固件或者其组合来实现指令转换器。指令转换器可以在处理器上、在处理器外、或者一部分在处理器上而一部分在处理器外。
图53图示根据示例的对照使用软件指令转换器将源指令集体系结构中的二进制指令转换成目标指令集体系结构中的二进制指令的框图。在图示的示例中,指令转换器是软件指令转换器,但可替代地,可以用软件、固件、硬件或者其各种组合来实现指令转换器。图53示出了高级语言5302的程序可以被利用第一ISA编译器5304编译以生成第一ISA二进制代码5306,该代码可以由具有至少一个第一指令集体系结构核心的处理器5316原生执行。具有至少一个第一ISA指令集体系结构核心的处理器5316代表任何这样的处理器:这种处理器能够通过兼容地执行或以其他方式处理(1)第一ISA指令集体系结构核心的指令集体系结构的实质部分或者(2)以在具有至少一个第一ISA指令集体系结构核心的处理器上运行为目标的应用或其他软件的目标代码版本,来执行与具有至少一个第一ISA指令集体系结构核心的Intel处理器基本上相同的功能,以便实现与具有至少一个第一ISA指令集体系结构核心的处理器基本上相同的结果。第一ISA编译器5304代表可操作来生成第一ISA二进制代码5306(例如,目标代码)的编译器,该第一ISA二进制代码在进行或不进行额外的链接处理的情况下能够在具有至少一个第一ISA指令集体系结构核心的处理器5316上被执行。类似地,图53示出了高级语言5302的程序可以被利用替代性指令集体系结构编译器5308来编译以生成替代性指令集体系结构二进制代码5310,该代码可以由没有第一ISA核心的处理器5314原生执行。指令转换器5312被用来将第一ISA二进制代码5306转换成可以由没有第一ISA指令集体系结构核心的处理器5314原生执行的代码。这种转换后的代码必定与替代性指令集体系结构二进制代码5310不同;然而,转换后的代码将实现总的操作,并由来自该替代性指令集体系结构的指令构成。从而,指令转换器5312代表软件、固件、硬件或它们的组合,其通过仿真、模拟或任何其他过程,允许没有第一ISA指令集体系结构处理器或核心的处理器或其他电子设备执行第一ISA二进制代码5306。
对“一个示例”、“示例”等的引用指示所描述的示例可包括特定的特征、结构或特性,但是可能并非每个示例都一定包括该特定的特征、结构或特性。而且,此类短语不一定是指同一示例。此外,当结合示例描述特定的特征、结构或特性时,认为结合无论是否被明确描述的其他示例而影响此类特征、结构或特性在本领域技术人员的知识范围内。
示例包括但不限于:
1.一种装置,包括:
逻辑处理器,该逻辑处理器用于在第一模式下执行一个或多个线程;以及
同步微线程化(SyMT)协处理器,该SyMT协处理器耦合至逻辑处理器,以在执行进入SyMT模式的指令时执行多个微线程,其中每个微线程具有独立的寄存器状态,其中,SyMT协处理器进一步用于支持代码中的软屏障提示指令,该软屏障提示指令在由微线程处理时用于:至少部分地基于具有至少一个条目的数据结构来暂停要被重新开始的微线程的执行,该条目包括软屏障提示指令的指令指针以及在该指令指针处已遇到软屏障提示指令的微线程的计数。
2.如示例1所述的装置,其中,软屏障提示指令进一步用于被处理以清除SyMT协处理器的取得阶段。
3.如示例1所述的装置,其中,代码是具有分散条件的循环。
4.如示例1所述的装置,其中,代码具有变化的循环行程计数。
5.如示例1所述的装置,其中,代码具有共同的函数调用。
6.如示例1所述的装置,其中,解码电路用于处理软屏障提示指令。
7.如示例6所述的装置,其中,解码电路用于在软屏障提示指令的首次处理时使用有限状态机(FSM)。
8.如示例7所述的装置,其中,FSM被部分地用于确定何时重新开始被暂停的微线程。
9.如示例8所述的装置,其中,FSM包括递增阶段,以递增屏障就绪微线程的计数。
10.如示例8所述的装置,其中,FSM包括递减阶段,以基于超时来递减屏障就绪微线程的计数。
11.如示例7所述的装置,其中,被暂停的微线程的执行用于至少部分地基于超时期满而被重新开始。
12.如示例7所述的装置,其中,被暂停的微线程的执行用于至少部分地基于计数达到阈值而被重新开始。
13.如示例12所述的装置,其中,计数被编码在软屏障提示指令中。
14.一种系统,包括:
存储器,该存储器用于存储同步微线程化(SyMT)状态区域;
逻辑处理器,用于在第一模式下执行一个或多个线程;以及
同步微线程化(SyMT)协处理器,该SyMT协处理器耦合至逻辑处理器以在执行进入SyMT模式的指令时执行多个微线程,其中每个微线程具有独立的寄存器状态,其中,SyMT协处理器进一步用于支持代码中的软屏障提示指令,该软屏障提示指令在由微线程处理时用于:基于具有至少一个条目的数据结构来暂停要被重新开始的微线程的执行,该条目包括软屏障提示指令的指令指针以及在该指令指针处已遇到软屏障提示指令的微线程的计数。
15.如示例14所述的系统,其中,软屏障提示指令进一步用于被处理以清除SyMT协处理器的取得阶段。
16.如示例14所述的系统,其中,代码是具有分散条件的循环。
17.如示例14所述的系统,其中,代码具有变化的循环行程计数。
18.如示例14所述的系统,其中,代码具有共同的函数调用。
19.如示例14所述的系统,其中,解码电路用于处理软屏障提示指令。
20.如示例19所述的系统,其中,解码电路用于在软屏障提示指令的首次处理时使用有限状态机(FSM)。
21.如示例20所述的系统,其中,FSM被用于确定何时重新开始被暂停的微线程。
22.如系统21所述的系统,其中,FSM包括递增阶段,以递增屏障就绪微线程的计数。
23.如示例21所述的系统,其中,FSM包括递减阶段,以基于超时来递减屏障就绪微线程的计数。
此外,在上文描述的各示例中,除非另外专门指出,否则,诸如短语“A、B或C中的至少一个”或“A、B和/或C”之类的分隔语言旨在被理解为意指A、B、或C、或其任何组合(即,A和B,A和C,B和C,以及A、B和C)。
因此,说明书和附图应被认为是说明性而非限制性意义的。然而,将显而易见的是,可对这些实现方式作出各种修改和改变,而不背离如权利要求中所述的本公开的更宽泛的精神和范围。
Claims (23)
1.一种装置,包括:
逻辑处理器,用于在第一模式下执行一个或多个线程;以及
同步微线程化SyMT协处理器,所述SyMT协处理器耦合至逻辑处理器,以在执行进入SyMT模式的指令时执行多个微线程,其中每个微线程具有独立的寄存器状态,其中,所述SyMT协处理器进一步用于支持代码中的软屏障提示指令,所述软屏障提示指令在由微线程处理时用于:至少部分地基于具有至少一个条目的数据结构来暂停要被重新开始的微线程的执行,条目包括所述软屏障提示指令的指令指针以及在所述指令指针处已遇到所述软屏障提示指令的微线程的计数。
2.如权利要求1所述的装置,其中,所述软屏障提示指令进一步用于被处理以清除所述SyMT协处理器的取得阶段。
3.如权利要求1-2中任一项所述的装置,其中,所述代码是具有分散条件的循环。
4.如权利要求1-2中任一项所述的装置,其中,所述代码具有变化的循环行程计数。
5.如权利要求1-2中任一项所述的装置,其中,所述代码具有共同的函数调用。
6.如权利要求1-5中任一项所述的装置,其中,解码电路用于处理所述软屏障提示指令。
7.如权利要求6所述的装置,其中,所述解码电路用于在所述软屏障提示指令的首次处理时使用有限状态机FSM。
8.如权利要求7所述的装置,其中,所述FSM被部分地用于确定何时重新开始被暂停的微线程。
9.如权利要求8所述的装置,其中,所述FSM包括递增阶段,以递增屏障就绪微线程的计数。
10.如权利要求8所述的装置,其中,所述FSM包括递减阶段,以基于超时来递减屏障就绪微线程的计数。
11.如权利要求7所述的装置,其中,被暂停的微线程的执行用于至少部分地基于超时期满而被重新开始。
12.如权利要求7所述的装置,其中,被暂停的微线程的执行用于至少部分地基于所述计数达到阈值而被重新开始。
13.如权利要求12所述的装置,其中,所述计数被编码在所述软屏障提示指令中。
14.一种系统,包括:
存储器,所述存储器用于存储同步微线程化SyMT状态区域;
逻辑处理器,所述逻辑处理器用于在第一模式下执行一个或多个线程;以及
同步微线程化SyMT协处理器,所述SyMT协处理器耦合至逻辑处理器,以在执行进入SyMT模式的指令时执行多个微线程,其中每个微线程具有独立的寄存器状态,其中,SyMT协处理器进一步用于支持代码中的软屏障提示指令,所述软屏障提示指令在由微线程处理时用于:基于具有至少一个条目的数据结构来暂停要被重新开始的微线程的执行,该条目包括软屏障提示指令的指令指针以及在该指令指针处已遇到软屏障提示指令的微线程的计数。
15.如权利要求14所述的系统,其中,所述软屏障提示指令进一步用于被处理以清除所述SyMT协处理器的取得阶段。
16.如权利要求14所述的系统,其中,所述代码是具有分散条件的循环。
17.如权利要求14所述的系统,其中,所述代码具有变化的循环行程计数。
18.如权利要求14所述的系统,其中,所述代码具有共同的函数调用。
19.如权利要求14所述的系统,其中,解码电路用于处理所述软屏障提示指令。
20.如权利要求19所述的系统,其中,所述解码电路用于在所述软屏障提示指令的首次处理时使用有限状态机FSM。
21.如权利要求20所述的系统,其中,所述FSM被用于确定何时重新开始被暂停的微线程。
22.如权利要求20所述的系统,其中,所述FSM包括递增阶段,以递增屏障就绪微线程的计数。
23.如权利要求20所述的系统,其中,所述FSM包括递减阶段,以基于超时来递减屏障就绪微线程的计数。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/712,120 US20230315458A1 (en) | 2022-04-02 | 2022-04-02 | Synchronous microthreading |
US17/712,120 | 2022-04-02 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116893894A true CN116893894A (zh) | 2023-10-17 |
Family
ID=85791878
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310202498.9A Pending CN116893894A (zh) | 2022-04-02 | 2023-03-02 | 同步微线程化 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20230315458A1 (zh) |
EP (1) | EP4254177B1 (zh) |
CN (1) | CN116893894A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118349193A (zh) * | 2024-06-18 | 2024-07-16 | 北京辉羲智能科技有限公司 | 栈存储电路、基于栈存储电路的压栈出栈方法及装置 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN119396401A (zh) * | 2020-11-19 | 2025-02-07 | 华为技术有限公司 | 修复弱内存序问题的方法及装置 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6931641B1 (en) * | 2000-04-04 | 2005-08-16 | International Business Machines Corporation | Controller for multiple instruction thread processors |
US8539204B2 (en) * | 2009-09-25 | 2013-09-17 | Nvidia Corporation | Cooperative thread array reduction and scan operations |
US9830156B2 (en) * | 2011-08-12 | 2017-11-28 | Nvidia Corporation | Temporal SIMT execution optimization through elimination of redundant operations |
US10310861B2 (en) * | 2017-04-01 | 2019-06-04 | Intel Corporation | Mechanism for scheduling threads on a multiprocessor |
US20210382717A1 (en) * | 2020-06-03 | 2021-12-09 | Intel Corporation | Hierarchical thread scheduling |
GB2598396A (en) * | 2020-09-01 | 2022-03-02 | Advanced Risc Mach Ltd | In-core parallelisation in a data processing apparatus and method |
-
2022
- 2022-04-02 US US17/712,120 patent/US20230315458A1/en active Pending
-
2023
- 2023-03-02 CN CN202310202498.9A patent/CN116893894A/zh active Pending
- 2023-03-29 EP EP23165257.9A patent/EP4254177B1/en active Active
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118349193A (zh) * | 2024-06-18 | 2024-07-16 | 北京辉羲智能科技有限公司 | 栈存储电路、基于栈存储电路的压栈出栈方法及装置 |
CN118349193B (zh) * | 2024-06-18 | 2024-10-18 | 北京辉羲智能科技有限公司 | 栈存储电路、基于栈存储电路的压栈出栈方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
US20230315458A1 (en) | 2023-10-05 |
EP4254177B1 (en) | 2025-04-09 |
EP4254177A1 (en) | 2023-10-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108463826B (zh) | 用于在环转变期间保护栈的处理器扩展 | |
US9495159B2 (en) | Two level re-order buffer | |
US20220197678A1 (en) | Apparatus and method for secure instruction set execution, emulation, monitoring, and prevention | |
US10949207B2 (en) | Processor core supporting a heterogeneous system instruction set architecture | |
US10445204B2 (en) | Instruction and logic for interrupt and exception handling | |
EP4254177B1 (en) | Synchronous microthreading | |
NL2030804B1 (en) | Flexible return and event delivery | |
US20230099517A1 (en) | User-level interprocessor interrupts | |
CN115357332A (zh) | 处理器间中断的虚拟化 | |
US20240095063A1 (en) | User-level exception-based invocation of software instrumentation handlers | |
US12223318B2 (en) | Apparatus and method for managing unsupported instruction set architecture (ISA) features in a virtualized environment | |
US20230315572A1 (en) | Synchronous microthreading | |
US9965280B2 (en) | Instruction and logic for processor trace information for control flow integrity | |
EP4239470A1 (en) | Software-controlled flag to require a stack switch during execution | |
US20230315444A1 (en) | Synchronous microthreading | |
US20230315460A1 (en) | Synchronous microthreading | |
US20230315461A1 (en) | Synchronous microthreading | |
US20230315455A1 (en) | Synchronous microthreading | |
US20230315462A1 (en) | Synchronous microthreading | |
US20230315445A1 (en) | Synchronous microthreading | |
US20230315459A1 (en) | Synchronous microthreading | |
US20230409335A1 (en) | Selective disable of history-based predictors on mode transitions | |
US20240004659A1 (en) | Reducing instrumentation code bloat and performance overheads using a runtime call instruction | |
US20240069913A1 (en) | Uniform Microcode Update Enumeration | |
WO2024065850A1 (en) | Providing bytecode-level parallelism in a processor using concurrent interval execution |
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 |