使用通过对物理寄存器预分配的乱序重命名的运行时代码并行化的制作方法

文档序号:14394563阅读:197来源:国知局

发明领域

本发明总体上涉及处理器设计,特别是涉及用于运行时代码并行化的方法和系统。

发明背景

许多并行处理器通过采用寄存器重命名来解决数据依赖性。在本领域中已知各种寄存器重命名技术。hennessy和patterson在2011年9月的morgankaufmann的“computerarchitecture-aquantitativeapproach”第五版的第3章中描述了一种基本的重命名方案,其通过引用并入本文。已知的重命名方案的概述由例如sima在2000年9月的“thedesignspaceforregisterrenamingtechniques”,ieeemicro,第70-83页中给出,其通过引用并入本文。monreal等人在2000年的journalofinstruction-levelparallelism的“dynamicregisterrenamingthroughvirtual-physicalregisters”的第2卷中描述了其他重命名方案,该文献通过引用并入本文。

发明概述

本文描述的本发明的实施例提供了一种方法,该方法包括通过硬件实现的流水线来处理使用一个或更多个架构寄存器指定的程序代码的指令序列,该硬件实现的流水线重命名指令中的架构寄存器以便产生使用一个或更多个物理寄存器指定的操作。选择指令序列中的至少第一段和第二段,其中第二段在序列中比第一段晚出现。在完成对第一段的指令中的架构寄存器的重命名之前,通过将物理寄存器中的一个或更多个预分配给架构寄存器中的一个或更多个,对第二段的指令中的一个或更多个架构寄存器进行重命名。

在一些实施例中,在开始重命名第一段的指令中的架构寄存器之前执行将物理寄存器预分配给架构寄存器。在一些实施例中,对第二段的指令中的架构寄存器的重命名独立于对第一段的指令中的架构寄存器的重命名而被执行。

在一些实施例中,重命名架构寄存器包括识别对第一段中的架构寄存器的最后写入指令,并且将最后写入指令中的架构寄存器重命名为已被预分配的物理寄存器。在实施例中,该方法还包括向程序代码添加将最后写入操作的结果移动到预先分配的物理寄存器的一个或更多个操作。

在一些实施例中,预先分配物理寄存器包括在完成对第一段的指令中的架构寄存器的重命名之前,产生第二段的初始架构到物理寄存器的映射,以及重命名第二段的指令中的架构寄存器包括基于初始架构到物理寄存器的映射对架构寄存器进行重命名。

在示例实施例中,产生第二段的初始架构到物理寄存器的映射包括预测预期在第一段的末尾产生的最终架构到物理寄存器的映射,并且从第一段的预测的最终架构到物理寄存器的映射导出第二段的初始架构到物理寄存器的映射。

在另一个实施例中,导出第二段的初始架构到物理寄存器的映射包括将至少一个架构寄存器的映射从第一段的预测的最终架构到物理寄存器的映射复制到第二段的初始架构到物理寄存器的映射。

在一些实施例中,预测第一段的最终架构到物理寄存器的映射包括选择被预测为在第一段中被写入的至少架构寄存器,以及确定在第一段的末尾的该至少架构寄存器的最终架构到物理寄存器的映射。在示例实施例中,选择至少架构寄存器包括仅在架构寄存器也被预期在第二段中被读取时才选择该架构寄存器。在另一个实施例中,选择至少架构寄存器包括如果没有关于预期是否在第二段中访问架构寄存器的信息可用,则选择架构寄存器。

在又一个实施例中,导出第二段的初始架构到物理寄存器的映射包括至少选择被预测为在第二段中被读取的架构寄存器,并且将所选择的架构寄存器在第二段的初始架构到物理寄存器的映射中映射到新的物理寄存器。在又一个实施例中,导出第二段的初始架构到物理寄存器的映射包括至少选择被预测为在第二段中被读取但不具有可用于第二段的映射的架构寄存器,并且将所选择的架构寄存器在第二段的初始架构到物理寄存器的映射中映射到新的物理寄存器。

在实施例中,预测第一段的最终架构到物理寄存器的映射包括将预测的最终架构到物理寄存器的映射中的至少一个架构寄存器定义为未分配(na)。响应于检测到只有近似的寄存器访问信息可用于架构寄存器,可以将该架构寄存器定义为na。

在另一个实施例中,导出第二段的初始架构到物理寄存器的映射包括将至少一个架构寄存器指定为未分配(na)。在又一个实施例中,第一段和第二段使用单独的物理寄存器组。在又一个实施例中,导出第二段的初始架构到物理寄存器的映射包括至少选择预期在第二段中被读取的架构寄存器,并且将所选择的架构寄存器指定为未分配(na)。

