首页> 中国专利> 具有精确中断和/或重写的向量指令

具有精确中断和/或重写的向量指令

摘要

一种处理器,包括:包含多个向量寄存器的向量寄存器文件、至少一个缓冲寄存器以及向量处理核心,该向量处理核心通信地连接到向量寄存器文件和至少一个缓冲寄存器,以接收向量指令,该向量指令包括表示多个向量寄存器中的第一向量寄存器的第一标识符和表示多个向量寄存器中的第二向量寄存器的第二标识符,其中第一向量寄存器是源寄存器,以及第二向量寄存器是目的地寄存器;基于存储在第一向量寄存器中的数据值执行向量指令以生成结果并将结果存储在至少一个缓冲寄存器中;以及响应于确定第二向量寄存器是安全写入的,将结果从至少一个缓冲寄存器复制到第二向量寄存器。

著录项

  • 公开/公告号CN112912843A

    专利类型发明专利

  • 公开/公告日2021-06-04

    原文格式PDF

  • 申请/专利权人 优创半导体科技有限公司;

    申请/专利号CN201980061943.6

  • 发明设计人 玛雅·穆吉尔;J·格洛斯纳;

    申请日2019-08-13

  • 分类号G06F9/30(20060101);G06F9/38(20060101);G06F17/16(20060101);

  • 代理机构11280 北京泛华伟业知识产权代理有限公司;

  • 代理人王勇

  • 地址 美国纽约州

  • 入库时间 2023-06-19 11:14:36

说明书

本申请要求于2018年8月14日提交的美国临时申请62/718,426的优先权,其全部内容通过引用合并于此。

技术领域

本公开涉及计算机处理器,尤其涉及支持具有精确中断和/或重写的向量指令的处理器。

背景技术

向量处理器(也称为阵列处理器)是一种硬件处理装置(例如,中央处理单元(CPU)或图形处理单元(GPU)),其实现了包含对数据元素的向量进行操作的向量指令的指令集架构(ISA)。向量是包含有序标量数据元素的单向阵列。作为比较,标量指令对单个数据元素进行操作。与支持对单个数据元素进行操作的标量指令的标量处理器相比,向量处理器通过对包含多个数据元素的向量进行操作可以获得显著的性能改进。

附图说明

根据以下给出的详细描述以及本公开的各种实施例的附图,将更充分地理解本公开。然而,不应将附图视为将本公开限制于特定实施例,而是仅用于解释和理解。

图1示出了根据本公开的实施方式的硬件处理器。

图2示出了根据本公开的实施方式的使用缓冲寄存器的向量指令的示例性实施方式。

具体实施方式

实现为由硬件处理器执行的向量指令是对包含特定数据类型的多于一个元素的向量执行操作的指令。输入和输出数据被存储在与处理器相关联的一个或多个向量寄存器中。这些向量寄存器是存储单元,其被设计为保存向量的多个数据元素。示例性向量指令包括在x86指令集架构(ISA)中指定的流式单指令多数据扩展(SSE)指令。ISA的某些实施方式可以支持可变长度向量指令。可变长度向量指令包括寄存器标识符,该寄存器标识符指定用于存储将由该指令操作的向量的元素数的寄存器。可变长度向量指令中的寄存器称为向量长度寄存器。

尽管向量指令可以显著改善处理器性能,但是向量指令可能潜在地遭受读取后写入数据的危害。使用以下示例说明读取后写入数据的危害。作为示例,考虑一个指令集架构,该架构指定在指令中由$v0到$v7标识的八(8)个向量寄存器。这些向量寄存器中的每一个都能够保存32字节的数据。这32个字节可以以不同的方式使用来保存不同的数据类型。例如,32字节向量寄存器的元素被解释为:

·16个16位整数(半字),或

·8个32位整数(字),或

·8个32位浮点单精度数,或

·诸如8位整数、64位整数、16位浮点或64位浮点的其他数据类型的组合

向量寄存器上可以使用后缀来表示元素的不同数据类型。例如,“_h”,“_w”和“_f”可用于指示应将在该寄存器中存储的数据元素分别视为半字、字和单精度浮点值来处理。索引值[i]可用于指示存储在向量寄存器中的元素#i,其从0开始。因此,$v1_h[3]是寄存器$v1的第四个半字,存储在字节6和7中。作为示例,向量寄存器类型中不同类型的寄存器元素的排列如下表1中所示:

表1

如表1中所示,字0可以占据字节0至字节3的位置,该位置与由半字0和半字1所占据的位置重叠,因为它们被分别放置在字节0至字节1和字节2至字节3的位置处。

