处理器中的有效并行浮点异常处理的制作方法

文档序号:6578189阅读:324来源:国知局

专利名称::处理器中的有效并行浮点异常处理的制作方法
技术领域
:本公开文本总体上涉及微处理器领域。具体的,本公开文本涉及用于处理执行单指令多数据流(SIMD)指令的处理器中的浮点异常的有效技术。
背景技术
:用于浮点运算的IEEE(电气和电子工程师学会)标准(正EE754)规定了如何表示单精度(32位)、双精度(64位)、单扩展精度(》43位,但不常用)和双扩展精度(》79位,常常以80位来实施)的浮点数(包括负零、非规格化数(denormal)、无穷大以及NaN,NaN表示"非数字"),以及应如何对它们执行运算。这个标准仅需要32位的值;其它的是可任选的。它还规定了四种舍入(round)模式和5种异常(包括何时出现异常,以及当它们出现时会发生什么)。将指数偏移("—1,其中e是指数字段所使用的位数。例如,单精度数具有8-位指数,因此单精度数的指数是以27-1=127加上该指数的方式来存储的,也称为"偏移127"。规格化单精度指数的范围在-126到127之间。指数128被保留以供正或负无穷大使用。指数-127(全零)被保留以供正或负零使用(或者用于非规格化数,但在非规格化数的情况下,所用的偏移是(2"2,即使用126而不是127,因为假定尾数的最高有效位是0,而不是l)。在表l中示出了单精度浮点表示的一些示例。表l:单精度浮点表示示例类型符号expexp+偏移指数小数00或1127000000000000000000000000000000010270111111100000000000000000000000<table>tableseeoriginaldocumentpage8</column></row><table>规格化浮点数具有v-sx2exm的值,其中,s、e和m定义为符号位为0时,s=+1(正数和+0)符号位为1时,s--l(负数和-0)e=指;教-偏移(即,以偏移加上指数的方式来存储该指数)w=l./rac//owC二遂虔O(就是说,尾数或有效数字(significand)是这样的隐含的前导位值1,随后是小数点,随后是小数(戶Mto")的二进制位)。因此,l^m<2。非规格化数(也称为反规格化(denormalized)数或次规格化(subnormal)数)是(绝对值)小于最小的规格化数但仍不为0的数。非规格化数的产生有时称为逐级下溢(gradualunderflow),因为它允许在结果较小时,计算缓慢地降低精度。在Intel8087浮点协处理器中实现了非规格化数,同时撰写了IEEE754标准。这个实现表明可以在实际实施中支持非规格化数。在规格化浮点表示中,假定尾数中的前导二进制数字等于1。由于已知它等于l,在一些浮点表示中,可以省略尾数的前导二进制数字,并相应地调整指数值。非规格化数值是那些不能以规格化形式来表示的值(即具有最小的可能指数,并且其带有非零的尾数)。浮点单元(FTU)的一些实现方式在硬件中不直接支持非规格化数,而是转移到某些种类的软件或微代码支持。尽管这对于用户而言可能是透明的,但它会导致产生或使用非规格化数的计算比对规格化数进行类似计算慢得多。现代处理器还可以具有用于对浮点数执行单指令多数据(SIMD)运算的指令。当这些SIMD运算产生或使用非规格化数时,会触发异常,以便在微代码的帮助下在软件或硬件中处理该运算。在硬件中支持非规格化数的一个方式是通过更宽的内部表示,其具有足够的精度来简单地将非规格化数作为较小的规格化数来处理。例如,如果触发了包含单精度非规格化数的异常,则微代码会将单精度操作数转换为规格化双精度操作数,并在更宽的表示上重新执行该运算,随后对结果进行反规格化,并将它们转换回单精度。类似地,可以将双精度非规格化数作为双扩展精度规格化数来处理。一个缺陷在于,产生或使用非规格化数的计算仍会比对规格化数进行类似计算慢得多。到目前为止,还没有充分地研究出用于在执行SIMD指令的处理器中处理浮点异常的更有效的技术。在附图的各个图中作为示例而非限制来图示说明本发明。图1示出了用于存储标量(scalar)正EE浮点数和分组(packed)IEEE浮点数的示例性存储格式。图2示出了系统的一个实施例,其包括执行SIMD浮点指令并使用用于处理SIMD浮点异常的有效技术的处理器。图3示出了执行SIMD浮点指令并使用用于处理SIMD浮点异常的有效技术的处理器的一个实施例。图4示出了一个装置的可替换实施例,用于有效地处理在执行单指令多数据(SIMD)指令的处理器中的浮点异常。图5a-b示出了用于存储分组浮点数的内部表示的示例性存储格式。图6示出了用于处理在SIMD浮点加法器中的某些数值异常的处理的一个实施例的流程图。图7示出了用于处理在SIMD浮点乘法器中的某些常见异常的处理的9一个实施例的流程图。图8示出了用于处理在执行SIMD浮点指令的处理器中的数值异常的处理的一个替换实施例的流程图。具体实施例方式公开了用于处理在执行单指令多数据(SIMD)指令的处理器中的浮点异常的方法和装置。在一个实施例中,为SIMD浮点运算识别数值异常,启动一对SIMD微运算(micro-operation),以便为SIMD浮点运算产生分组结果的两个分组局部结果。可以理解在以下公开文本的上下文中的数值异常包括通过识别非规格化输入值,或者通过识别有可能作为结果产生非规格化输出值的下溢条件而触发的至少一个异常,并且随后可以要求微代码辅助。启动SIMD反规格化微运算,以便合并这两个分组局部结果,并且对所合并的分组局部结果中的一个或多个元素执行反规格化,以便为SIMD浮点运算产生具有一个或多个非规格化元素的分组结果。可以设定标志,并将其与分组局部结果和/或分组结果一起进行存储,以便标识所述非规格化元素。在一个实施例中,当SIMD浮点运算是乘法(或除法、平方根或变换)时,启动SIMD规格化微运算,以便在该SIMD浮点运算之前产生规格化的伪内部浮点表示。这种伪内部浮点表示可以与规格化分组浮点操作数存储在相同的寄存器中,其中设定标志来表示非规格化元素的哪一个相应的伪内部浮点表示需要被转换为非规格化元素的实际内部浮点表示。在非规格化元素的这种伪内部浮点表示中,可以对尾数执行规格化,并且可以以这样的方式来存储指数即,使得易于将它们恢复为实际内部浮点表示的更宽指数。例如,如果从非规格化数的指数中减去尾数的前导O的数量(以实际内部浮点表示的更宽指数格式进行偏移),则较高位会是恒定的(例如,10),并且因此可以从伪内部浮点表示得出并易于恢复较高位。因此,这种技术可以用于透明地处理SIMD浮点异常,同时不必转换为标量运算并且仅需执行少量的额外微运算。可以根据以下教导来实现本发明的这些及其它实施例,并且显然,可以在不背离本发明的广泛的精神与范围的情况下,对以下教导做出各种修改和改变。因此,说明书和附图应认为是示例性而不是限制性的意义,本发明仅依据权利要求及其等价物来度量。在以下描述中,为了解释的原因,阐述了许多具体细节,以便提供对本发明透彻的理解。然而,本领域普通技术人员会意识到这些具体细节并非是实现本发明的一些实施例所必需的。在其它情况下,没有详细阐明公知的电气结构和电路,以便不模糊对本发明的实施例的理解。随着越来越多的计算机系统用于互联网和多媒体应用,随着时间的过去己经开发出了额外的处理器支持。例如,单指令、多数据(SIMD)整数/浮点指令和流式SIMD扩展(SSE)是减少了执行特定程序任务所需的指令总数的指令。这些指令可以通过对多个数据元素进行并行操作,来加速软件性能。结果,可以在包括视频、语音和图像/照片处理的宽泛范围的应用中实现性能的提高。SIMD指令在微处理器及相似类型的逻辑电路中的实现常常包括多个问题。而且,SIMD运算的复杂性常常导致需要额外的电路来准确地处理和操作数据。图l示出了一些示例性存储格式101-105,其用于存储标量浮点数和分组IEEE浮点数。单精度格式101包括32位符号位lll、8个指数位112和23个有效数字或尾数位113。双精度格式102包括64位符号位121、11个指数位122和52个有效数字或尾数位123。双扩展精度格式103包括80位符号位131、15个指数位132和64个有效数字或尾数位133。在IEEE浮点数的每一个存储格式中,有效数字或尾数112、122和132还可以包括隐含最高有效位J,其假定为等于l。因此,例如,如果双精度格式102的52-位的尾数存储十六进制值23456789ABCDE,所表示的十六进制值就是1.23456789ABCDE,其中小数点在隐含位J后面。指数偏移了(2""-1,其中e是指数字段所使用的位数。因此,单精度格式101的8-位的指数被偏移了127,双精度格式102的11-位的指数被偏移了1023。分组单精度格式104包括128位,每一个32-位的部分141-144都存储具有单精度格式101的单精度浮点数。分组双精度格式105也包括128位,每一个64-位的部分151-152都存储具有双精度格式102的双精度浮点数。本领域中公知的,分组单精度格式104和分组双精度格式105可以用于执行SIMD浮点运算。会意识到,尽管将分组单精度格式104和分组双精度格式105显示为包括128位,但本发明不限于此。具体地,本发明的实施例可以包括用于执行SIMD浮点运算的、包含有256位或512位数据或者更多位数据的多种格式的分组单精度浮点数和分组双精度浮点数。当这些SIMD浮点运算产生或使用非规格化数时,可以触发异常(有可能被屏蔽),以便以软件或硬件和/或在微代码辅助下处理该运算。在一些现有处理器中,处理这种异常可以包括将分组浮点数转换为更宽表示的标量浮点数,并作为标量运算对该更宽表示重新执行运算,随后按照需要对结果进行反规格化,并将它们转换回分组浮点数。如上指出的,处理这种产生或使用非规格化数的计算会比对规格化数执行类似计算慢得多,尤其是在分组浮点数的格式会包括256位或512位或者更多位数据的情况下。因此,就需要本文公开的更有效的技术来处理在执行SIMD指令的处理器中的浮点异常。图2示出了系统200的一个实施例,该系统200包括处理器300,其执行SIMD浮点指令并使用用于处理SIMD浮点异常的更有效的技术。例如在本文所述实施例中,根据本发明,系统200包括诸如处理器300的组件,处理器300利用包含逻辑的执行单元来执行用于执行SIMD浮点运算的算法。系统200代表了基于可以从加利福尼亚SantaClara的Intel公司获得的PENTIUMIII,PENTIUM4,Celeron,XEON,ITANIUM,CENTRINO,COREDuo,CORE2Duo和/或CORETM2Quad微处理器的处理系统,尽管也可以使用其它系统(包括具有其它微处理器的PC、工程工作站、机顶盒等)。在一个实施例中,示例系统200可以执行可从Redmond,Wash.的Microsoft公司获得的WINDOWStm操作系統的某个版本,尽管也可以使用其它操作系统(例如MACOSXLEOPARD操作系统、UNIX和域Li皿x)、嵌入式软件、和/或图形用户接口。因此,本发明不限于硬件电路和软件的任何特定组合。处理器300包括一个或多个执行单元203,用以根据本发明对分组浮点数据执行SIMD指令。在单处理器台式机或服务器系统的环境下描述本实施例,但可替换的实施例可以包括在多处理器系统中。系统200的一个实施例是中心(hub)架构的示例。计算机系统200包括处理器300,用以处理数据信号。处理器300可以是例如复杂指令集计算机(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器、执行多个指令集的组合的处理器,或者诸如数字处理器之类的任何其它处理器设备。处理器300耦合到处理器总线210,处理器总线210能够在处理器300与系统200中的其它组件之间传输数据信号。系统200的元件执行它们传统的功能,这是熟悉本领域的人员公知的。在一个实施例中,处理器300包括1级(L1)内部高速缓冲存储器207。根据架构,处理器300可以具有单级内部高速缓存或多级内部高速缓存。可替换地,在另一个实施例中,高速缓冲存储器可以位于处理器300之外。其它实施例还可以包括内部高速缓存和外部高速缓存两者的组合,这取决于具体实现方式及需要。寄存器文件(Registerfile)208可以在多种寄存器中存储不同类型的数据,这些寄存器包括SIMD寄存器和/或标量寄存器、整数寄存器、浮点寄存器、状态寄存器和指令指针寄存器。包含用以执行整数和浮点运算的逻辑的执行单元203也位于处理器300中。处理器300还包括微代码(ucode)ROM,其存储特定宏指令的微代码和/或用于在微代码的辅助下以硬件处理异常操作。对于该实施例,执行单元203包括用以处理分组指令集209的逻辑,其中分组指令集209包括SIMD浮点指令。通过将分组指令集209包括在通用处理器300的指令集中,连同用以执行所述指令的相关电路一起,可以用分组数据在通用处理器300中执行由许多多媒体应用所使用的运算。因此,通过使用处理器数据总线的完全宽度来对分组数据执行运算,可以加速并更有效地执行许多多媒体应用。这可以消除为了执行一个或多个运算而通过处理器的数据总线传递更小单位的数据(一次传递一个数据元素)的需要。执行单元203的替换实施例还可以用于微控制器、嵌入式处理器、图形设备、DSP及其它类型的逻辑电路中。系统200包括存储器220。存储器220可以是动态随机存取存储器(DRAM)设备、静态随机存取存储器(SRAM)设备、闪存存储器设备或其它存储器设备。存储器220可以存储由可由处理器300执行的数据信号所表示的指令和/或数据。系统逻辑芯片力6耦合到处理器总线210和存储器220。在示出的实施例中的系统逻辑芯片216是存储器控制中心(MCH)。处理器300可以经由处理器总线210与MCH216通信。MCH216向存储器220提供高带宽的存13储器通路218,用于指令和数据的存储,并用于图形命令、数据和纹理的存储。MCH216用于导引在处理器300、存储器220及系统200中其它组件之间的数据信号,并用于桥接在处理器总线210、存储器220和系统I/O222之间的数据信号。在一些实施例中,系统逻辑芯片216可以提供用于耦合到图形控制器212上的图形端口。MCH216通过存储器接口218耦合到存储器220。图形卡212通过加速图形端口(AGP)互连214耦合到MCH216。系统200的一些实施例使用专用中心接口总线222来将MCH216耦合到I/O控制中心(ICH)230。ICH230经由本地I/O总线向一些I/O设备提供直接连接。本地1/0总线是用于将外围设备连接到存储器220、芯片组和处理器300的高速I/O总线。一些示例是音频控制器、固件中心(闪存BIOS)228、无线收发机226、数据存储器224、包含用户输入和键盘接口的传统I/O控制器、诸如通用串行总线(USB)的串行扩展端口、和网络控制器234。数据存储设备224可以包括硬盘驱动器、软盘驱动器、CD-ROM设备、闪存存储器设备,或其它大容量存储设备。在系统200的一些实施例中,MCH216和ICH230可以集成到单个系统逻辑芯片201中。在一些替换实施例中,MCH216可以直接集成到处理器300中,用于指导处理器300对存储器220的访问。对于系统200的另一个实施例,处理器300可以直接集成到芯片上系统中。芯片上系统的一个实施例包括处理器300和存储器220。用于一个这种系统的存储器220是闪存存储器。闪存存储器220可以与处理器300及其它系统组件位于同一管芯(die)上。另外,诸如存储器控制器或图形控制器之类的其它逻辑块也可以位于芯片上系统中。图3示出了处理器300的一个实施例,该处理器300执行SIMD浮点指令,并使用用于处理SIMD浮点异常的有效技术。按顺序的前端(in-orderfrontend)301是处理器300中的用于读取要执行的宏指令并将它们准备好以便在处理器流水线中使用的部分。这个实施例的前端301包括几个单元。指令预取器326从存储器220和/或从I-高速缓存327读取宏指令,并将它们输入到指令译码器328,指令译码器328依次将它们译码为机器知道如何执行的、称为微指令或微运算(也称为微-op或uop)的原语(primitive)。微-op高速缓存330取得译码的微-op,并存储它们以便将来重新执行而不进行译码。微-op高速缓存330的一些实施例可以包括追踪高速缓存(tracecache),它将微-op组合为按程序顺序的序列,或者追踪用于执行的微-op队列334。对于一些实施例,当译码器328或者当微-op高速缓存330的'追踪高速缓存遇到复杂的宏指令时,微代码ROM344可以提供完成该操作所需的微-op。许多宏指令可以转换为单个微-op,但其他宏指令需要几个微-op来完成整个操作。在一个实施例中,如果需要多于4个微-op来完成宏指令,则译码器328就访问微代码ROM344,以提供执行该宏指令所需的微-op。对于一个实施例,浮点运算的异常可以编码到微代码ROM344中的少量微-op中,并由其来处理,以便以能够提供对执行SIMD浮点指令的处理器300中的异常情况(例如非规格化数)的支持的方式来重新执行浮点运算。一些SIMD及其他多媒体类型的指令被认为是复杂指令。大多数与浮点相关的指令也是复杂指令。如此,当指令译码器328遇到复杂宏指令时,就访问微代码ROM344的适当位置,以获得用于该宏指令的微代码序列。将执行该宏指令所需的各种微-op传输到乱序执行引擎303,用于在适当的整数执行单元和浮点执行单元中执行。乱序执行引擎303是在其中准备微指令以便执行的场所。乱序执行逻辑具有多个缓冲器,用以在微指令穿过流水线行进并被调度以执行时,平滑并重新排序微指令流来优化性能。分配器重命名器逻辑333分配每一个微-op的执行所需的机器缓冲器和资源,并将逻辑寄存器重命名到寄存器文件的条目上。分配器重命名器逻辑333的一个实施例还为多个队列中的每一个微-op分配条目,这些队列可以包括用于存储器操作的存储器队列331、用于整数运算或定点运算的整数队列332和用于浮点运算的浮点队列336。依据这些队列(例如分别是331、332和336),由存储器调度器321、整数调度器302和浮点调度器306调度微-op,以便分别由读/写单元311、整数执行单元312和浮点执行单元316执行。微-op调度器3M、302和306基于它们相关的输入寄存器操作数源准备就绪和微-op完成其操作所需的执行资源的可用性,来确定微-op何时准备好执行。会意识到,执行单元311、312和316中的每一个或任何一个都可以具有用于执行标量或SIMD运算的相同的执行单元。15寄存器文件旁路(bypass)网络308位于调度器321、302和306与执行单元311、312和316之间。在寄存器文件旁路网络308的一些实施例中,可以存在用于整数运算和浮点运算的单独的寄存器文件。这种实施例的每一个寄存器文件还可以包括这样的旁路网络,即该旁路网络可以将刚刚完成的、还没有写入到寄存器文件中的结果旁路或转发给新的相关微-op,并且还能够彼此传送数据。可替换地,可以统一寄存器文件旁路网络308的多个实施例。寄存器文件旁路网络308的一个替换实施例具有用于存储分组源操作数和目标操作数的至少256位宽的寄存器条目,这些操作数包括用于SIMD浮点运算的分组浮点源操作数和分组浮点结果。微-op调度器321、302和306的一些实施例可以在父负载完成执行之前分派相关操作。由于在处理器300中推测性地调度并执行微-op,处理器300还包括用以处理存储器未命中的逻辑。如果在数据高速缓存中未命中数据负载,在流水线中就会存在暂停(inflight)的相关操作,其使调度器具有暂时的不正确数据。重放机制可以追踪并重新执行使用不正确数据的指令。只需要重放相关操作,可以允许完成独立的操作。当已经完成了微-op的执4亍时,由重排序退役(retire)逻辑310以顺序程序的次序使它们退役。浮点执行单元316的一个实施例包括异常电路346,用以识别SIMD浮点运算的异常,其包括例如数值异常。响应于数值异常,可以位于微代码ROM344中的微代码异常处理机(handler),或一些专用的有限状态机(例如在异常电路346中)利用微代码ROM344来启动用于遇到异常的该SIMD浮点运算的SIMD微运算序列。在一个实施例中,SIMD微运算为SIMD浮点运算产生分组结果的两个分组局部结果。SIMD反规格化微运算合并这两个分组局部结果,并且对所合并的分组局部结果中的一个或多个元素执行反规格化,以便为具有一个或多个非规格化元素的该SIMD浮点运算产生分组结果。可以设定标志并将其与分组局部结果一起进行存储,用以标识在一个或多个元素中的非规格化结果,在此情况下,对于一些实施例,在反规格化微运算之前可能需要对分组局部结果中的一个执行规格化。在微代码异常处理机的一个实施例中,当SIMD浮点运算是乘法时,还可以利用微代码ROM344来启动SIMD规格化微运算,以便产生规格化的伪内部浮点表示作为用于该SIMD浮点运算的SIMD微运算序列的一部分。可以设定标志并将其与分组结果一起进行存储,用以标识以规格化的伪内部浮点表示所表示的非规格化结果。对于这个实施例,当SIMD浮点运算是加法时,SIMD规格化微运算不是必需的,因为SIMD浮点加法器能够接受包含非规格化数值的分组操作数作为SIMD浮点加法的输入。在一些实施例中,可以设定标志并将其与规格化的伪内部浮点表示一起进行存储,用以标识非规格化元素,并能够依据规格化的伪内部浮点表示来重建实际的内部浮点表示。因此,如上所述的微代码辅助机制可以利用微代码344来透明地处理SIMD浮点异常。图4示出了用于有效地处理执行单指令多数据(SIMD)指令的处理器中的浮点异常的装置460的一个替换实施例。装置460包括寄存器文件旁路网络308,其可操作地与浮点执行单元316耦合。SIMD浮点执行单元316的一个实施例包括SIMD浮点加法器单元(FAU)400和SIMD浮点乘法单元(FMU)420。包括SIMDFAU400和/或SIMDFMU420的实施例还可以包括SIMD浮点规格化单元(FNU)410和SIMD浮点反规格化单元(FDU)430。SIMDFAU400包括浮点加法器401、402、…408,其可以包括能够使用用于单精度浮点值的内部浮点表示来执行单精度加法的多个浮点加法器,和能够使用用于双精度浮点值的内部浮点表示来执行双精度加法的多个浮点加法器。在SIMDFAU400的一个实施例中,浮点加法器401、402、…408中每隔一个的浮点加法器能够执行单精度加法和双精度加法两者。在SIMDFAU400的一个替换实施例中,可以分割和/或组合浮点加法器401、402、…408,来分别执行单精度加法和/或双精度加法。浮点加法器401、402、…408的实施例包括对齐(alignment)电路,用以将浮点操作数元素的尾数对齐;以及加法器电路,用于将浮点操作数元素的尾数相加。SIMDFAU400还包括分别与浮点加法器401、402、…408耦合的异常电路441、442、…448。异常电路441、442、…448的一些实施例包括非规格化检测电路,用以检测用于SIMD浮点加法运算的分组操作数的非规格化元素;以及异常产生电路,用以识别包含非规格化结果的、SIMD浮点加法运算的异常结果。异常电路441、442、…448的实施例还可以可操作地与微代码ROM344耦合,用以响应于所识别的异常结果,启动微-op序列来重新执行SIMD浮点加法运算。在SIMDFAU400的一些实施例中,如果相应的第二个元素不是非规格化的,则浮点加法器401、402、…408的对齐电路可以按照未偏移的指数差(即,不是经偏移的指数差)将非规格化的第一个元素的尾数与该相应的第二个元素的尾数对齐,但在第一个元素和第二个元素都是非规格化的情况下保持对齐状态不变。在这些实施例中,如果所得到的和数可以表示为该SIMD浮点加法运算的分组结果中的规格化结果元素,则浮点加法器401、402、…408还可以(例如通过FNU410)舍入并重新规格化所得到的和数。如果确定结果不能表示为该SIMD浮点加法运算的分组结果中的规格化结果元素,则浮点加法器401、402、…408的(或者规格化器411、412、…418的)实施例还可以设定标志,该标志用以将加法结果标识为分组结果中的非规格化元素。寄存器文件旁路网络308的实施例还包括结果存储电路,用以存储SIMD浮点运算的分组结果,并用以存储将结果元素标识为分组结果中的非规格化元素的任何标志。SIMDFNU410包括浮点规格化器411、412、…418,其可以包括能够使用用于单精度浮点值的内部浮点表示来执行单精度规格化的多个浮点规格化器,和能够使用用于双精度浮点值的内部浮点表示来执行双精度规格化的多个浮点规格化器。在SIMDFNU410的一个实施例中,浮点规格化器411、412、…418中每隔一个的浮点规格化器能够执行单精度规格化和双精度规格化两者。在SIMDFNU410的一个替换实施例中,可以分割和/或组合浮点规格化器411、412、…418,来分别执行单精度规格化和/或双精度规格化。浮点规格化器411、412、…418的实施例还可以包括尾数舍入电路,用以执行并行的单精度和/或双精度舍入和规格化。浮点规格化器411、412、…418的一些实施例还能够在对分组操作数的伪内部浮点表示的规格化中使用常数值(例如,10)。SIMDFMU420包括浮点乘法器421、422、…428,其可以包括能够使用用于单精度浮点值的内部浮点表示来执行单精度乘法的多个浮点乘法器,和能够使用用于双精度浮点值的内部浮点表示来执行双精度乘法的多个浮点乘法器。在SIMDFMU420的一个实施例中,浮点乘法器421、422、…18428中的每隔一个浮点乘法器能够执行单精度乘法和双精度乘法两者。在SIMDFMU420的一个替换实施例中,可以分割和/或组合浮点乘法器421、422、…428,来分别执行单精度乘法和/或双精度乘法。SIMDFMU420还可以包括分别与浮点乘法器421、422、…428耦合的异常电路451、452、."458。异常电路451、452、…458的一些实施例包括非规格化检测电路,用以检测SIMD浮点乘法运算的分组操作数中的非规格化元素;以及异常产生电路,用以识别包含非规格化结果的、SIMD浮点乘法运算的异常结果。异常电路451、452、…458的实施例还可以可操作地与微代码ROM344耦合,以便响应于检测到的分组操作数中的非规格化元素,或者响应于所识别的异常结果,启动微-op序列来重新执行SIMD浮点乘法运算。浮点乘法器421、422、…428的实施例可以包括指数比较器电路和预测器,用以基于比较,对异常操作数元素的一些常见结果(例如0、最小可表示的非规格化数、或可任选的无穷大)做出预测,并将这种预测的结果存储为该乘法的结果,从而避免了异常。相反地,当不能预测异常操作数元素的乘法的这种常见结果时,可以对接收到的操作数执行乘法,并且可以根据本文所述的可替换的技术(例如处理801中的)来处理所出现的任何异常。SIMDFDU430包括浮点反规格化器431、432、…438,其可以包括能够使用用于单精度浮点值的内部浮点表示来执行单精度反规格化的多个浮点反规格化器,和能够使用用于双精度浮点值的内部浮点表示来执行双精度反规格化的多个浮点反规格化器。在SIMDFDU430的一个实施例中,浮点反规格化器431、432、…438中每隔一个的浮点反规格化器都能够执行单精度反规格化和双精度反规格化两者。在SIMDFDU430的一个替换实施例中,可以分割和/或组合浮点反规格化器431、432、…438,来分别执行单精度反规格化和/或双精度反规格化。浮点反规格化器431、432、…438的实施例还可以包括尾数舍入电路,用以执行并行的单精度和/或双精度舍入和反规格化。浮点反规格化器431、432、…438的一些实施例还能够在分组局部结果对的反规格化中使用恒定的非规格化指数值(例如-126或-1022)。SIMDFNU410的实施例可操作来产生具有规格化和/或非规格化成分浮点元素的分组操作数的伪内部浮点表示。SIMDFAU400和SIMDFMU420的实施例可在规格化模式下操作,以产生具有规格化成分浮点元素的单一分组结果,并且可在数值异常处理模式下操作,以产生具有规格化和/或非规格化成分浮点元素的分组结果的两个分组局部结果。在数值异常处理模式的一个实施例中,可以将阶段一的分组局部结果与阶段二的分组局部结果(同时地或者以任意时间顺序分别地)存储到寄存器文件的分开的存储单元中,以构成两个分组局部结果。微代码ROM344的实施例还可以包括用以向SIMDFAU400和SIMDFMU420指明它们是在数值异常处理模式的阶段一中执行还是在数值异常处理模式的阶段二中执行的微-op。SIMDFDU430的实施例可操作来接收具有规格化和/或非规格化成分浮点元素的分组结果的这两个分组局部结果,并产生具有规格化和/或非规格化成分浮点元素的单一分组结果。图5a示出了用于存储分组浮点数的内部表示的示例性存储格式501和502。用一对单精度浮点数来图示说明格式501和格式502,但会意识到格式501和格式502仅仅代表了典型的较宽分组浮点操作数(例如,代表了具有4个单精度元素或者2个双精度元素的分组操作数,或者代表了具有8个单精度元素或4个双精度元素的分组操作数)。格式501表示用于SIMD浮点运算的分组单精度目标操作数的(在SIMD寄存器文件中,诸如在寄存器文件旁路网络308中)一对分组局部结果的示例。格式501包括一对单精度元素,每一个单精度元素都包括39位第一元素包括一个符号位(S511)、IO个指数位(Ex519和Exp8512)、和28个尾数位(0515、一个明确位(explicitbit)J516、Mant23513和GRS517);第二元素包括一个符号位(S521)、10个指数位(Ex529和Exp8522)、和28个尾数位(O525、一个明确位J526、Mant23523和GRS527)。格式501包括一对标志位IMDN514和524,用以分别标识第一元素和/或第二元素是否是非规格化元素。在格式501的一个实施例中,这对单精度元素的成分存储在两个分组数据寄存器中第一分组数据寄存器包括该对标志位IMDN514和524、符号位S521(例如位63)、指数位Exp8522(例如位62—55)、尾数位Mant23523(例如位54—32)、符号位S511(例如位31)、指数位Exp8512(例如位30—23)、尾数位Mant23513(例如位22—0);第二分组数据寄存器包括两个最高有效尾数位0525和J526(例如位63和59)、指数位Ex529(例如位62—61)、三个最低有效尾数位GRS527(例如位42—40)、两个最高有效尾数位0515和J516(例如位34-33)、指数位Ex519(例如位32一31)和三个最低有效尾数位GRS517(例如位6—4)。会意识到,分组元素的成分作为一对分组局部结果存储在这两个分组数据寄存器中的具体位置可以由设计者来选择,以便有利于将分组元素的成分从这对分组局部结果复用到浮点运算单元(例如SIMDFAU400和/或用于反规格化的SIMDFDU430)的内部浮点表示中。格式502表示用于SIMD浮点运算的分组源操作数的(在诸如FAU400的浮点运算单元中的)内部浮点表示的示例。类似于格式501,格式502包括一对单精度元素的内部表示,每一个单精度元素都包括39位第一元素包括一个符号位(S511)、10个指数位(Ex519和Exp8512)、和28个尾数位(0515、J516、Mant23513和GRS517);第二元素包括一个符号位(S521)、10个指数位(Ex529和Exp8522)、和28个尾数位(O525、J526、Mant23523和GRS527)。在格式502的一个实施例中,浮点运算单元的内部浮点表示存储分开的指数用于第一元素的Ex519和Exp8512(例如位9一0),和用于第二元素的Ex529和Exp8522(例如位9一0)。在格式502的这个实施例中,可以将这两个元素的尾数存储为分组尾数具有O515(例如位67)、J516(例如位66)、Mant23513(例如位65—43)和GRS517(例如位42—40)的第一尾数;和具有0525(例如位31)、J526(例如位30)、Mant23523(例如位29—7)和GRS527(例如位6—4)的第二尾数;每一个元素的最低有效位中都填充了0(例如位39—32和位3—0)。图5b示出了用于存储分组浮点数的内部表示的示例性存储格式503和504。用一个双精度浮点数来图示说明格式503和格式504,但会意识到格式503和格式504仅仅代表了典型的较宽分组浮点操作数(例如,代表了具有4个单精度元素或者2个双精度元素的分组操作数,或者代表了具有8个单精度元素或4个双精度元素的分组操作数)。格式503表示用于SIMD浮点运算的分组操作数的双精度目标操作数元素的(在SIMD寄存器文件中,诸如在寄存器文件旁路网络308中)一对分组局部结果的示例。格式503包括包含71位或更多位的双精度元素的一对分组局部结果,其包括一个符号位(S531)、13个或更多个指数位(Ex539和Expll532)、和57个尾数位(O535、一个明确位J536、Mant52533和GRS537)。格式503包括与每一个双精度元素相关联的标志位IMDN534,用于标识该元素是否是非规格化元素。会意识到,分组元素的成分作为一对分组局部结果存储在这两个分组数据寄存器中的具体位置可以由设计者来选择,以便有利于将分组元素的成分从这对分组局部结果复用到浮点运算单元的内部浮点表示中。格式504表示用于SIMD浮点运算的分组操作数的分组源操作数元素的(在诸如FAU400的浮点运算单元中的)内部浮点表示的示例。类似于格式503,格式504包括包含71位或更多位的双精度元素的内部表示,其包括一个符号位(S531)、13个或更多个指数位(Ex539和Exp11532)、和57个尾数位(O535、J536、Mant52533和GRS537)。在格式504的一个实施例中,浮点运算单元的内部浮点表示为每一个元素存储分开的指数Ex539和Expl1532(例如位16—0)。在格式504的这个实施例中,分组元素的尾数可以存储为分组尾数,第一个尾数具有0535(例如位67)、J536(例如位66)、Mant52533(例如位65—14)和GRS537(例如位14_11),每一个尾数的最低有效位中都填充了0(例如位10—0)。会意识到,使用内部存储格式501—504,可以将分组浮点数据存储在固定大小的寄存器中,同时可以在不必转换为标量运算并且仅需要执行少量额外的微运算的情况下,明晰地处理SIMD浮点异常。还会意识到,格式501、502、503和/或504的实施例中,可以隐含地表示一些位(例如0525、J526、0535和/或J536)。图6示出了处理601的一个实施例的流程图,处理601用于处理SIMD浮点加法器中的特定数值异常。由处理块来执行处理601及本文公开的其他处理,其中处理块可以包括专用硬件,或者可以由通用机器或由专用机器或由二者的组合执行的软件或固件操作代码。处理601的一些实施例及本文公开的其他处理体现为机器可执行指令或状态转换。指令或状态转换可以用于使得以该指令或状态转换编程的通用处理器或专用处理器执行本发明的各个步骤。可以作为计算机程序产品或软件或微代码补丁(patch)来提供本发明,其可以包括在其上存储了指令或状态转换的机器或计算机可读介质,上述指令或状态转换可以用于编程计算机(或其他电子设备)来执行根据本发明的处理。这种软件可以存储在系统的存储器中或者存储在网络服务器上。类似地,可以经由网络或借助于其它计算机可读介质来分发所述代码。因此,机器可读介质可以包括用于以机器(例如计算机)可读的形式存储或传输信息的任何机制,但不限于软盘、光盘、紧致盘只读存储器(CD-ROM)和磁光盘、只读存储器(ROM)、随机存取存储器(RAM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、磁卡或光卡、闪存存储器、通过互联网的传输、电、光、声或其它形式的传播信号。在处理块611开始,在SIMDFAU的浮点加法器电路之一中接收用于SIMD浮点加法运算的分组操作数中的非规格化操作数元素。在处理块612,确定用于该SIMD浮点加法运算的第二分组操作数中的相应的第二操作数元素是否也是非规格化的。在一个实施例中,可以由非规格化检测电路(例如电路441-448中的一个)来检测非规格化操作数元素和可能的相应的第二操作数元素。如果这个相应的第二操作数元素不是非规格化的,那么就将该非规格化操作数元素和相应的第二操作数元素输入到处理块613中的对齐电路中,在对齐电路中,按照未偏移指数差,将非规格化操作数元素的尾数与相应的第二操作数元素的尾数对齐。否则,如果相应的第二操作数元素也是非规格化的,那么该非规格化操作数元素的尾数已经与相应的第二操作数元素的尾数对齐,从而处理直接前进到处理块614,在处理块614中,由浮点加法器电路将这两个尾数相加。在处理块615,确定该加法的结果是否可以表示为该SIMD浮点加法运算的分组结果中的规格化浮点结果元素。如果是,就在处理块616中对所得到的和数执行规格化。否则,就仅在处理块617中简单地对所得到的和数进行舍入,并在处理块618中进行重新规格化(例如如果O等于1,就右移1位),并且当在处理块619中存储该SIMD浮点加法运算的分组结果时,可以将非规格化结果存储为分组结果中的元素。会意识到,如果在处理块615确定所得到的和数不能表示为规格化浮点结果元素,那么存储该SIMD浮点加法运算的分组结果的结果存储电路还可以存储一个标志,该标志将所得到的和数标识为该分组结果中的非规格化结果元素。会意识到,处理601的实施例可以在无需(例如来自微代码的)额外辅助的情况下,处理SIMD执行单元(例如SIMD浮点执行单元316)中SIMD浮点运算中的诸如非规格化数之类的常见异常输入。图7示出了处理701的一个实施例的流程图,处理701用于处理SIMD浮点乘法器中某些常见(屏蔽的)异常。在处理块711,在SIMDFMU的浮点乘法器电路之一中接收SIMD浮点乘法运算的分组操作数中的异常操作数元素。在处理块712,比较相应操作数元素的指数。在处理块7B,基于这个比较,做出对于异常操作数元素的乘法的一些常见结果的预测。在处理块714,如果结果被预测为0,处理就前进到处理块717,在处理块717中存储预测值0作为结果。否则,处理就继续在处理块715中进行,在处理块715中,如果结果被预测为是最小可表示的非规格化数,则处理就前进到处理块717,在处理块717中存储所预测的最小可表示的非规格化值作为结果。否则,处理就可选地在处理块716中进行,在处理块716中,如果结果被预测为是无穷大,处理就前进到处理块717,在处理块717中存储所预测的无穷大值作为结果。否则,在处理块718,对接收到的操作数执行乘法,并根据本文所述的可替换技术(例如在处理801中的)来处理出现的任何异常。会意识到,处理701的实施例可以在无需额外的辅助(例如来自微代码的)的情况下,预测并处理SIMD执行单元(例如SIMD浮点执行单元316)中的SIMD浮点运算的常见异常结果。在这种经常出现的情况中,基本上可以消除或减小用于处理异常情况的损耗。可替换地,在剩余的情况中,可以在不转换为标量运算并且仅需要执行少量额外的微代码的情况下,可以使用这些技术来处理SIMD浮点异常。图8示出了处理801的可替换实施例的流程图,处理801用于处理执行SIMD浮点指令的处理器中非规格化浮点异常。在处理块811,为SIMD浮点运算识别数值异常。响应于该数值异常,在必要时,在处理块812启动一个或多个可选的规格化微运算。对于处理801的一个实施例,如果要由SIMD浮点乘法器至少部分地执行SIMD浮点运算(例如,乘法、除法、平方根、或从单精度转换为双精度),就启动规格化微运算。作为规格化微运算的结果,可以将分组操作数存储为该SIMD浮点运算的包含非规格化数的原始分组操作数的规格化的伪内部浮点表示。对于处理801的一个实施例,如果要由SIMD浮点加法器执行SIMD浮点运算(例如,加法/减法、或从双精度转换为单精度),就无需该规格化微运算,因为SIMD浮点加法器能够接受包含非规格化数的操作数作为输入。在处理块813,启动第一SIMD微运算,用以为SIMD浮点运算产生第一分组局部结果,并启动第二SIMD微运算,用以为SIMD浮点运算产生第二分组局部结果。会意识到,在处理801的一些实施例中,可以以任意顺序执行第一SIMD微运算和第二SIMD微运算,只要它们产生为SIMD浮点运算的分组结果而存储的一对分组局部结果。在处理块814,启动SIMD反规格化微运算,用以合并这对分组局部结果,并且如果需要,则对所合并的分组局部结果中的任何元素执行反规格化,以便产生具有相应非规格化元素的分组结果。对于SIMDFAU400的一些实施例,合并这对分组局部结果还可以包括在数值异常处理模式的阶段一中规格化分组局部结果。在处理块815,计算异常标志(例如IMDN514和524或534),以便标识分组结果中的非规格化元素。在处理块816,作为结果,将这些异常标志与该SIMD浮点运算的分组结果一起进行存储。会意识到,处理801的实施例提供了可以用于处理SIMD浮点异常的有效技术,其中所述SIMD浮点异常产生了非规格化数并需要重新执行。可以在不转换为标量运算并且仅需要执行少量额外的微运算的情况下,透明地并行处理这种异常。以上描述旨在说明本发明的优选实施例。依据以上的论述,明显的是,在快速增长并且不易预见到进一步发展的这个
技术领域
中,本领域技术人员在不背离在所附权利要求及其等价物的范围内的本发明的原理的情况下,可以在配置和细节中修改本发明。2权利要求1、一种用于处理执行单指令多数据(SIMD)指令的处理器中的浮点异常的方法,所述方法包括识别SIMD浮点运算的数值异常;启动第一SIMD微运算,以便为所述SIMD浮点运算产生第一分组局部结果;启动第二SIMD微运算,以便为所述SIMD浮点运算产生第二分组局部结果;启动SIMD反规格化微运算,以便合并所述第一分组局部结果和所述第二分组局部结果,并且对所合并的第一和第二分组局部结果中的第一元素执行反规格化,以便产生具有非规格化元素的第三分组结果;为所述SIMD浮点运算存储所述第三分组结果;以及设定用于标识在所述第一分组局部结果中的、所述第三分组结果的所述非规格化元素的标志。2、如权利要求1所述的方法,还包括为所述SIMD浮点运算启动对于所述第一分组局部结果的SIMD规格化微运算。3、如权利要求l所述的方法,其中,用于为所述SIMD浮点运算产生所述第一分组局部结果和所述第二分组局部结果的一组一个或多个分组源操作数以其原始表示宽度进行存储。4、如权利要求1所述的方法,还包括如果要由SIMD浮点乘法器至少部分地执行所述SIMD浮点运算,就启动SIMD规格化微运算。5、如权利要求3所述的方法,其中,所述SIMD规格化微运算将第二元素规格化为所述SIMD浮点运算的分组操作数的伪内部浮点表示,所述第二元素对应于所述SIMD浮点运算的所述分组操作数中的非规格化元素。6、如权利要求5所述的方法,其中,将一标志与所述SIMD浮点运算的分组操作数的所述伪内部浮点表示一起进行存储,该标志用于将所述第二元素标识为对应于所述非规格化元素。7、一种制造产品,包括机器可访问介质,包括用于为SIMD浮点运算处理数值异常的数据和指令,以使得所述数据和指令当由机器访问时,使得所述机器启动第一SIMD微运算,以便为所述SIMD浮点运算产生第一分组局部结果;启动第二SIMD微运算,以便为所述SIMD浮点运算产生第二分组局部结果;启动SIMD反规格化微运算,以便合并所述第一分组局部结果和所述第二分组局部结果,并且对所合并的第一和第二分组局部结果中的第一元素执行反规格化,以便产生具有非规格化元素的第三分组结果;为所述SIMD浮点运算存储所述第三分组结果;以及设定用于标识在所述第一分组局部结果中的、所述第三分组结果的所述非规格化元素的标志。8、如权利要求7所述的制造产品,所述机器可访问介质包括数据和指令,所述数据和指令当由机器访问时,使得所述机器为所述SIMD浮点运算启动对于所述第一分组局部结果的SIMD规格化微运算。9、如权利要求7所述的制造产品,其中,用于为所述SIMD浮点运算产生所述第一分组局部结果和所述第二分组局部结果的一组一个或多个分组源操作数以其原始表示宽度进行存储。10、如权利要求7所述的制造产品,所述机器可访问介质包括数据和指令,所述数据和指令当由所述机器访问时,^^得所述机器如果要由SIMD浮点乘法器至少部分地执行所述SIMD浮点运算,就启动SIMD规格化微运算。11、如权利要求10所述的制造产品,其中,所述SIMD规格化微运算将第二元素规格化为所述SIMD浮点运算的分组操作数的伪内部浮点表示,所述第二元素对应于所述SIMD浮点运算的所述分组操作数中的非规格化元素。12、如权利要求ll所述的制造产品,其中,将一标志与所述SIMD浮点运算的分组操作数的所述伪内部浮点表示一起进行存储,该标志用于将所述第二元素标识为对应于所述非规格化元素。13、一种用于执行SIMD浮点加法运算的装置,所述装置包括第一非规格化检测电路,用以检测用于所述SIMD浮点加法运算的第一分组操作数中的非规格化的第一元素;第二非规格化检测电路,用以检测用于所述SIMD浮点加法运算的第二分组操作数中的相应的第二元素是否也是非规格化的;对齐电路,用以如果所述相应的第二元素不是非规格化的,则按照未偏移指数差,将所述非规格化的第一元素的尾数与所述相应的第二元素的尾数对齐;加法器电路,用以将所述第一元素的尾数与所述第二元素的尾数相加,并且如果确定所得到的和数能够表示为所述SIMD浮点加法运算的分组结果中的规格化结果元素,则规格化所得到的和数;以及结果存储电路,用以存储所述SIMD浮点加法运算的所述分组结果,并且如果确定所得到的和数不能表示为所述SIMD浮点加法运算的所述分组结果中的规格化结果元素,则存储用于将所述相加的结果标识为所述分组结果中的非规格化结果元素的标志。14、如权利要求13所述的装置,具有数值异常处理模式,其中,为所述SIMD浮点加法运算存储第一分组局部结果和第二分组局部结果。15、如权利要求13所述的装置,包括规格化电路,用以对为所述SIMD浮点加法运算所存储的所述第一分组局部结果进行规格化。16、一种处理器,包括寄存器文件,用以为SIMD浮点运算存储多个分组浮点操作数和多个分组浮点结果;异常产生电路,用以识别第一SIMD浮点运算的数值异常;微代码异常处理机,响应于所述数值异常,启动第一SIMD微运算,以便为所述SIMD浮点运算产生第一分组结果;所述微代码异常处理机,还响应于所述数值异常,启动第二SIMD微运算,以便为所述SIMD浮点运算产生第二分组结果;所述微代码异常处理机,还响应于所述数值异常,启动SIMD反规格化微运算,以便合并所述第一分组结果和所述第二分组结果,对所合并的第一和第二分组结果中的元素执行反规格化,产生具有该被反规格化的元素的第三分组结果,为所述SIMD浮点运算存储所述第三分组结果,以及设定用于标识在所述第一分组结果中的、所述第三分组结果的该被反规格化的第一元素的标志。17、如权利要求16所述的处理器,其中,所述第一分组结果和所述第二分组结果包括一对分组局部结果,所述分组局部结果具有加法指数位和尾数位,所述加法指数位和尾数位支持产生或使用具有非规格化元素的分组数据的SIMD浮点运算。18、如权利要求16所述的处理器,还包括SIMD浮点加法单元,用以检测用于SIMD浮点加法运算的第一分组操作数中的非规格化的第一元素;检测用于所述SIMD浮点加法运算的第二分组操作数中的相应的第二元素是否也是非规格化的;如果所述相应的第二元素不是非规格化的,则按照未偏移指数差,将所述非规格化的第一元素的尾数与所述相应第二元素的尾数对齐;将所述第一元素的尾数与所述第二元素的尾数相加,并且如果确定所述相加的结果能够表示所述SIMD浮点加法运算的分组结果中的规格化结果元素,则规格化所述相加的结果;存储所述SMD浮点加法运算的所述分组结果;以及如果确定所述相加的结果能够表示规格化结果元素,则设定用于将所述相加的结果标识为所述分组结果中的规格化结果元素的标志。19、如权利要求16所述的处理器,所述微代码异常处理机还响应于所述数值异常,在要由SIMD浮点乘法器至少部分地执行所述SIMD浮点运算的情况下,启动SIMD规格化微运算。20、如权利要求19所述的处理器,其中,所述SIMD规格化微运算的所述分组结果以其原始表示宽度进行存储。21、如权利要求19所述的处理器,其中,所述SIMD规格化微运算将第一元素规格化为所述SIMD浮点运算的分组操作数的伪内部浮点表示,所述第一元素对应于所述SIMD浮点运算的所述分组操作数中的非规格化元素。22、如权利要求21所述的处理器,其中,将一标志与所述SIMD浮点运算的所述分组操作数的所述伪内部浮点表示一起进行存储,该标志用于将所述第一元素标识为对应于所述非规格化元素。全文摘要公开了用于处理执行单指令多数据(SIMD)指令的处理器中的浮点异常的方法和装置。在一个实施例中,为SIMD浮点运算识别数值异常,启动SIMD微运算,以便为所述SIMD浮点运算产生分组结果的两个分组局部结果。启动SIMD反规格化微运算,以便合并这两个分组局部结果,并对所合并的分组局部结果中的一个或多个元素执行反规格化,以便为SIMD浮点运算产生具有一个或多个非规格化元素的分组结果。设定标志,并将其与分组局部结果一起进行存储,用以标识非规格元素。在一个实施例中,在SIMD浮点运算使用乘法时,启动SIMD规格化微运算,以便在该SIMD浮点运算之前,产生规格化的伪内部浮点表示。文档编号G06F15/80GK101620589SQ20091013964公开日2010年1月6日申请日期2009年6月30日优先权日2008年6月30日发明者A·格拉德斯坦,G·普里布什,G·贝尔,S·芬克尔斯坦,T·庞斯,Z·斯佩贝尔申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1