根据本发明的实施例,另外提供包括硬件实现的流水线和并行化电路的处理器。流水线被配置为处理使用一个或更多个架构寄存器指定的程序代码的指令序列,包括重命名指令中的架构寄存器以产生使用一个或更多个物理寄存器指定的操作。并行化电路被配置为至少选择指令序列中的第一段和第二段,其中第二段在序列中比第一段晚出现,并且在完成对第一段的指令中的架构寄存器重命名之前,通过将物理寄存器中的一个或更多个预分配给架构寄存器中的一个或更多个,对第二段的指令中的一个或更多个架构寄存器进行重命名。

根据结合附图进行的本发明的实施例的以下详细描述,本发明将得到更完全地理解,其中:

附图简述

图1是根据本发明的实施例示意性地示出处理器的框图;

图2是根据本发明的实施例示意性地说明用于寄存器重命名的方法的流程图;

图3是根据本发明的实施例示意性地说明用于寄存器预分配的方法的流程图;以及

图4是根据本发明的实施例示意性地图示了用于将物理寄存器预分配到目的地寄存器的过程的图;以及

图5是根据本发明的实施例示意性地图示了用于将物理寄存器预分配到操作数寄存器的过程的图。

具体实施方式

综述

本文描述的本发明的实施例提供用于程序代码的运行时并行化的改善的方法和装置。在一些实施例中,处理器包括处理指令序列的硬件实现的流水线。指令是根据处理器的指令集架构中定义的一个或更多个架构寄存器来指定的。在其他功能中,流水线包括至少一个重命名单元,其重命名指令中的寄存器,即将架构寄存器映射到处理器的物理寄存器。

在一些实施例中,流水线包括被指派为重命名程序代码的各个段的多个重命名单元。在本专利申请的上下文和权利要求中,术语“段”是指在程序代码中的某个位置出现的任何一组一个或更多个指令。每个重命名单元通常会输出微操作或指令的流,这些微操作或指令是根据一个或更多个物理寄存器指定的。微操作或指令被缓冲并被分派以用于执行。

通常,每个重命名单元保持寄存器映射,其将一个或更多个架构寄存器映射到相应的物理寄存器。重命名单元使用寄存器映射来将输入指令转换成输出微操作。通常,重命名单元使用寄存器映射来将操作数寄存器(被读取的架构寄存器)映射到应从其中读取操作数的适当物理寄存器。对于更新架构寄存器的每条指令,新的物理寄存器被分配为目的地寄存器。新的分配在寄存器映射中更新,以便当这些架构寄存器接下来用作操作数时使用。重命名单元在处理期间不断地更新寄存器映射,即,在将物理寄存器分配给目的地架构寄存器时,相应地更新寄存器映射。

运行时代码并行化的主要挑战之一是寄存器重命名的高效并行化。例如,考虑涉及第一代码段和第二代码段的场景,其中第二段在代码中比第一段晚出现。简单的重命名方案将等到第一段被完全重命名为止,即直到寄存器映射反映第一段的末尾处的架构到物理寄存器的映射,然后才开始重命名以该寄存器映射开始的第二段。如可以理解的,这样的解决方案具有差的并行化性能。

相反,本发明的实施例使流水线能够在第一段被完全重命名之前开始重命名第二段。乱序地对段进行重命名的能力降低了重命名单元因未解决的依赖关系而停顿的可能性,因此大大提高了并行化性能。

在一些实施例中,当流水线开始重命名第一段时,处理器中的并行化电路预测预期在第一段的末尾处由重命名单元产生的寄存器映射。该寄存器映射在本文被称为第一段的推测性最终寄存器映射。根据第一段的推测性最终寄存器映射,并行化电路为第二段导出推测性初始寄存器映射,然后使用推测性初始映射开始重命名第二段。以这种方式,对第二段的重命名在第一段被完全重命名很久之前开始,即,两段至少部分地被并行重命名。该过程以类似的方式继续到下一个段,依此类推。

在一些实施例中,对第一段的推测性最终映射的预测和第二段的推测性初始映射的导出涉及将物理寄存器预分配给一个或更多个架构寄存器。例如,可以对第一段中的目的地架构寄存器和/或用作第二段中的操作数的架构寄存器执行预分配。

例如,考虑在第一段中的指令x中被写入并预期在第二段中的指令y中被读取的架构寄存器。在实施例中,并行化电路将物理寄存器在第一段的推测性最终映射中预分配给该架构寄存器(即,强制重命名单元执行对第一段中的架构寄存器的最后写入,到该特定的预分配的物理寄存器)。预分配也可以以其他方式执行,例如通过插入额外的微操作或通过改变第二段的操作数映射。这些动作可被立即执行或者稍后在cpu流水线中执行,例如在段的末尾处执行。

并行化电路然后使用第一段的推测性最终寄存器映射来创建第二段的推测性初始映射(即,第二段的初始寄存器映射,反映在第一段末尾处的其操作数的预测位置)。由于这种预分配,第一段和第二段之间的数据依赖性被处理。因此,第二段可以在第一段的重命名完成之前被重命名。

在此详细描述并行重命名的各种示例,包括用于预测推测性最终寄存器映射和推测性初始寄存器映射的技术以及用于目的地寄存器和操作数的预分配方案。