两个向量指令用于展示先读后写(WAR)危害:

·向量取反浮点指令:vnegf$vdst,$vsrc,

·向量转换无符号半字至字指令:vcvtuhw$vdst,$vsrc,

这两个指令均从源向量寄存器读取,并将结果写入目标向量寄存器。

向量取反浮点(vnegf)指令的语义是:

for(i=0;i<8;i++)

向量转换无符号半字至字指令(vcvtuhw)的语义是:

for(i=0;i<8;i++)

当目的地寄存器与源寄存器相同时,vcvtuhw指令可能具有潜在问题。考虑vcvtuhw$v3,$v3的情况。在这种情况下,目的是将$v0的前8个半字转换为字,然后将其存储回$3。但是,本地实施方式可能导致错误的结果。考虑以下简单实施方式:

·读取半字

·对其进行扩展

·以及将结果回写

·重复8次。

为了执行该指令,处理器的执行单元可以从$v3的字节0和1读取半字#0。执行单元可以将存储在字节0和1处的半字#0扩展为在字节0、1、2和3处的字,并写入$v3的字节0、1、2和3。接下来,执行单元可以从$v3的字节2和3读取半字#1。但是,这些字节不是指令开始处的原始字节。取而代之的是,它们已被半字#0的扩展值重写。这是先读后写危害(也称为反依赖性)的示例。这只是向量指令具有潜在的先读后写危害的一个示例。

防止发生WAR危害的一种方式是禁止目的地寄存器与向量指令的源寄存器相同。防止WAR危害的另一种方式是使用同时读取。微处理器可以包括指令执行流水线,该指令执行流水线可以进一步将指令执行划分为几个流水线级,包括指令获取级、指令解码和寄存器读取级、一个或多个指令执行级以及寄存器回写级。此外,指令执行流水线不对向量指令执行数据值的顺序评估(即,每次一个元素)。取而代之的是,指令执行流水线可以同时操作几个指令块并且并行评估几个元素。对于具有大量执行块和中等向量长度的处理器,指令执行流水线可以同时读取向量的所有元素,同时对其进行处理,然后将所有值回写至寄存器。这种实施方式将保证在任何写操作发生之前已读取所有元素,从而避免了WAR危害。例如,如果处理器具有8个执行块,则处理器可以使用以下顺序执行vcvtuhw指令:

·从向量寄存器读取所有8个半字

·扩展

·写入向量寄存器的所有8个半字

由于所有值都是在写入之前读取的,因此执行vcvtuhw指令可以避免WAR危害。

通过重新安排某些读取操作和写入操作,可以避免WAR危害。例如,在vcvtuhw指令被如上所述流水线化但仅使用4个执行块的情况下。处理器可以根据以下顺序执行vcvtuhw以避免WAR危害:

·读取前4个半字

·扩展前4个半字,读取后4个半字

·写入前4个字,扩展后4个字

·写入后4个字

一些实施方式可以使用寄存器重命名以避免WAR危害。寄存器重命名需要改变架构寄存器与物理寄存器之间的映射。ISA可以指定一组可由ISA定义的指令引用的寄存器(称为架构寄存器)。处理器可以包括可以用于支持架构寄存器的物理寄存器。程序可以包括引用一个或多个架构寄存器的向量指令。在执行期间,处理器可以将由第一向量指令调用的每个架构寄存器分配给相应的物理寄存器,从而在架构寄存器和物理寄存器之间创建第一映射。响应于对引用一个或多个架构寄存器的第二向量的调用,如果有可能发生意外的重写操作,则处理器可以更新架构寄存器和物理寄存器之间的映射。例如,如果处理器确定链接到第一架构寄存器的第一物理寄存器可以因第二向量指令中对第一架构寄存器的调用而被重写,则处理器可以更新第一架构寄存器到第二物理寄存器的映射,以避免意外的结果。为了实现寄存器重命名,处理器可能需要包括维持和更新架构寄存器与物理寄存器之间的映射的逻辑电路。维持和更新映射的逻辑电路很复杂,占用很大的电路面积并消耗功率。

不同的寄存器重命名方案可以包括以下步骤:

·每当寄存器是指令的目标时,都会有一个新的未使用的目的地寄存器被分配用于写入指令的输出,并且该寄存器被映射到该目的地寄存器。

·每当寄存器是指令的源时,都会读取最后映射的目的地以提供输入。

