处理针对向量指令的元素间地址危害的制作方法

文档序号:17534282发布日期:2019-04-29 13:49阅读:130来源:国知局
处理针对向量指令的元素间地址危害的制作方法
本技术涉及数据处理的领域。
背景技术
:某些数据处理系统支持向量指令的处理,对于该处理而言,来源操作数(operand)或指令的结果值是包括多个数据元素的向量。通过支持响应于单一指令而处理许多相异的数据元素,可改良代码密度且指令的提取及译码的负荷减少了。可通过将数据值加载进向量操作数的相应元素及使用单一向量指令一次处理若干元素的数据值来更高效地处理要处理的数据值数组。技术实现要素:至少某些示例提供了一种装置,该装置包括:处理电路系统,用于响应于指令而执行数据处理,其中响应于向量加载指令,该处理电路系统被配置为从数据储存器的相应位置将数据加载给向量值的相应数据元素,且响应于向量储存指令,该处理电路系统被配置为从向量值的相应数据元素将数据储存到该数据储存器的相应位置;其中该处理电路系统响应于事务开始事件而推测性地执行一个或更多个后续指令,且响应于事务结束事件而实行在该事务开始事件之后所推测性地执行的该一个或更多个后续指令的推测性结果;该装置包括危害检测电路系统,该危害检测电路系统用于检测在相对应于用于先前的向量加载指令的数据元素j的地址及相对应于用于后来的向量储存指令的数据元素k的地址之间是否发生元素间地址危害,该先前的向量加载指令是在该事务开始事件之后推测性地执行的,该后来的向量储存指令是在该事务开始事件之后推测性地执行的,其中k与j不同,且该先前的向量加载指令及该后来的向量储存指令两者是来自由该处理电路系统所处理的相同指令线程;其中响应于检测到该元素间地址危害,该危害检测电路系统被配置为触发该处理电路系统以中止该事务开始事件之后的指令的进一步处理且防止该推测性结果被实行。至少某些示例提供了一种装置,该装置包括:处理模块,其用于响应于指令而处理数据,其中响应于向量加载指令,该处理模块被配置为从数据储存器的相应位置将数据加载给向量值的相应数据元素,且响应于向量储存指令,该处理模块被配置为从向量值的相应数据元素将数据储存到该数据储存器的相应位置;其中该处理模块响应于事务开始事件而推测性地执行一个或更多个后续指令,且响应于事务结束事件而实行在该事务开始事件之后所推测性地执行的该一个或更多个后续指令的推测性结果;该装置包括检测模块,其用于检测相对应于用于先前的向量加载指令的数据元素j的地址及相对应于用于后来的向量储存指令的数据元素k的地址之间的元素间地址危害,该先前的向量加载指令是在该事务开始事件之后推测性地执行的,该后来的向量储存指令是在该事务开始事件之后推测性地执行的,其中k与j不同,且该先前的向量加载指令及该后来的向量储存指令两者是来自由该处理电路系统所处理的相同指令线程;及响应于检测到该元素间地址危害,该检测模块被配置为触发该处理模块以中止该事务开始事件之后的指令的进一步处理且防止该推测性结果被实行。至少某些示例提供了一种数据处理方法,该方法包括以下步骤:响应于事务开始事件,推测性地执行一个或更多个后续指令;响应于向量加载指令,从数据储存器的相应位置将数据加载给向量值的相应数据元素;响应于用于从向量值的相应数据元素将数据储存到该数据储存器的相应位置的向量储存指令,检测在相对应于用于该向量加载指令的数据元素j的地址及相对应于用于该储存指令的数据元素k的地址之间是否发生元素间地址危害,其中k与j不同,且该先前的向量加载指令及该后来的向量储存指令两者是来自相同的指令线程;响应于检测到该元素间地址危害,中止该一个或更多个后续指令的进一步处理,且防止该一个或更多个后续指令的推测性结果被实行;及响应于事务结束事件,实行该一个或更多个后续指令的推测性结果。附图说明将通过以下的示例说明理解本技术的进一步的方案、特征及优点,要与附图结合阅读该示例说明,在附图中:图1示意性地绘示支持向量指令的处理的数据处理装置的示例;图2示意性地绘示邻接的向量加载指令及邻接的向量储存指令的示例;图3为绘示在向量化代码的执行期间响应事务开始事件的方法的流程图;图4为图示响应于向量加载指令而更新危害追踪数据的方法的流程图;图5为图标响应事务清除事件以清除危害追踪数据的方法的流程图;图6为图标检测元素间地址危害的方法的流程图;图7为图标响应事务结束事件的方法的流程图;图8图标将数据并排储存在高速缓存中的危害追踪数据的第一示例;图9图标危害追踪数据的第二示例,其中由邻接的加载指令所存取的最小及最大地址被追踪在储存结构中;图10图示非邻接(或聚排)的向量加载指令的示例;以及图11图标危害追踪数据的第三示例。具体实施方式一种装置可具有支持向量指令的处理的处理电路系统。向量指令的一个示例是向量加载指令,响应于该向量加载指令,从数据储存器的相应位置将数据加载给向量值的相应数据元素。另一示例是向量储存指令,响应于该向量储存指令,处理电路系统可从向量值的相应数据元素将数据储存到数据储存器的相应位置。例如,用于向量加载/储存指令的向量值可被储存在缓存器中。该处理电路系统响应于一事务开始事件而推测性地执行一个或更多个后续指令,且响应于一事务结束事件而实行在该事务开始事件之后所推测性地执行的彼等一个或更多个后续指令的推测性结果。危害检测电路系统被提供为检测在相对应于用于先前的向量加载指令的数据元素j的地址及相对应于用于后来的向量储存指令的数据元素k的地址之间是否发生元素间地址危害,该先前的向量加载指令是在事务开始事件之后推测性地执行的,该后来的向量储存指令亦是在事务开始事件之后推测性地执行的。k及j是彼此不相等的整数值。该先前的向量加载指令及该后来的向量储存指令两者是来自由该处理电路系统所处理的相同指令线程。响应于检测到元素间地址危害,危害检测电路系统可触发处理电路系统以中止事务开始事件之后的指令的进一步处理且防止推测性结果被实行。可能不能立即理解的是,存在着危害检测电路系统检测所处理的相同指令线程内的后来及先前的指令之间的地址危害的需要。正常会期望该等指令依序作用,且因此不会需要例如危害检测或事务处置的机制,该等机制一般会用于由不同的程序线程进行的平行数据存取。然而,在支持向量处理的装置中,向量指令的通用用途是向量化以标量代码撰写的许多程序循环迭代,其中多个循环迭代被映像到用于向量指令序列的相应向量处理道。因此,向量加载指令可将要由许多连序的循环迭代所处理的输入加载进向量值的相应元素,一个或更多个向量指令可接着处理相应处理道中的彼等元素中的各者,且接着向量储存指令可将各道的结果储存到数据储存器中的相应位置。如此允许相较于使用标量指令单独执行各个迭代而言改良了效能且减少了指令高速缓存、提取及译码的负荷。然而,可能的是,可能在不同的标量循环迭代之间存在着相依性,其中例如先前的迭代可能将一值写入到数据储存器,而该值用作后来的迭代的输入。若此类循环迭代被映像到相同向量指令序列的不同道,则可能的是,某些结果可能是不正确的,因为相对应于被向量化的后来的循环迭代的道可能加载还未被相对应于先前的迭代的道更新的值。虽然可在编译时间静态地识别某些危害,如此不能保护免于所有潜在危害,因为某些加载/储存地址取决于从数据储存器所读取的其他值,所以危害是否发生可能在运行时间动态地变化。用于保护免于动态危害的一个方法可为在向量序列之前提供额外的代码以检查由相应道中的加载/储存行为所使用的地址,以防止在存在地址危害时向量化代码。然而,该等检查是缓慢的,且在向量化循环的每个迭代时招致彼等检查的惩罚可能对于效能是有害的。另一方法可为让编译程序保存地假设,因为在不同道中的加载/储存地址之间可能存在危害,标量循环不应被向量化,且反而应在使用标量指令来依序执行源代码中的各个循环迭代的情况下处理。然而,实作上,元素间地址危害是相对稀少的,所以此方法具有因为少数情况可能不产生正确的结果而抛弃了可在绝大部分情况下经由向量化来达成的任何潜在效能益处的风险。该等问题可通过以下步骤来解决:允许处理电路系统在事务开始事件之后开始推测性地执行指令序列,且允许在事务结束事件之后后续地实行所执行的指令的推测性结果。危害检测电路系统可被提供为检测在事务开始事件及事务结束事件之间发生的元素间地址危害,且若在到达事务结束事件之前检测到危害,则触发中止事务开始事件之后的指令的进一步处理,使得防止推测性的结果被实行。在使用此方法的情况下,危害检查行为在不存在地址危害的情况下并不使代码本身延迟进行,因为可在有危害的情况下废弃推测性地执行的结果,且因此在没有危害时继续执行指令是安全的。并且,因为有用于检测确实引起的静态或动态危害的硬件支持,编译程序不需要保存地假设最坏情况的情境,且因此即使在循环迭代之间可能有相依性时亦可允许向量化标量循环。因此,可改良效能。在检测到元素间地址危害时,危害检测电路系统亦可触发处理电路系统以将架构状态数据恢复到响应于事务开始事件而捕捉的先前版本的架构状态数据。例如,缓存器中的数据值在处理事务开始事件之后的指令时已发生的改变可被反转回到在事务开始事件时所捕捉的先前状态。同时,任何推测性地执行的加载/储存操作的结果亦可倒回。例如,可将与储存指令相关联的写入数据缓存在数据储存器的高速缓存或内存内。该等经缓存的数据值可在检测到元素间地址危害时被废弃、无效化或覆盖,或一旦到达事务结束事件则被实行成为状态。一般而言,危害检测电路系统可检测先前的向量加载指令的数据元素j及后来的储存指令的数据元素k之间的元素间地址危害,其中k与j不同。在某些情况下,危害检查行为可检查分别用于加载行为及储存行为的数据元素位置的任何对偶之间的任何地址危害。相应的加载及储存指令中的向量内的不同位置处的数据元素一般将相对应于被向量化的不同的标量循环迭代,且因此通过检查跨元素的危害,可检测一个迭代依赖由另一循环迭代所设定的值的情况。然而,实际上,大部分的编译程序一般通过依序从最低向量元素到最高元素地填充向量来向量化标量代码,其中最先的标量循环迭代被分配到最低编号的向量元素(元素0),且最后的循环迭代被分配到最高编号的向量元素(元素n-1,其中n是向量中的元素数量)。事实上,某些向量架构可能需要编译程序从底部元素开始填充向量。因为让后来的标量循环迭代设定已经由先前的标量循环迭代所读取的值一般而言不是问题,接着在某些情况下危害检测电路系统可将该危害检测电路系统的危害检测行为限定为检测k<j的危害(其中危害的地址相对应于先前的向量加载指令的较高元素j及后来的向量储存指令的较低元素k)。此方法可在许多情况下简化危害追踪行为,因为该方法减少了所要用来针对比较地址的元素对偶的数量。并且,将危害检测行为限定为k<j的情况亦可改良效能,因为事务较不可能被中止。尽管如此,某些系统仍可检测用于加载行为及储存行为的不同地定位的元素的任何对偶的地址之间的危害,若是如此被认为是更适当的话(例如若是编译程序可自由以与上述的由下而上的方法不同的方式将循环迭代映像到向量道的话)。程序设计师或编译程序可使用事务开始事件及事务结束事件来识别处在元素间地址危害的风险下的指令序列。事务开始事件及事务结束事件可为由处理电路系统所支持的专用事务开始及结束指令。例如,事务开始指令及事务结束指令可为由指令译码器所支持的原生程序指令,该指令译码器译码要由处理电路系统所处理的指令。响应于事务开始指令,处理电路系统可执行用于准备处理电路系统以供推测性地处理后续指令(例如如上文所论述地捕捉架构状态)的操作。响应于事务结束指令,可实行推测性结果,且可废弃任何先前捕捉的版本的架构状态。因此,程序设计师/编译程序可通过将指令与事务开始/结束指令绑定来识别要视为事务的该等指令。或者,可使用其他的机制,而不是提供用于传递事务开始事件及事务结束事件的讯息的原生指令。例如,可通过使用一般用途指令来设定控制缓存器中的控制位以标记事务的开始,来传递事务开始事件的讯息,且可通过更新控制缓存器以传递事务结束的讯息,来以类似方式实施结束事件。可提供危害追踪储存电路器系统以储存危害追踪数据,该危害追踪数据用于追踪用于事务开始事件之后所推测性地执行的一个或更多个先前的向量加载指令的地址。该危害追踪数据可接着由危害检测电路系统所使用以在遭遇到后来的向量储存指令时检测是否存在元素间地址危害。在某些情况下,危害追踪储存器电路系统可包括数据储存器本身的一部分(在该数据储存器中,响应于向量加载或储存指令而存取数据)。例如,危害追踪数据以及数据本身可被储存在高速缓存中。或者,危害追踪储存器电路系统可包括用于管理要由数据储存器所处置的加载或储存请求的数据结构的一部分,例如用于队列化加载或储存由处理电路系统所发出的指令的加载/储存队列,或用于储存要写入到内存的数据值的储存缓存器。或者,危害追踪储存器电路系统可与被提供为用于管理加载或储存请求的电路系统完全分离,例如为由危害检测电路系统所维护的专用结构。危害检测电路系统可响应于事务开始事件而清除危害追踪数据。如此可防止危害检测电路系统在新的事务存取与先前由先前的事务所存取的另一地址相同的地址时检测危害。或者,可响应于事务结束事件而清除危害追踪数据,使得将在开始新的事务之后初始化危害追踪数据。危害检测电路系统亦可响应于事务开始事件之后(但在事务结束事件之前)发生的事务清除事件而清除危害追踪数据。例如,事务清除事件可由事务清除指令(该指令可为由指令译码器所支持的原生指令)所触发。提供专用事务清除指令来清除危害追踪数据对于允许在一个事务内执行多个向量化循环迭代来说可能是特别有用的。要响应于事务开始事件或事务结束事件而执行的行动可能招致执行负荷。例如,响应于事务开始事件,可能需要储存架构状态,而在事务结束时,可能需要实行推测性的结果。若是使用每个向量有n个元素的向量来向量化标量循环,则虽然向量化行为可能在相对应于n个连序循环迭代的区块的一个向量的道内引入危害,向量化行为并不在相隔n个迭代以上的迭代之间引入危害,因为迭代n+1例如在任何情况下都会在所有先前的n个迭代已完成之后才执行。因此,可能想要在已处理了n个迭代时清除危害追踪数据,以避免不必要的中止。然而,将各个n个循环迭代的区块执行为单独的事务可能在每次完成n个迭代时招致事务进入/离开负荷。此负荷可通过提供事务清除指令来减少,该事务清除指令传递可在实际上不结束事务本身的情况下清除危害追踪数据的讯息。如此,可在每次已在向量代码序列中处理了n个循环迭代的区块时执行事务清除指令,且多于n个的循环迭代可在单一事务内被处理同时被保护免于危害。一般而言,危害检测电路系统可基于用于向量加载指令的地址来更新危害追踪数据,该等向量加载指令是在事务开始事件之后推测性地执行的。危害检测电路系统可接着将危害追踪数据与由后续的向量储存指令所使用的地址进行比较,以检测是否已引起元素间地址危害。在某些情况下,危害检测电路系统可不回应于所有向量加载指令而更新危害追踪数据,而是可将更新行为限定到预定类型的向量加载指令,其中响应于预定类型以外的向量加载指令而抑制危害追踪数据的更新行为(亦可响应于标量加载指令而抑制追踪数据的更新行为)。例如,预定类型的向量加载指令可通过其运算码、通过指令编码行为内的旗标或通过与向量加载指令的编码行为独立的隐含指示(例如在向量代码内放置在向量加载指令前面的暗示指令,该暗示指令传递了后续的向量加载指令将是要使用危害检测电路系统来追踪的类型的讯息),来区隔于其他类型的向量加载指令。通常,程序设计师或编译程序可能知道某些加载行为并没有造成元素间地址危害的风险,例如因为该等行为使用了已知与任何后续储存行为的地址不同的静态判定的地址,或因为在要向量化的不同标量循环迭代之间不存在相依性。另一方面来说,若存在特定加载行为且对于该行为而言存在着与后续的储存行为冲突的风险,则预定类型的向量加载指令可用于该加载行为。通过将危害追踪数据的更新行为限定到预定类型的向量加载指令,这减少了要追踪的地址数量(这可更高效地使用可用的追踪储存器容量)。并且,如下文将论述的,在某些情况下,为了减少地址追踪行为的硬件成本,地址追踪行为可能是相对不准确的,例如该行为可以地址区块而不是个别地址的粒度追踪加载/储存存取行为。这意味着,针对所有类型的加载行为检测危害可能有着由伪阳性危害所造成的更频繁的中止行为的风险,该等伪阳性危害是在加载及储存行为存取了相同的地址区块但实际上并不存取相同的地址时所检测到的。通过将危害检测行为限定到预定类型的加载行为,事务不由于其他类型的加载行为的伪阳性危害而不必要地中止,其中针对该等其他类型的加载行为,程序设计师/编译程序已经指示(通过选择不使用预定类型的加载行为)危害不会发生。存在实施危害追踪数据的若干方式。在一个示例中,该危害追踪数据可包括许多追踪条目,各个追踪条目相对应于一相应的地址区块且识别最高数据元素位置,在该最高数据元素位置处,该地址区块内的一地址被用于该事务开始事件之后所推测性地执行的一先前的向量加载指令。在此背景下,最高的数据元素位置指的是最靠近向量操作数的最大有效端的位置。危害检测电路系统可接着在追踪条目识别了较给定数据元素位置为高的数据元素位置时针对后来的向量储存指令检测元素间地址危害,该追踪条目相对应于包括用于后来的向量储存指令的该给定数据元素位置的地址的地址区块(这是如上所述地将元素间危害检测行为限定到k<j的情况的方法示例)。概括而言,通过追踪已存取给定地址区块的最高元素及在后续的储存行为试图从较低的数据元素位置存取该地址区块时传递危害的讯息,这可检测后来的循环迭代已在先前的循环迭代已更新了一值之前存取了不该存取的该值的情况(读取后写入的危害),且在该情况下触发要中止事务。在使用此危害追踪方法的情况下,一个选项是与数据本身并排地在高速缓存内储存追踪条目。亦即,该数据储存器可包括一高速缓存,该高速缓存包括用于储存数据的许多高速缓存行,且该等追踪条目可被储存在该高速缓存中,其中各个高速缓存行与用于相对应于该高速缓存行的一个或更多个地址区块的该等追踪条目中的一个或更多者相关联。追踪条目用于追踪针对地址区块的存取行为的粒度可能有所不同。在某些情况下,各个高速缓存行可包括单一追踪条目,且因此若后来的储存行为从较先前的加载行为为低的元素位置存取了与该加载行为相同的高速缓存行,则可检测到危害(即使在储存行为实际上存取了与先前的加载行为相同的高速缓存行内的不同地址时)。其他实施方式可以更精细的粒度位准追踪存取行为,且每个高速缓存行可提供多个追踪条目以供追踪针对不同的高速缓存行部分的存取行为,以提供更精确的危害检测。因此,将理解的是,检测到的危害并不一定意味着加载/储存行为实际上会已存取了相同的地址——可能危害检测电路系统可能仅是已基于不准确的追踪数据而检测到了冲突存取行为的风险。在更准确/更不准确的危害追踪行为的硬件成本及效能益处之间存在着取舍。在高速缓存用来储存用于追踪由先前的加载行为所存取的地址的追踪条目时,可能的是,给定的高速缓存行可在需要将其他数据储存在高速缓存中时从高速缓存迁离。此时,相对应的追踪条目亦会迁离,使得可能损失关于先前的加载地址的信息。因此,在迁离具有追踪条目的高速缓存行之后,危害检测电路系统可触发处理电路系统以中止事务开始事件之后的指令的进一步处理,且防止推测性结果实行(以与在实际上检测到危害时类似的方式),该追踪条目指示相对应地址区块内的至少一个地址自从事务开始事件之后被用于先前的向量加载指令。实际上,事务可能是相对短的,且因此到达先前由在事务结束(或清除指令)之前迁离的加载指令所存取的数据的机会可能是相对低的,但通过提供在该稀有的情况下中止事务的能力,这防止了危害因为追踪数据不再是在高速缓存中而被遗漏,且相较于将迁离的追踪信息保存在内存或另一结构中的更复杂的替代方案而言可能是更高效的。在另一示例中,危害追踪数据可包括一个或更多个加载追踪条目,该等条目各识别针对相对应的向量加载指令所存取的最小地址及最大地址中的至少一者,该向量加载指令是从事务开始事件中的一者之后推测性地执行的。此方法在以下情况下对于邻接的向量加载或储存指令来说可能是有用的:向量的最小有效元素针对加载/储存操作使用了给定地址,而向量的后续元素使用了连序地在用于向量的最小有效元素的地址之后的连续地址。对于该等指令而言,识别用于给定加载指令的最小地址及最大地址中的至少一者可能足以能够判定后续的储存行为是否将存取不同元素位置处的相对应地址。例如,危害检测电路系统可在用于后来的向量储存指令的最小地址大于由加载追踪条目中的一者所指示的最小地址且小于或等于由加载追踪条目中的一者所指示的最大地址时检测元素间地址危害。在某些情况下,可能不一定要识别最小及最大地址两者,例如若是所有向量指令使用了固定数量的元素,则最小地址可能隐含了最大地址,反之亦然。并且,在某些情况下,最小及最大地址中的一者可经由偏位来识别或被识别为向量元素的总数而不是被识别为明确的地址,如此仍然允许识别实际的最大或最小地址。另一追踪危害的方法可能是提供地址列表,该地址列表识别针对事务开始事件之后所推测性地执行的一个或更多个向量加载指令的相应数据元素所存取的一个或更多个地址。例如,地址列表可识别所存取的地址之间的对应性及存取彼等地址的元素位置。该危害检测电路系统可接着被配置为在相对应于用于该后来的向量储存指令的一给定数据元素位置的一地址与相对应于该给定数据元素位置以外的一数据元素位置的一地址相同时检测该元素间地址危害,该给定数据元素位置用于该事务开始事件之后所推测性地执行的一先前的向量加载指令。此方法在以下情况下对于非邻接的加载或储存指令来说可能是特别有用的:由向量运算的各元素所使用的地址是从另一向量输入导出的,该另一向量输入可能指定要用于元素中的各者的非连序地址或地址偏位。在此情况下,不能从先前的元素判定用于后来的向量元素的地址,且因此反而可追踪所存取的地址中的各者。尽管如此,此方法亦可用于邻接类型的加载/储存指令。例如,若支持非邻接的指令,则针对两个类型的加载/储存指令使用通用的追踪格式可能是更高效的。图1示意性地绘示支持向量处理的数据处理装置2的示例。装置2具有处理电路系统4(例如处理器、cpu(中央处理单元)或gpu(图形处理单元),举例而言),该处理电路系统响应指令于而执行数据处理操作。处理电路系统4包括处理管线,该处理管线包括许多管线级,该等管线级例如包括:提取级6,用于从指令高速缓存8提取要执行的指令;译码级10,用于译码经提取指令以产生控制讯号以供控制后续的级以执行适当处理操作;发出级12,用于队列化等待执行的经译码的指令,直到该等指令所需的操作数变得可用为止,此时该等指令被发出以供执行;执行级14,用于执行经发出的指令以使用从缓存器16、18读取的操作数来执行相对应的处理操作;及回写级20,用于将经执行指令的结果写回到缓存器16、18。执行级14包括了用于执行不同类型的指令的许多执行单元,例如用于执行算术或逻辑运算的算术/逻辑单元(alu)22、用于执行浮点运算的浮点单元24及用于执行加载及储存操作的加载/储存单元26。将理解的是,可提供其他类型的处理单元,且这仅是一个示例。虽然此示例具有特定的管线级组合,其他示例可具有额外的级。例如,在乱序处理器中,可在解碼及发出级10、12之间提供缓存器重新命名级以供将由指令所指定的架构缓存器指定符重新映像到识别硬件中所提供的缓存器16、18的实体缓存器指定符,且可提供例如为重排序缓存器的额外的资源以供追踪以与程序顺序不同的顺序执行的指令的完成,该等指令是由提取级6以该程序顺序从高速缓存8提取的。管线4支持标量指令及向量指令的处理,该等标量指令在标量操作数上执行运算,该等标量操作数各包括单一数据值,该等向量指令涉及处理包括储存在单一缓存器内的许多独立数据元素的向量值,或该等向量指令产生向量值。可提供单独的标量缓存器16及向量缓存器18以供分别储存标量值及向量值。某些指令可为混合式指令,该等混合式指令涉及处理标量操作数及向量操作数两者,而其他指令可仅处理向量操作数或仅处理标量操作数。虽然为了简洁起见,这并未图示于图1中,在某些情况下,执行级14可包括用于分别处理标量及向量运算的单独的执行单元(例如单独的标量alu及向量alu)。向量执行单元可包括用于响应于单一指令而执行处理道(lane)中的各者的电路系统。在某些情况下,可提供许多平行执行单元以供响应于给定的向量指令而平行执行多个处理道,以改良效能。另一方法可为,使用单一的执行单元组来依序执行处理道,或提供充分的执行单元使得可平行执行二或更多个向量处理道的区块,但整个向量可能需要若干次的通过该等执行单元的循环。因此,向量处理并不暗示需要平行处理所有的道。虽然向量道的平行处理改良了效能,即使在依序处理所有道时,相较于标量代码而言亦仍然存在着向量化处理的益处,因为在指令高速缓存8、提取级6及译码级10处处置较少的指令时的负荷是被减少的。向量运算的一个示例可为用于将来自记忆系统的数据加载到相应的向量数据元素的向量加载指令或用于将来自在向量缓存器18中的一者中的相应的向量数据元素的数据储存到记忆系统的向量储存指令。在图1的示例中,记忆系统包括等级一指令高速缓存8、等级一数据高速缓存28、用于数据及指令两者的共享的等级二高速缓存30及主存储器32。将理解的是,这仅是可能的内存阶层的一个示例,且可使用其他的配置。图2示意性地绘示向量加载指令及向量储存指令的示例。如图2顶部中所示,针对向量加载指令执行了许多处理道,其中各个处理道从数据储存器将由内存地址空间40的给定地址所识别的数据值加载到目标向量缓存器z0的相对应数据元素。此示例图标了邻接的加载指令,对于该加载指令而言,用于目标缓存器的最小有效元素a[0]的地址是通过将偏位#40加到从标量缓存器档案16所读取的基底缓存器值ra来获取的,而用于后续元素a[1]到a[3]的地址连序地跟随在由元素a[0]所使用的地址之后。虽然此示例图标了(基底缓存器+偏位)的寻址模式,其他的实施方式可使用进一步的标量缓存器来指定偏位或使用立即地址。对于图2底部处所示的储存指令而言,各个处理道将读取自向量缓存器z1的相对应元素的数据值储存到数据储存器中相对应于针对该道所运算的地址的位置。再次地,对于邻接类型的储存指令而言,地址在地址空间40内是连序的。向量架构改良效能的一个方式是经由循环向量化。亦即,在多个向量元素{ei…en}内执行多个循环迭代{li..ln}。在这是可能的时候及情况下,可加速循环的执行高达因子n(取决于微架构实施方式平行执行向量道的程度)。存在着为何不能如上所述地向量化循环的许多理由。一个理由是由于内存危害。也就是说,假设为li的循环迭代产生了l(i+m)需要消耗的新的值。简单的示例显示于下:[示例1]fori=0;i<n;i++{a[i+8]=a[i+5]+4;}在标量代码中,此循环可如下实施:[示例2]scalar:cycle0ldrx0,[a,#40]cycle1addx0,x0,#4cycle2strx0,[a,#64]cycle3ldrx0,[a,#48]cycle4addx0,x0,#4cycle5strx0,[a,#72]cycle6ldrx0,[a,#56]cycle7addx0,x0,#4cycle8strx0,[a,#80]cycle9ldrx0,[a,#64]cycle10addx0,x0,#4cycle11strx0,[a,#88]这可被向量化为以下的向量运算:[示例3]向量道3210循环0ldrx0,[a,#64]ldrx0,[a,#56]ldrx0,[a,#48]ldrx0,[a,#40]循环1addx0,x0,#4addx0,x0,#4addx0,x0,#4addx0,x0,#4循环2strx0,[a,#88]strx0,[a,#80]strx0,[a,#72]strx0,[a,#64]向量指令语法可能看起来像是:[示例4]ld1dz0.d,[a,#40]addz0.d,z0.d,#4st1dz0.d,[a,#64](为了简单起见,我们在此处忽略了加载及储存上的预测)。此朴素法(approach)并不保持原始标量版本的语意,因为在迭代i及迭代i+3之间存在着危害(如由示例3中以粗体所示的运算所示)。这导致了不正确的结果,因为在循环0中从地址[a,#64]加载的行为并未反应循环1中所作出的增量,该增量接着在循环2中被储存。在上述示例中,可静态地判定该等相依性。然而,在一般情况下,用于在循环0中进行加载及在循环2中进行储存的地址可能来自间接法(另一内存访问方法),在此情况下,仅可在运行时间判定相依性。我们将这些称为动态相依性。在许多情况下,此类动态相依性是非常稀少的,但不幸地,在该等情况下,编译程序倾向是保守的及不向量化循环。这意味着,在不存在相依性时在绝大多数的情况下损失了潜在的效能改良。反而,本文中所述的方法假设的是一般而言并不存在相依性,且受益于来自循环向量化的效能增益,但提供了确保在此类元素间相依性确实发生时检测及解决该等相依性的机制。处置该等相依性的替代方法会是,通过使用明确的地址比较指令标注可能冲突的加载行为来总是针对相依性进行测试。然而,该等操作产生了成本,且此类指令的微架构实施方式是缓慢的。反而,我们介绍相依性事务的概念。在相依性事务(dependencytransaction,dtx)内,只要我们可在检测到相依性时反转架构状态且防止任何推测性的(speculative)更新被看到直到我们在事务结束时来到安全的实行点(commitpoint)为止,我们就可安全地向量化代码。通过将此概念应用到上述示例,组合代码可能看起来像是:[示例5]在执行事务开始(thazard)指令之后,硬件会采取架构状态(或该架构状态的某个部分)的检查点,且使得高速缓存进入特殊的事务混迭(transactional-alias)模式。高速缓存可在一定结构(例如等级1的专用数据高速缓存)内缓存来自可能不安全的操作的推测性内存更新。推测持续直到事务结束(tend)指令被执行且事务成功地实行、或事务自已中止或由于冲突而中止为止。针对相依性事务(dtx)(包括了在事务开始指令及事务结束指令之间推测性地执行的指令),检测元素间地址危害(亦称为跨元素冲突)。跨元素冲突可被视为读取后写入的危害,其中读取行为是来自元素i而写入行为是来自元素i-j(其中j是正的)。该危害可见于示例3的代码中。元素0中的储存行为(循环3)已由先前元素3中的加载行为(循环0)所读取。若由任何邻接的向量储存指令所存取的最低地址小于或等于由(先前的)邻接的向量加载指令所存取的最高地址且大于由向量加载指令所存取的最低地址,则冲突发生在相依性事务中。针对各个正常的或可高速缓存的存储器操作(或在某些实施方式中,仅针对有限的存储器操作组,例如具有如下文所论述的预定类型的加载行为)提供元素追踪。各个此类存储器操作可捕捉指定产生该操作的元素(向量道)的信息。此元素可被捕捉在一定结构中,使得任何后续的存储器操作可识别触碰到内存地址空间中的相同地址(或者,若使用更不准确的映像行为,则为相同的地址区块)的最大元素。例如,可在64位的元素粒度下追踪元素,且以l1高速缓存中的高速缓存行储存存取给定高速缓存行的最大元素。亦即,我们每个高速缓存行捕捉一个“最大元素”。每个向量的元素数量为(vlb/64b),其中vlb是向量长度,所以在512位的向量架构中,我们会追踪8个相异的元素,且追踪位每个高速缓存行会包括3个位:[示例6]高速缓存行——显示地址卷标、相关状态(coherencestate)、tm状态(为了事务内存的目的用于追踪危害的状态)及dtx混迭状态:addr-tagstate<4b>tmstate<2b>alias<3b>data<64bytes>参照上文的示例3,我们在各个向量加载指令之后更新高速缓存行混迭位:[示例7]<0-63>--------------------alias0data<64bytes><64-127>--------------------alias0data<64bytes>ld1dz0.d,[a,#40]//cycle0ldrx0,[a,#64]|ldrx0,[a,#56]|ldrx0,[a,#48]|ldrx0,[a,#40]<0-63>--------------------aias2data<64bytes><64-127>--------------------alias3data<64bytes>//存取#0-#63的范围中的地址的最大元素是元素2,而存取#64-127的范围中的地址的最大元素是元素3。addz0.d,z0.d,#4//循环1不改变高速缓存行混迭索引,因为这并不是向量加载操作。st1dz0.d,[a,#64]//cycle2strx0,[a,#88]|strx0,[a,#80]|strx0,[a,#72]|strx0,[a,#64]<0-63>--------------------alias2data<64bytes><64-127>--------------------alias3data<64byte>//以元素0进行的str@#64不能成功,因为元素3已不按迭代顺序存取此高速缓存行,这意味着已存在相依性危害。在储存(循环3)时,明显的是,第二高速缓存行中内存位置[a,#64]处的数据已被之后的加载行为不按迭代顺序地读取。此时,高速缓存向处理器4传递dtx中止的讯息。处理器4采取必要的行动以反转架构状态,且高速缓存清除推测性的更改,且清除混迭位。此时,处理器4可使用标量代码进行重试,或通过减少分割尺寸(给定的向量循环迭代中所处理的向量元素的数量)来进行重试。在没有dtx中止(或其他形式的事务中止)的情况下,代码安全地发布推测性的内存更改。这可使用标记事务结束的事务结束(tcommit)指令来达成。概括而言,程序设计师可界定事务开始事件及事务结束事件以限定向量指令序列,对于该等向量指令序列而言道间(inter-lane)的危害可为可能的,且在事务的开始及结束之间,如图1中所示地提供在装置2内的危害检测电路系统50可追踪由加载指令及储存指令所存取的地址,且若在向量加载指令及后续的向量储存指令内的不同元素位置处的元素之间检测到道间危害则可中止事务的处理。可提供危害追踪储存器52以储存用于追踪受存取地址的追踪数据。危害追踪储存器52在图1中是以虚线来图示的,因为虽然可提供该危害追踪储存器作为独立的数据结构,在其他示例中,危害追踪数据可储存在数据储存器本身的一部分内(例如l1数据高速缓存28内)。在某些情况下,危害检测电路系统15亦可被提供在用于控制加载及储存操作的控制电路系统的一部分内(例如加载/储存单元26内或与高速缓存28相关联的高速缓存控制器内)。图3到7中所论述的以下的流程图提供了处置此类相依性事务的示例。图3图标在事务开始时所执行的操作。于步骤60处,处理电路系统4检测事务开始事件是否已发生(例如遭遇到事务开始指令)。响应于事务开始事件,在步骤62处,处理电路系统4捕捉至少目前架构状态的子集合。例如,标量缓存器16及向量缓存器18中的至少某些部分的内容可被储存到记忆系统28、30、32,使得之后若事务需要中止则可恢复数据。或者,可提供专用的恢复缓存器组以备份目前的架构状态快照,以避免需要将该快照储存到记忆系统。目前的架构状态亦可包括其他信息,例如控制缓存器的内容,例如指示目前执行点的程序计数器、指定处置异常(exception)之后处理所要返回到的返回地址的链接缓存器或表示处理器的目前状态的其他信息。于步骤64处,危害追踪储存器52中的危害追踪数据被清除。例如,追踪危害数据被更新为使得该数据不再将任何地址指示为先前被目前事务内的向量加载指令存取。在步骤66处,目前线程的处理推测性地持续,使得后续执行的指令的结果尚未实行成为状态。在alu、浮点、加载指令或更新标量或向量缓存器中的值的其他类型的指令的情况下,可仅如常地执行该等指令来更新目标缓存器,且推测性地进行此行为,亦即该等指令的结果仍可使用先前捕捉的架构状态快照来倒回。对于用于将数据写入记忆系统的储存操作而言,可将要写入到内存的值缓存在加载/储存单元26内或高速缓存28、30或内存32的结构内,以防止实际上在结果仍是推测性的同时更新了内存。事务的处理接着持续直到图4到7中所表示的事件中的一者发生为止。图4图标了事务开始事件之后及事务结束事件之前所遭遇到的向量加载指令的处理。在步骤70处检测到此类向量加载指令时,在步骤72处,检测加载指令是否是预定的类型。预定类型的向量加载行为例如可为具有特定运算码的向量加载行为或指定控制参数的向量加载行为,该控制参数识别该向量加载行为是预定的类型,或可基于更改指令是否紧接在该向量加载行为之前执行以提供此向量加载行为是预定类型的指令的暗示来检测该预定类型的向量加载行为。在检测到预定类型的指令时,接着在步骤74处,危害检测电路系统50基于用于向量加载指令的相应元素的地址来更新危害追踪储存器52中的危害追踪数据。在步骤76处,接着推测性地执行向量加载指令。另一方面来说,若向量加载行为不是预定的类型,则该方法从步骤72直接继续进行到步骤76,而忽略在步骤74处更新危害追踪数据的步骤。在其他实施例中,可忽略步骤72,且反而可针对所有类型的向量加载行为在步骤74处更新危害追踪数据。然而,将危害追踪数据的更新行为限定到特定类型的加载行为可能有用于减少危害追踪行为的负荷及检测到危害的机会。在支持将向量加载行为标记为所针对而追踪危害的预定类型的系统中,程序设计师可接着将预定类型的使用限定为危害是被期望的彼等情况,以便避免在已知加载行为将不产生元素间地址危害的情况下针对该等加载行为进行危害追踪的负荷。如图5中所示,在事务的处理期间,危害检测电路系统50的处理电路系统4可检测事务清除事件是否已发生(图5的步骤80)。若事务清除事件发生,则在步骤82处,以与步骤64处相同的方式清除危害追踪储存器52中的危害追踪数据。这提供了用于即使还未到达事务的结束亦清除追踪数据的机制。这是有用的,因为这允许了在单一事务内执行多个循环迭代以减少事务处置行为的负荷。事务清除事件可为传递清除危害追踪数据是安全的讯息的任何事件,例如异常,或设定控制缓存器的指令。然而,表示事务清除事件的一个特别有用的方式是提供事务清除指令(tclear),该指令专门清除追踪数据。程序设计师或编译程序可接着在向量指令序列内使用事务清除指令,以供每次在已依据被向量化的相对应循环迭代处理了向量的所有数据时清除追踪数据。图6图标在事务开始事件之后及在事务结束事件之前遭遇到向量储存指令时所执行的危害检测操作。在步骤90处检测到该指令时,接着在步骤92处,危害检测电路系统50检测在向量储存指令的元素k及先前的加载指令的元素j之间是否存在元素间地址危害,其中k不等于j。在某些情况下,可将危害限定为k小于j的危害。注意,先前的加载行为及后续的储存行为两者是在由处理电路系统4所执行的相同指令线程内。若在步骤92处没有检测到地址危害,则在步骤93处,如常地推测性地执行储存操作。若检测到了危害,则在步骤94处,危害检测电路系统50触发处理电路系统4以中止事务内的指令的进一步处理,且防止由事务内已经执行的指令所产生的推测性结果被实行。可通过废弃记忆系统内的推测性地缓存的写入数据来这样做。并且,将缓存器16、18恢复到先前捕捉的架构状态,以将处理器倒回该处理器在事务开始之前运作的状态。因此,推测性地执行的指令的效果被逆转了。一旦已中止事务,此讯息可被传递到处理器4(例如经由使用异常来进行)。异常处置器可接着采取必要的行动以确保有进展。例如,可使用标量代码来重试等效的处理操作,或可减少向量长度(例如处理n/2个数据元素而不是n个元素的群组中的所需操作可减少元素间地址危害的机会,因为对于相同内存位置进行的存取可能使得写入行为执行在向量的一个部分中而读取行为执行在另一部分中),以确保有进展。尽管如此,因为地址危害是稀少的,偶然中止某些事务的成本相较于可通过允许将多个标量循环迭代处理为向量化代码来达成的效能改良而言是不明显的。图7图标了在事务结束时到达事务结束事件时所执行的行动。响应于在步骤100处所检测到的事务结束事件,在步骤102处,处理器4实行从事务开始以来所执行的指令的任何推测性地产生的结果。可废弃或允许覆盖先前所捕捉的架构状态的快照。任何经缓存的内存写入行为可通过高速缓存28、30或内存32写入到实际的记忆储存器。在步骤104处,在不使用危害追踪/检测机构50、52的情况下非推测性地执行后续的指令。图8图标了追踪数据的第一示例,该追踪数据用于追踪由加载指令所使用的地址(对应于上文所示的示例6)。在此示例中,用于危害追踪的追踪条目与相对应的数据并排地储存在l1数据高速缓存28中。各个高速缓存行110包括了识别经高速缓存数据的地址的至少一部分的高速缓存标签112、指示相对应数据的相关性状态(例如数据是否为共享的或独一的,或数据是否是干净的(clean)或脏的(dirty))的相关性状态数据及与经高速缓存数据相关联的其他状态数据116(例如用于事务内存地址追踪目的的数据)。此外,各个高速缓存行110储存了混迭值118,该混迭值指定最高数据元素位置,其中自从事务开始所执行的先前的向量加载指令已针对该最高数据元素位置从相对应的高速缓存行存取数据。因此,在遭遇到给定的加载行为时,接着更新包括针对各个元素所存取的数据的高速缓存行,以针对该高速缓存行设定混迭位118,以在从以存取该数据的元素较先前由混迭位118所指示的元素位置为高时指示该元素。在遭遇到后续的储存指令时,接着若数据被写入到高速缓存行且混迭位针对该高速缓存行指示了较写入行为所针对执行的目前数据元素为高的数据元素位置,则检测到了危害且此举可触发事务的中止。虽然图8图示了每个高速缓存行皆提供混迭位的示例,如此可能造成某些伪阳性的危害检测,其中即使先前的加载行为相较于后续的储存行为实际上存取了高速缓存行的不同部分亦标记了危害。可通过以较精细的粒度标注高速缓存行(例如针对高速缓存行的不同部分使用多个混迭字段118)来减少伪阳性危害的数量。然而,存在着用于储存及更新及比较混迭字段的额外电路系统以及所达成的效能改良之间的取舍。图9图示了危害追踪储存器52的另一示例。与其将混迭位添加到高速缓存,可将危害检测逻辑添加到其他结构(例如加载/储存队列、储存缓存器等等),或可引入相异的结构。在遭遇到邻接的向量加载行为时,此结构(或缓存器)可记录所存取的最大及最小地址{maxaddr,minaddr},且在后续的储存行为到达时,针对条目检查储存行为的最低地址(*a)。若条件(minaddr<a<=maxaddr)成立,则检测到了冲突且触发中止行为。如图10中所示,另一类型的加载行为可使用用于元素中的各者的非连序的地址。此举可称为非邻接(或聚排)的加载行为。类似地,非邻接的向量储存指令可将来自相应向量元素的数据值储存到具有非连序地址的内存位置。可从第二向量操作数z1导出用于各元素的地址,该第二向量操作数例如针对输入元素中的各者指定不同的地址偏位。对于非邻接的加载/储存指令,图8中所示的方法仍然有效,但作为图9的替代方案,图11中所示的方法可使用在缓存器储存了用于各个元素的实际地址而不是最大/最小地址的情况下。地址是与数据元素位置相对应而储存的,其中是从彼等地址存取数据元素位置的(例如在图11的示例中,追踪结构的行n中的地址是从先前的加载行为的数据元素n所存取的)。对于后续的储存指令而言,危害检查电路系统50可接着针对缓存器的内容检查由储存行为所使用的地址组,以识别以下冲突:储存行为的给定元素存取了与由用于先前的加载行为的更高元素所使用的地址相同的地址。在某些情况下,程序设计师或编译程序可能引入巢套式事务,其中在开始一个事务之后,在第一个事务结束之前检测到了另一事务开始事件。某些硬件实施方式可支持此类巢套式事务以维护多个架构状态快照,使得若内部的事务中止了,则仅将状态恢复到该内部的事务的开始点,而不是倒回到外部事务的开始。然而,支持巢套式事务所需的额外电路负荷可能不总是合理的,且某些更简单的实施方式可在检测到内部的事务中止时仅将处理器状态倒回到外部的事务的开始。因此,某些实施方式有效地将巢套式事务转变成单一的较大事务。危害检测电路系统50将引进给定线程的道间地址危害检测为将标量循环向量化成向量指令序列的假影。该危害检测电路系统并不需要检测其他类型的地址危害,例如独立的程序线程之间的读取之后写入或写入之后写入的危害,可能已经针对该等其他类型的危害在处理装置2内提供了其他机制。例如,某些系统可能已经具有硬件事务内存支持,以供管理多处理器系统中所执行的不同处理线程之间的冲突。若独立的处理线程是使用单独的执行单元来平行执行的,则存在着以下风险而导致危害:一个执行单元可能读取或写入给定的地址,同时另一执行单元亦存取相同的地址。硬件事务内存技术可通过允许在没有冲突时推测性地继续进行操作且接着中止事务及在检测到冲突时将处理倒回到先前的执行点,来使用推测性处理以在检测此类危害时改良效能。若处理在没有冲突的情况下到达事务的结束,则可实行推测性的结果。本文中所述的形式的相依性事务可使用已经针对处置事务内存的事务所提供的电路系统中的至少某些部分来支持,以供应付不同处理构件之间的冲突。例如,用于捕捉架构状态的快照或用于缓存针对记忆系统进行的写入行为的某些电路系统可被重复使用。然而,不像事务内存技术,用于检测元素间危害的危害检测电路系统50及危害追踪储存器52可为不同的,且所检测的危害可能是在单一程序线程内而不是在独立的线程之间,平常不会预期危害发生在单一程序线程内。在本申请中,用词“配置为……”用于意指的是,装置的构件具有能够实现所界定之操作的配置。在此背景下,“配置”意指硬件或软件互连的布置或方法。例如,装置可具有提供所界定操作的专用硬件,或处理器或其他处理装置可编程为执行该功能。“配置为”并不暗示的是,装置构件需要以任何方式改变以提供所界定的操作。虽然已参照随附的绘图在本文中详细描述本发明的说明性实施例,要了解的是,本发明不限于彼等准确的实施例,且本领域中具技艺者可在该等实施例中作出各种改变及更改而不脱离如由随附权利要求所界定的发明的范围及精神。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1