系统描述

图1是根据本发明的实施例示意性地示出处理器20的框图。处理器20运行预编译的软件代码,同时并行化代码执行。处理器在运行时间处通过在程序指令从存储器中被取出并被处理时分析程序指令来执行指令并行化。

在本示例中,处理器20包括多个硬件线程24,其被配置为并行地进行操作。每个线程24被配置成处理代码的相应段。线程并行化的某些方面(包括部分重复的段的定义和示例)例如在美国专利申请14/578,516、14/578,518、14/583,119、14/637,418、14/673,884、14/673,889和14/690,424中被处理,这些美国专利申请全部转让给本专利申请的受让人,并且其公开内容通过引用被并入本文。

在本实施例中,每个线程24包括提取单元28、解码单元32和重命名单元36。提取单元24从存储器中(例如,从多级指令高速缓存中)提取它们的相应代码段的程序指令。在本示例中,处理器20包括存储器系统41,其用于存储指令和数据。存储器系统41包括多级指令高速缓存,其包括一级(l1)指令高速缓存40和二级(l2)高速缓存42,其缓存在存储器43中存储的指令。解码单元32对提取的指令进行解码。

重命名单元36执行寄存器重命名。由解码单元32提供的解码的指令通常根据处理器的指令集架构的架构寄存器来指定。处理器20包括寄存器文件50,该寄存器文件包括多个物理寄存器。重命名单元将解码的指令中的每个架构寄存器关联到寄存器文件50中的相应物理寄存器(通常为目的地寄存器分配新的物理寄存器,并将操作数映射到现有的物理寄存器)。在一些实施例中,使用下面进一步详细描述的技术来乱序执行段的重命名。

重命名的指令(例如,由重命名单元36输出的微操作)被缓冲在乱序(ooo)缓冲器44中,以用于由多个执行单元52进行乱序(即,不按照指令被提取单元28提取的顺序)执行。

在ooo缓冲器44中缓冲的重命名指令被调度以用于由各个执行单元52执行。指令并行化通常通过同时向各个执行单元发出多个(可能乱序地)重命名指令/微操作来实现。在本示例中,执行单元52包括被表示为alu0和alu1的两个算术逻辑单元(alu)、乘法累加(mac)单元、被表示为lsu0和lsu1的两个加载-存储单元(lsu)、分支执行单元(bru)和浮点单元(fpu)。在可选的实施例中,执行单元52可包括任何其他合适类型的执行单元和/或每种类型的任何其他合适数量的执行单元。线程24、ooo缓冲器44和执行单元52的级联结构在本文被称为处理器20的流水线。

由执行单元52产生的结果被保存在寄存器文件50中,和/或被存储在存储器系统41中。在一些实施例中,存储器系统包括介于执行单元52和存储器43之间的多级数据高速缓存。在本示例中,多级数据高速缓存包括1级(l1)数据高速缓存56和l2高速缓存42。

在一些实施例中,处理器20的加载-存储单元(lsu)在执行存储指令时将数据存储在存储器系统41中,并且在执行加载指令时从存储器系统41取出数据。数据储存和/或取回操作可使用数据高速缓存(例如,l1高速缓存56和l2高速缓存42)来减小存储器访问延迟。在一些实施例中,高级高速缓存(例如,l2高速缓存)可被实现为例如在相同物理存储器中的单独的存储器区域,或者在没有固定预分配的情况下仅仅共享相同的存储器。

分支预测单元60预测分支或流控制轨迹(单次预测中的多个分支)(在本文中为简化起见而被称为的“轨迹”),其预期在由各种线程24执行期间由程序代码遍历。基于预测,分支预测单元60指示提取单元28将从存储器中提取哪些新指令。在这个上下文中,分支预测可预测对于段或对于段的部分的整个轨迹,或预测单独分支指令的结果。当并行化代码时,例如,如在上面引用的专利申请中所描述的,状态机单元64管理各个线程24的状态,并且在适当时调用线程来执行代码段。

在一些实施例中,处理器20并行化在线程24当中的程序代码的处理。并行化任务可以在处理器20的各个元件之间分布或分割。因此,在本公开的上下文中和权利要求书中,单元60、64、32和36被统称为线程并行化电路(或出于简洁而仅被称为并行化电路)。在可选的实施例中,并行化电路可以包括处理器20中的单元的任何其他合适的子集。

在一些实施例中,可以使用运行时软件来执行并行化电路的一些或甚至全部功能。这种运行时软件通常与由处理器执行的软件代码分开,并且可以例如在单独的处理核心上运行。

图1中所示的处理器20的配置是示例配置,其纯粹为了概念清楚起见而被选择。在可选的实施例中,可使用任何其他合适的处理器配置。例如,在图1的配置中,使用多个提取、解码和重命名单元来实现多线程。另外或可选地,多线程可以以许多其他方式实现,诸如使用每线程的多个ooo缓冲器、单独的执行单元和/或每线程的单独的寄存器文件。在另一个实施例中,不同的线程可以包括不同的相应处理核心。