这意味着即使指令中指定的源架构寄存器和目标架构寄存器相同,它们实际上仍在向不同的物理寄存器写入和从不同的物理寄存器读取。实现寄存器重命名的处理器可以避免WAR危害,但是会以较大的电路面积和更多的功耗为代价。

在某些情况下,上述对WAR危害的解决方案并不令人满意。例如,向后ISA兼容性使得不可能禁止源寄存器和目的地寄存器相同。向量的长度可以大于执行块的数量或流水线的长度。这导致至少部分结果在完全读取向量之前被回写。在这种情况下,无法实现写前读。寄存器重命名需要更大的电路面积和更多的功耗。因此,寄存器重命名在低功耗和占用空间小的处理器中可能不可用。

为了克服上述和其他缺陷,本公开的实施方式提供了一种技术解决方案,该技术解决方案利用一个或多个另外的缓冲寄存器来扩充向量寄存器文件,并使用缓冲寄存器来消除WAR危害。与寄存器重命名方案相比,通过使用缓冲寄存器,本公开的实施方式可以实现与现有ISA的兼容性,允许长向量寄存器,并且消除了寄存器重命名所需的映射逻辑电路,以实现较小的电路占用空间和较少的功耗。

图1示出了根据本公开的实施方式的硬件处理器100。处理器100可以是中央处理单元(CPU)、CPU的处理核心、图形处理单元(GPU)或任何合适类型的处理装置。如图1所示,处理器100可以包括向量指令执行流水线104和向量寄存器文件106。处理器100可以包括实现根据向量指令集架构102指定的向量指令118的电路。向量指令118的执行可以分解为由向量指令执行流水线104处理的微操作。在向量长度远大于执行块的数量的情况下,微操作可以是可以对总向量的子集进行操作的子向量操作。例如,如果执行块的数量为八(8),并且向量长度为64,则需要八个子向量操作。向量指令执行流水线104可以包括指令获取级110、指令解码和寄存器读取级112、指令执行级114和指令回写级116。向量指令执行流水线104的每一级可以处理一个或多个向量指令的单独的微操作。较后级的执行可以取决于来自较早级的结果。所述微操作可以在耦合到处理器100的存储器中所存储的等待池中等待被执行。所述指令基于时钟周期移动通过向量指令执行流水线104。向量指令执行流水线104可以如下操作。

在第一时钟周期,指令获取级110可以从等待执行的微操作池中取出第一微操作。

在第二时钟周期,指令解码级112可以解码第一微操作,并且如果需要,从向量寄存器文件106的向量寄存器($v0-$v7)取出数据值;指令获取级110可以从池中取出第二微操作。

在第三时钟周期,指令执行级114可以执行解码的第一微操作;指令解码级112可以解码第二微操作,并且如果需要,从向量寄存器文件106的向量寄存器($v0-$v7)中取出数据值;指令获取级110可以从池中取出第三微操作。

在第四时钟周期,指令回写级116可以将由指令执行级114生成的结果写入到向量寄存器文件106的一个或多个向量寄存器($v0-$v7)中;指令执行级114可以执行解码的第二微操作;指令解码级112可以解码第三微操作,并且如果需要,从向量寄存器文件106的向量寄存器($v0-$v7)中取出数据值;指令获取级110可以从池中取出第四微操作。这样,向量指令执行流水线104可以同时且有效地通过流水线处理微操作。

在一个实施方式中,可以在没有用于寄存器重命名的映射逻辑电路的情况下实现处理器100以实现较小占用空间。代替在向量指令的执行期间使用映射逻辑电路动态生成和更新架构寄存器之间的映射,可以将向量指令集102中定义的每个架构寄存器分配给向量寄存器文件106中的相应物理寄存器。例如,如果向量指令集102定义八(8)个架构向量寄存器,则可以将每个架构寄存器固定地分配给$v0-$v7中的相应的一个。为了避免潜在的WAR危害,本公开的实施方式可以包括缓冲寄存器108。在一个实施方式中,除了向量寄存器文件106的向量寄存器($v0-$v7)之外,缓冲寄存器108是额外的寄存器。在另一个实施方式中,缓冲器寄存器108可以是存储器中的缓冲区。与向量寄存器($v0-$v7)不同,缓冲寄存器108没有在向量指令集102中定义,因此没有被映射到向量指令集102中定义的任何架构寄存器。因此,向量指令118无法识别缓冲寄存器108。取而代之的是,缓冲寄存器108可以用作中间存储器,其可以帮助消除WAR危害。在一个实施方式中,可以通过向量指令执行流水线104来正常地执行与WAR危害无关的指令。