作为又一个示例,处理器可以在没有高速缓存或具有不同的高速缓存结构、在没有分支预测或者每线程有单独的分支预测的情况下实现。处理器可包括图中未示出的附加元件。此外,可选地,所公开的技术可以用具有任何其它合适的微型架构的处理器执行。

处理器20可以使用任何合适的硬件来实现,诸如使用一个或更多个专用集成电路(asic)、现场可编程门阵列(fpga)或其他设备类型。另外或可选地,可使用软件或使用硬件和软件元件的组合来实现处理器20的某些元件。可以使用诸如随机存取存储器(ram)的任何合适类型的存储器来实现指令和数据高速缓存存储器。

处理器20可以用软件编程以执行本文描述的功能。软件可通过网络以电子形式下载到处理器,例如,或者可选地或另外,软件可以被提供和/或储存在非暂时性有形介质(诸如,磁存储器、光存储器或电子存储器)上。

在一些实施例中,处理器20的并行化电路监控由一个或更多个线程24处理的代码,识别至少部分地重复的代码段,并且并行化这些代码段的执行。例如,在上面引用的美国专利申请14/578,516、14/578,518、14/583,119、14/637,418、14/673,884、14/673,889和14/690,424中处理了由并行化电路执行的并行化功能的某些方面,包括部分重复的段的定义和示例。

使用推测性寄存器映射的乱序重命名

在一些实施例中,处理器20中的并行化电路选择程序代码的段,并且调用各个硬件线程24来至少部分并行地处理段。在一些实施例中,虽然不一定,但这些段可以是重复指令序列的部分,诸如循环迭代或其部分,或者函数或其部分。然而,通常并行化电路可以选择任何合适的代码段来进行并行化。

考虑处理特定代码段的特定硬件线程24。在该线程中,重命名单元36通常从解码单元32接收解码的指令流。解码的指令根据在处理器的指令集架构中定义的架构寄存器来指定。在下面的描述中,架构寄存器被表示为{r1,r2,r3,...}。架构寄存器也被称为逻辑寄存器,因为它们不与任何固定的物理存储器位置相关联。

重命名单元36将架构寄存器映射到处理器的物理寄存器50。在下面的描述中,物理寄存器被表示为{p1,p2,p3...}。在示例实施例中,处理器20的指令集架构支持16个架构寄存器{r0...r15}和128个物理寄存器{p0...p127}。但是,可选地,可以使用任何其他合适数量的架构寄存器和物理寄存器。每个物理寄存器对应于其中可以存储值或从其加载值的相应物理存储位置。术语“将架构寄存器映射到物理寄存器”、“将物理寄存器分配给架构寄存器”和“寄存器重命名”是指相同的操作,并且在本文中可互换使用。为了简洁起见,给定段的指令中的寄存器的重命名在本文中也被称为“重命名段”。

在任何给定时间,重命名单元保存将架构寄存器中的一个或更多个映射到一个或更多个相应物理寄存器的架构到物理寄存器的映射。重命名单元将映射应用于输入的解码指令流,并且输出其中架构寄存器已经被重命名为物理寄存器的操作流(例如,微操作或指令)。在典型的实施例中,在解码单元32中创建微操作,并且重命名单元36将微操作中的架构寄存器重命名为适当的物理寄存器并输出所得到的微操作。由单元36输出的操作被缓冲在ooo缓冲器44中,并最终被分派用于在各个执行单元52中执行。

为简洁起见,架构寄存器到物理寄存器的映射在本文中简称为寄存器映射。重命名单元通常在段的处理期间不断更新寄存器映射。重命名单元通常将物理寄存器分配给目的地架构寄存器(被写入的寄存器),并且通过改变架构寄存器到新分配的物理寄存器的映射来相应地更新寄存器映射。此外,对于伴随作为操作数的特定架构寄存器的每条指令,使用该映射,重命名单元知道应该读取哪些物理寄存器。

段的开始处的寄存器映射在本文被称为初始映射,并且段的末尾处的寄存器映射被称为最终映射。

代码并行化的挑战之一是通过解决段之间的数据依赖性来并行化重命名单元36的操作。例如,如果第一段中被写入的架构寄存器通过后续第二段中的指令被读取作为操作数,则第二段应该知道在第一段的末尾处其中该值被存储的物理寄存器。一种可能的解决方案将是等待直到第一段中的重命名完成(即,直到第一段的最终寄存器映射完成为止),然后才开始重命名第二段(其中第二段的初始寄存器映射从第一段的最终寄存器映射导出)。这种解决方案基本上意味着一个接一个地执行对段的重命名。这种解决方案可以由单个重命名器执行,这会大大降低并行化性能。

另一种可能的解决方案可以包括例如继续重命名第二段直到重命名单元需要其不知道相关联的物理寄存器的操作数,然后停止重命名第二段直到第一段的末尾(在该点处与操作数相关联的物理寄存器是已知的)。又一种可能的解决方案可以包括继续重命名第二段,直到重命名单元需要其不知道相关联物理寄存器的操作数,继续重命名过程而不将物理寄存器分配给操作数。稍后,当物理寄存器变为已知时,可以在rob或调度器中的适当指令或微操作中进行更新。

在本发明的一些实施例中,并行化电路在段之间执行这种协调,同时允许重命名单元乱序操作,即在前一段的重命名完成之前开始重命名某个段中的寄存器。因此,重命名单元不太可能因未解决的依赖关系而拖延(并导致后续操作拖延)。

下面的描述涉及代码的第一段和第二段。第二段在代码比第一段晚出现。尽管如此,并行化电路使得重命名单元能够在第二段的所有指令的重命名完成之前重命名第二段的一个或更多个指令。在实施例中,第一段和第二段中的寄存器重命名由不同的硬件线程24中的不同的重命名单元36执行。为了清楚起见,下面的描述共同指的是各种重命名单元。

图2是根据本发明的实施例示意性地说明用于寄存器重命名的方法的流程图。该方法开始于并行化电路在段选择步骤80处选择第一段和第二段,该第二段在代码中比第一段晚出现。

在最终映射创建步骤84中,并行化电路预测预期在第一段末尾处由重命名单元产生的最终寄存器映射。这个预测的寄存器映射在本文中被称为推测性最终映射。

并行化电路通常在创建初始映射之后立即预测推测性最终映射,或者可选地在任何其他合适的时间预测推测性最终映射。例如,并行化电路可以调用线程24来处理第一段,并且作为调用的一部分向线程提供段的初始映射和推测性最终映射。然而,一般而言,第一段的推测性最终映射可以在第一段的重命名完成之前的任何适当时间产生。第一段的推测性最终映射可以包括将一个或更多个架构寄存器映射到一个或更多个相应物理寄存器的任何合适数量的条目。

并行化电路然后在导出步骤88从第一段的推测性最终寄存器映射导出第二段的初始寄存器映射。第二段的初始映射可以包括将一个或更多个架构寄存器映射到一个或更多个相应物理寄存器的任何合适数量的条目。

一个或更多个条目可以在不改变第一段的推测性最终映射的情况下被复制。一个或更多个条目可以相对于第一段的推测性最终映射进行修改。一个或更多个条目可能是新的,即,将物理寄存器分配给未在第一段的推测性最终映射中指定的架构寄存器。下面进一步描述用于导出第二段的初始寄存器映射的示例技术。

在重命名步骤92处,重命名单元开始重命名第二段中的寄存器,从在步骤88导出的初始寄存器映射开始。第二段的重命名在第一段的重命名完成之前开始。在一些实施例中,第二段的重命名甚至可以在开始重命名第一段之前开始。

预测第一段的推测性寄存器映射,并导出第二段的初始寄存器映射

在一些实施例中,并行化电路基于针对两个段被监控和记录的寄存器访问信息来预测第一段的推测性寄存器映射并且导出第二段的初始寄存器映射。寄存器访问信息在本文中被称为记分板(scoreboard)。用于并行化的记分板的构建和使用例如在美国专利申请14/578,516、14/578,518、14/583,119、14/637,418、14/673,884和14/690,424中被处理,这些美国专利申请全部转让给本专利申请的受让人,并且其公开内容通过引用被并入本文。

并行化电路通常通过在指令被处理器处理时监控指令来构建一个或更多个记分板。因此,每个段与记分板相关联,该记分板指定在该段中如何访问架构寄存器。通常,虽然不一定,但记分板与特定的流控制轨迹相关联,即与由指令所遍历的特定流控制路径相关联。

与段相关联的记分板可以包括与段的指令的寄存器访问有关的各种类型的信息。以下描述主要涉及两种类型的信息,寄存器分类和最后写入指示(lwi)。

在一些实施例中,作为构建段的记分板的部分,并行化电路将每个架构寄存器分类为全局(g)、局部(l)或全局-局部(gl),并且在记分板中指示分类。在一些实施例中,还针对处理器标志执行并记录该分类。接下来的描述集中于寄存器,但是为了清楚起见,所公开的技术也可以应用于标志。作为g、l或gl的寄存器的分类取决于在段中寄存器被用作操作数(其值被读取)和/或用作目的地(值被写入到其)的顺序。

在实施例中,局部(l)寄存器被定义为其在段中的第一次出现作为目的地(随后的出现——如果有的话——可以是作为操作数和/或目的地)的寄存器。全局(g)寄存器被定义为在段中仅作为操作数使用的寄存器,即寄存器被读取但从不被写入。全局-局部(gl)寄存器被定义为在段中的第一次出现作为操作数,且后来在段中被用作目的地的寄存器。只要“第一次”和“后续”之间的顺序被保留,则第一次和后续出现可能发生在不同的指令中或同一指令中。