由于在向量指令的执行期间,一对一地分配给物理寄存器的架构寄存器中的每一个不受寄存器重命名的影响,因此在下面的描述中架构向量寄存器(例如,$v0-$v7)也应理解为对应于或表示向量寄存器文件107中的相应的物理寄存器。在一个实施方式中,与处理器100相关联的向量寄存器可以被分为两组。向量寄存器文件106中的第一组向量寄存器,例如$v0-$v7,可以通过向量指令集102中定义的向量指令118进行识别;第二组缓冲寄存器108没有映射到向量指令118的任何架构寄存器,因此不能由向量指令集102的向量指令118识别。已知可能遭受WAR危害的指令可以在两个阶段执行。在第一阶段,指令解码级112可以对微操作进行解码并且从向量寄存器($v0-$v7)中读取。在由指令执行级114执行微操作之后,指令回写级116可以将结果写到缓冲寄存器108,而不是写到由微操作识别为目的地寄存器的向量寄存器($v0-$v7)中的任何一个。当与指令的执行相关联的所有微操作都已完成,并且期望的结果在缓冲寄存器中可用时,第二阶段可以开始。在第二阶段中,当可以安全地回写到目的地向量寄存器时,指令回写级116可以将结果从缓冲寄存器复制到目的地向量寄存器。

图2示出根据本公开的实施方式的使用缓冲器寄存器的向量指令的示例性实施方式。如图2所示,执行vectuwh$v3,$v3指令可以在两个阶段中进行。在阶段1中,指令执行级114可以执行vectuwh$v3,$v3,并且指令回写级116可以将结果写入缓冲寄存器($buffer),而不是所识别的目的地寄存器($v3)。该指令中未识别缓冲寄存器($buffer)。逻辑电路可以确定不再从目的地寄存器($v3)读取指令,并且在阶段2中可以安全地写入目的地寄存器。在阶段2中,逻辑电路可以将存储在缓冲寄存器($buffer)中的数据值复制到目的地寄存器($v3),而不会有WAR危害的风险。

使用额外的寄存器作为缓冲寄存器可能有助于使性能保持一致,因为指令回写级始终写入寄存器,并且将额外的寄存器添加到寄存器文件的成本比使用其他存储装置(例如触发器或锁存器)低。缓冲寄存器可以是单独的逻辑电路,也可以实现为对于$v0-$v7的附加寄存器。例如,如果使用8入口RAM实现$v0-$v7,则可将RAM扩展为9入口RAM,并将缓冲寄存器作为RAM中的第9个入口。在另一实施方式中,在阶段1中,指令回写级116可以写入存储器位置以暂时保存结果,并且在阶段2中,指令回写级116可以将在该存储器位置处存储的结果复制到目的地寄存器。

在另一个实施方式中,代替将输出的所有元素写入缓冲寄存器,指令回写级116可以将输出的元素的子集写入缓冲寄存器,随后将元素的子集复制到目的地寄存器,而其余元素则直接写入目的地寄存器。例如,如果在读取向量之后,输出向量的大多数元素都被重写,并且只有元素的小的子集遭受WAR危害,则该实施方式可以获得更高的效率。在这种情况下,仅需要缓冲在读取最后一个向量元素之前写入的向量元素;这样可以最大程度地减少需要复制的数据量。

在另一实施方式中,对于具有潜在的WAR危害的指令,指令回写级116总是将输出写入到缓冲寄存器中,而不管源寄存器和目的地寄存器是否相同。这具有使这些指令的控制规范化的好处,而无需检查源和目的地是否相同并且以不同的方式处理这两种情况。

缓冲寄存器可以用于实现精确的中断。大多数现代处理器架构都支持精确中断。如果所保存的处理器状态与程序执行的顺序模型(其中一个指令执行在写一个开始之前结束)相对应,则中断或异常被称为精确的。精确中断的要求之一是,当指令的执行被中断时,处理器的状态应该就好像该指令从未执行过。在向量指令的上下文中,这意味着,如果在执行向量指令期间停止处理器,则该指令的目标寄存器应该是未修改的。

问题出现在正在执行的指令造成中断时。例如,浮点操作会引发各种IEEE浮点中断。在向量浮点指令的情况下,如果逐元素操作中的任一个引起中断,并且如果支持精确中断,则该实施方式需要确保不写入向量指令的任何结果,包括在引发中断的元素之前已经计算的元素。