此外,对于一个或更多个寄存器,并行化电路在记分板中指定对寄存器的最后写入操作在段中的位置。该指示在本文中被称为最后写入指示(lwi)。可以使用任何合适的指示来指示最后写入操作的位置,例如对寄存器的写入次数的计数或最后写入操作的地址。以下描述主要涉及写入次数,且术语“段中寄存器的lwi”和“段中寄存器的写入次数”在本文中可互换使用。

在一些实施例中,并行化电路通过以下操作来预测第一段的推测性最终映射:

■选择一个或更多个目的地寄存器,即预期在第一段期间被写入的一个或更多个架构寄存器。目的地寄存器的识别是使用在与第一段相关联的记分板中指定的寄存器分类进行的--预计被写入的架构寄存器被分类为l或gl。选择哪些目的地寄存器将被预先分配物理寄存器可以取决于它们(已知的或预测的)作为第二段中的操作数的用途。

■在第一段的推测性最终映射中为选定的目的地寄存器分配新的物理寄存器。请注意,这种分配通常在具有所选的目的地寄存器的指令到达重命名单元之前执行。

当重命名第一段时,重命名单元从并行化电路接收一个或更多个最后写入指示。基于这些指示,重命名单元确保对每个所选目的地寄存器的最后写入操作被执行到在第一段的推测性最终映射中指定的相应物理寄存器。换句话说,当处理对第一段中的所选的目的地寄存器的最后写入指令时,重命名单元将该目的地寄存器重命名为在第一段的推测性最终映射中指定的相应新的物理寄存器(并不简单地挑选任意的物理寄存器)。使用与第一段相关联的记分板中指定的lwi来识别对各个目的地寄存器的最后写入指令。

在一些实施例中,并行化电路可以向程序代码添加一个或更多个微操作(或其他指令),其将第一段中的最后写入操作的结果移动到适当的物理位置(移动到第二段中预分配的物理寄存器)。如下面将详细解释的,第一段中的最后写入操作的结果和第二段中的预分配的物理寄存器可以位于相同的寄存器文件中或不同的寄存器文件中。

在一些实施例中,并行化电路通过将所选择的目的地寄存器的上述映射从第一段的推测性最终映射复制到第二段的初始寄存器映射来导出第二段的初始寄存器映射。

该初始寄存器映射典型地反映了寄存器架构状态,就好像第一段已经被重命名单元完全处理一样。换句话说,第二段所看到的操作数位置反映了第一段完成的寄存器更新。

强调的是,这种协调通常是在第一段被完全重命名之前创建的(因为它是基于当开始重命名第一段时通常产生的第一段的推测性最终映射),并且实际上甚至可能在对第一段的重命名开始之前执行。

在各种实施例中,如上所述,对于在第一段中出现的各种目的地寄存器的子集,并行化电路可以在第一段和第二段之间协调物理寄存器。在一个实施例中,针对出现在第一段中的所有目的地寄存器(即,对于在第一段的记分板中被分类为l或gl的所有架构寄存器)执行协调。

因此,在另一个实施例中,仅对在第一段的记分板中被分类为gl(但不是l)的目的地寄存器执行协调。在可选的实施例中,针对在第一段的记分板中被分类为l(但不是gl)的目的地寄存器执行协调。可选地,可以使用目的地寄存器的其他分区来决定何时使用这种协调。对于其他目的地寄存器,不预先分配物理寄存器。

在又一个实施例中,对于出现在第一段中的目的地寄存器,只有当预期在第二段中访问该寄存器时,才对其执行协调。如果可用(或被预测)的话,则可以从第二段的记分板获得该信息。如果第二段的记分板(或其预测)不可用,则并行化电路可决定对所有目的地寄存器执行上述协调。如果第一段中出现的所有目的地寄存器被预期(或至少被预测)在第二段中被访问,则可以做出同样的决定。通常按每个寄存器做出这个决定。

在一些实施例中,对于仅在第一段中被读取的架构寄存器(即,在第一段的记分板中被分类为g),并行化电路将物理寄存器的现有分配从第一段的初始映射复制到第二段的初始映射。

在一些实施例中,用于上述技术的寄存器访问信息是近似的而非精确的。例如,记分板中的寄存器访问信息可以指定在第一段中哪些寄存器不被写入以及第一段中哪些寄存器被写入(而不指定对每个寄存器的写入次数或最后一次写入发生的位置)。近似的寄存器访问信息的另一个示例是当记分板中指定的写入次数大于针对特定流控制轨迹之一将发生的写入时。例如,在以上所引用的美国专利申请14/637,418和14/690,424中解决了近似记分板的构建和使用。

在一些实施例中,第一段和第二段共享相同的物理寄存器文件(或以其他方式共享相同的一组物理寄存器),并且第一段的推测性最终寄存器映射未对在第二段中需要的寄存器(g和gl)指定“未分配”(na)。在这样的实施例中,第二段的初始寄存器映射将自动反映物理寄存器到第一段的推测性最终映射中的目的地寄存器的任何预分配。

可选地,如果第一段的最终寄存器映射确实针对第二段中所需的寄存器指定了na,则第二段的初始寄存器映射可以将空闲物理寄存器预先分配给第二段中所需的且在第一段的最终寄存器映射中不可用的操作数。可选地,第二段的初始寄存器映射可能不将空闲物理寄存器预先分配给第二段中所需的且在第一段的最终寄存器映射中不可用的操作数。在后一种情况下,当具有未分配的操作数的指令到达重命名单元时,重命名单元可能会停止直到收到所需的信息。

在可选的实施例中,第一段和第二段可以使用单独的物理寄存器文件。在这种情况下,第一段不能直接写入可由第二段直接读取的寄存器。在这些情况下,第二段的初始寄存器映射会将空闲物理寄存器(从其寄存器文件中)预先分配给第二段中所需的并在第一段中被写入(无论它们的写入次数是否是已知的,因为它们在另一个寄存器文件中被写入)的操作数。

在一些实施例中,第一段的推测性最终映射和从其导出的第二段的初始映射是完整的,即包含出现在第一段和第二段中的所有架构寄存器。在这种情况下,一旦第二段的初始映射已经被导出,重命名单元就可以自由进行并重命名第二段。

在可选的实施例中,寄存器映射可能是不完整的,即,第二段的初始映射可能缺少对出现在第二段中的一个或更多个架构寄存器的物理寄存器的分配。这种缺失的分配被表示为“na”。在实施例中,即使第二段的初始映射不完整,重命名单元也开始重命名第二段。重命名过程可在不暂停重命名单元的情况下继续进行,直到遇到包含尚未映射到任何物理寄存器的架构寄存器的指令为止。

在可选的实施例中,一旦na被解析(即,寄存器的物理位置变得已知),并行化电路就可以更新第二段的映射。应该考虑两种情况。在第一种情况下,na的解析发生在对第二段中的其中特定寄存器被用作操作数的指令的解码之前。(在这种情况下,没有问题并且处理第二段的重命名单元可以继续工作)。在第二种情况下,重命名单元遇到有na的操作数。这种情况有两种解决方案:重命名单元可以停止重命名第二段,或者让指令/微操作在流水线中继续,而不指定操作数的物理寄存器的位置。一旦知道物理位置,重命名单元就可以更新rob或调度器中的相关指令。示例方法流程和重命名过程

图3是根据本发明的实施例示意性地说明用于寄存器预分配的方法的流程图。该方法有两部分:步骤100-116描述从前一段(表示为段x-1)的推测性最终映射导出段(表示为段x)的初始寄存器映射的过程。步骤120-132描述了根据段x的初始映射预测段x的推测性最终映射的过程。可以重复执行图3的方法,以并行化多个段的重命名。

该方法开始于处理器20的并行化电路在调用步骤100处调用某个硬件线程24来处理段x。段x-1的推测性最终寄存器映射在调用时可用。如上所解释的,段x-1可能在此阶段没有被完全重命名。

在检查步骤104处,并行化电路每操作数(例如,将在段x期间被读取的每个架构寄存器,或者如上所述的针对所有寄存器)检查在段x-1的推测性最终寄存器映射中是否有可用于该架构寄存器的最终映射。如果可用且两个段共享寄存器文件(或不可用且不需要),则并行化电路在复制步骤108处将现有映射从段x-1的推测性最终寄存器映射复制到段x的初始映射。

如果最终映射不可用,或者如果这两个段不共享相同的寄存器文件(或者另外使用不同的物理寄存器组),则并行化电路可以在操作数预分配步骤112处选择将新的物理寄存器预先分配给所讨论的操作数,并且将该分配添加到段x的初始映射。可选地,并行化电路可以选择让操作数不可用(在这种情况下,如果重命名单元获得该指令,则它将停止直到通知操作数的位置)。当操作数的值变得可用时,并行化电路在值供应步骤116处使该值可用于预分配的物理寄存器。

每个操作数(例如,将在段x期间被读取的每个架构寄存器,或者针对寄存器的任何子集)重复步骤104-116的过程。该过程在过渡步骤120处结束,其中段x的(推测性)初始映射可用。

然后,并行化电路继续根据段x的推测性初始映射预测段x的推测性最终映射。在目的地预分配步骤124处,并行化电路将相应的物理寄存器分配给一个或更多个选择的目的地寄存器,即,预计在段x期间被写入的一个或更多个架构寄存器。针对最终目的地选择物理寄存器将被预分配给的架构寄存器可以或可以不取决于未来寄存器的预测用途。在终止步骤128处,段x的推测性最终映射是可用的。

当在重命名步骤132处重命名时,重命名单元保证对每个所选的目的地寄存器的最后写入被映射到在步骤124预分配的相应物理寄存器中。