为了实现精确的中断,本公开的实施方式可以提供一种指令,该指令可能潜在地引发中断以总是写入缓冲寄存器。响应于确定指令的执行已成功完成,处理器可以将结果复制到实际输出寄存器。如果向量指令确实有中断,则在引发中断之前,将存储在缓冲寄存器中的结果丢弃。目的地寄存器不受干扰,以满足精确中断的要求。

精确中断所需的缓冲可以使用如图2所示的电路来实现。可以使用如图2所示的基本相同的电路结构来完成缓冲。

在一些实施方式中,精确中断要求将结果写入缓冲寄存器,如果没有中断发生,则将结果从缓冲寄存器复制到目的地寄存器。这在可以在多周期指令中及早确定中断是否会发生的情况下并不是最有效的方法。在这样的情况下,执行流水线可以确定中断是否将在早期阶段(例如,第一时钟周期)发生。例如,在除法操作中,执行流水线可以在第一个时钟周期(在通过向量指令执行流水线开始执行之前)确定是否存在由除零异常引起的中断(例如,通过检查除数是否为零或非常接近零)。在一个实施方式中,控制逻辑电路可以在执行流水线的早期确定是否将发生某些中断(例如在向量除法的情况下被零除)。响应于确定输出结果的任何元素都不会导致中断,可以将所有元素回写到向量寄存器,从而进一步提高精确中断的性能。

当指令的执行可能引发中断时先写入缓冲器然后进行复制以及当指令不能引发中断时直接写入向量寄存器的方法在处理器主要在指令不能引发中断的模式下运行时特别有效。在以下情况下,可能会发生该无中断模式:

·禁用所有中断,允许所有向量指令直接写入目的地寄存器

·各种中断(例如浮点中断)被单独禁用,从而允许大多数向量指令直接写入目的地寄存器。

·处理器可以被设置为中断不精确的模式,在这种情况下,向量指令引发具有部分写入目标的中断是可以接受的;在这种情况下,向量指令可以直接写入目的地寄存器。

在一个实施方式中,向量指令是否可以直接写入目的地寄存器取决于是否存在WAR危害的风险,或者处理器是否包括避免WAR危害的不同电路。如果处理器使用缓冲寄存器来避免WAR危害并支持精确中断,则即使未启用精确中断,该指令也可能需要对缓冲寄存器进行写入。

在另一个实施方式中,指令的执行可以在两个阶段中执行以提高精确中断性能。在第一阶段,指令的执行可以遍历所有元素以执行某些操作,以确定这些操作是否会引发中断。在第一阶段期间,处理器不更新任何状态(即,不更新目的地向量寄存器)。因此,由处理器执行的操作仅涉及自源向量寄存器的读取操作。

如果在第一阶段期间检测到中断,则对该指令引发中断。如果在第一阶段期间没有检测到中断,则指令的执行移至第二阶段。在第二阶段,指令遍历所有元素运行,这次计算结果并更新状态,包括任何目的地向量寄存器。这将涉及重新读取源向量寄存器。

这种方法的一个优点是,它可以用于为任何向量指令实现精确的中断,而不仅是那些更新寄存器的中断。考虑向量分散存储的指令,该指令在一系列存储器地址存储向量寄存器中的元素。这些地址之一可能是非法的,并会导致中断。可以撤消分散存储或缓冲分散存储直到所有地址都被解析的任何机制在计算上将是昂贵的。上面描述的在第一阶段中验证所有地址并在第二阶段中写出结果的两阶段方法是更有效的。当大多数时间都没有精确中断时,这种两阶段方法特别有用;如果中断关闭,则仅需要执行第二阶段。精确中断可用于调试程序错误,因为它们可以保证处理器在指令边界上停止,其中在完成引起中断的指令之前,机器的状态与所有指令的状态保持相同,而没有随后的指令修改处理器状态。但是,如上所述,精确中断可能会增加额外的性能开销。因此,在一些实施方式中,可以禁用精确中断模式以进一步提高处理器性能。当精确中断模式被禁用并且发生异常时,处理器状态将无法保证清晰边界。例如,引起中断的指令可能已经写入了目的地寄存器的一部分。

在另一实施方式中,该两阶段方法可以被应用于存储器访问指令,而缓冲器机制用于向量寄存器操作。

上面的描述意图是说明性的,而不是限制性的。尽管已经参考特定的说明性示例和实施方式描述了本公开,但是将认识到,本公开不限于所描述的示例和实施方式。本公开的范围应参考所附权利要求书以及权利要求书被赋予的等效物的全部范围来确定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号