图4是根据本发明的实施例示意性地图示了用于将物理寄存器预分配到目的地寄存器的过程的图。图4示出了处理器20的并行化电路如何基于代码段的初始寄存器映射140来预测同一段的推测性最终寄存器映射152。如上所解释的,基于初始映射140、段的记分板144和目的地寄存器预分配148来预测推测性最终映射152。记分板144可以是精确的或近似的。

在本示例中,记分板144指示架构寄存器r0未在段中使用。因此,该寄存器(到物理寄存器p11)的映射从映射140复制到映射152。

同样在本示例中,寄存器r1在最终映射152中没有被分配任何物理寄存器,并且该寄存器在映射152中的条目保留为未分配(na)。例如,这种缺乏分配可能是由于预测这个寄存器将不被后面的段读取。未在最终映射152中分配物理寄存器的另一原因可能是对r1的写入次数未知。

寄存器r2在记分板144中被指定为“只读”(即,被分类为全局-g)。因此,该寄存器(到物理寄存器p13)的映射从映射140被原样复制到映射152。寄存器r3在记分板144中被指定为“读取和写入”(即,被分类为全局-本地(gl))。因此,并行化电路在预分配148中向该寄存器预先分配新的物理寄存器(p16)。该预分配被复制到最终映射152。

图5是根据本发明的实施例示意性地图示了用于将物理寄存器预分配到操作数和目的地寄存器的过程的图。图5的顶部示出了并行化电路如何基于先前代码段的预测的推测性最终寄存器映射156以及操作数预分配160来导出代码段的推测性初始寄存器映射164。

在本示例中,前一段的最终映射156不完整--架构寄存器r0、r1和r2的条目不可用,并分别标记为na0、na1和na2。换句话说,在前一段重命名结束时分配给架构寄存器r0、r1和r2的物理寄存器是未知的。映射156中缺失的分配可能是由于各种原因。例如,r0可能不会映射到任何物理寄存器,因为预计它不会被后面的段读取。

作为另一个示例,r1可能不会被映射,因为产生这个操作数的前一个段不会与当前段共享同一个物理寄存器文件。r2可能不被映射,因为该寄存器的记分板(在前一段中)是近似的,因此不能预先分配目的地寄存器的最终物理位置。但是,这些场景纯粹是通过举例的方式给出的,且其他各种场景都是可能的。

对于在前一段的最终映射156中未分配物理寄存器的一个或更多个操作数,并行化电路可在导出当前段的初始映射时向该操作数预分配新的物理寄存器。在图5的示例中,寄存器r1和r2在操作数预分配160中分别被预分配物理寄存器p17和p18。该预分配被复制到当前段的初始映射164。

请注意,并不对寄存器r0执行操作数预分配,即使其在映射156中没有被映射到任何物理寄存器。因此,允许寄存器r0在当前段的初始映射164中保持定义为na。如上所解释的,在实施例中,重命名单元仍然可以继续重命名当前段,并且只有在遇到读取r0的指令时才停止,直到r0的值变得可用。

进一步注意的是,如果段x和x-1不共享相同的寄存器文件,则操作数寄存器预分配160包含仅可以由段x直接访问(而不是直接由段x-1访问)的物理寄存器(p17、p18)。在这种情况下,操作数寄存器预分配160还可以包括用于r3和r4的物理寄存器,并且在初始寄存器映射164中,物理寄存器p10(r3)和p15(r4)可以不从最终寄存器映射154复制并且应该被分配有其他物理寄存器或未分配(na)。

图5的底部示出了并行化电路如何使用初始映射164来预测该段的推测性最终寄存器映射180。与上面的图4的过程类似,该过程使用当前段的记分板172和目的地预分配176。这个过程可能考虑到未来预测的段的记分板。

尽管本文描述的实施例主要涉及第一段和第二段,但是所公开的技术可以用于对任意期望数量的段进行乱序重命名。例如,段#8可以在段#5之前重命名,并且通常段#5-#8中的每一个可以以任何顺序重命名。

在可选的实施例中,预分配可能不一定使用物理寄存器本身来执行,而是使用第三虚拟实体来在这些段之间进行协调。

所公开的技术不依赖于任何特定的寄存器文件结构或任何特定的重命名方案。相反,所公开的技术可以结合任何类型的寄存器文件和任何重命名方案来执行。例如,在上面引用的文章“thedesignspaceforregisterrenamingtechniques”中描述了可以与所公开的技术相适应的示例重命名方案。

此外,所公开的技术对于其中采取不同步骤的处理器流水线中的位置是不可知的。

因此,将认识到的是,以上描述的实施例是通过示例的方式引用的,并且本发明并不限于上文已具体示出和描述的内容。相反,本发明的范围包括上文所描述的各种特征的组合及子组合以及本发明的变型和修改,所述变型和修改将在本领域的技术人员阅读上述描述之后想到且在现有技术中未被公开。通过引用并入本专利申请中的文件被视为本申请的组成部分,除了任何术语在这些并入的文件中在某种程度上以与本说明书中明确地或隐含地作出的定义冲突的方式被定义之外,应该仅考虑本说明书中的定义。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1