基于序列检测或与指令相关联的信息来优化指令的性能的制作方法

文档序号:6587900阅读:156来源:国知局
专利名称:基于序列检测或与指令相关联的信息来优化指令的性能的制作方法
基于序列检测或与指令相关联的信息来优化指令的性能
背景技术
在许多基于处理器的系统中,处理器提供针对拷贝或存储操作的高效实现而被调
整的指令。用于存储器拷贝操作的软件被针对特定的处理器实现而进行优化。在许多情况
下,用于执行数据拷贝的最优方式在不断变化,而且,代码充当着编译器、操作系统(OS)内
核和应用程序编写器的活动目标,所述编译器、操作系统内核和应用程序编写器被迫使用
针对不同场景、不同微架构等而被调整的多种扩充(proliferation)。
迭代拷贝指令(iterative copy instruction)可被用于如该指令的参数之一所 规定的那样拷贝一定数量的数据元素。迭代拷贝操作可以具有不同的固有(native)数据 元素长度,例如,字节、字、双字、四字等等。固有长度越长,指令在移动数据的量方面更加高 效,这是因为可以使用更大的"载入"和"存储"操作。例如,在Inte1⑧Architecture (IA32) 架构中,重复移动字节(REP M0VSB)指令将给定寄存器内的值用作拷贝的长度的指示。此 外,该指令接收源指针和目的地指针作为输入参数。这种指令被定义为"一次一个地"移动 一个字节的数据。在某些情况下,该指令的实现可以切换至"快速模式",在该模式下,使用 更长的操作(例如,一次16个字节)来执行操作。IA32程序员参考手册定义了在当前处理 器中执行这种快速模式的条件。 由于在许多情况下拷贝和设置操作的长度在编译时是未知的,所以一种用现有实 现的迭代拷贝操作来提高拷贝操作效率的方案是使用第一迭代拷贝指令来移动数据串的 大部分,之后使用第二迭代拷贝指令来移动数据的剩余部分(例如,第一拷贝操作每次移 动双字,而第二拷贝操作移动最后的0-3字节)。这种序列有两个缺点(a)第二指令耗费 额外的周期,这些额外的周期总是会被花费掉,即使当没有剩余部分时也是如此;以及(b) 优化所针对的情况是,特定长度的第一迭代拷贝指令其后跟着用于第二迭代拷贝指令的有 限指令序列;任何其它组合将会导致显著的性能损失。 此外,在流水线型机器中,经常发生的情况是,需要在指令译码时决定指令的最佳 行为,即便是作出该决定所需的一些数据还未知或还未提交。这样的一个示例是分支,其需 要被采用还是不被采用取决于标志,即使这些标志还未被计算出来。解决该问题最常用的 方案是使用分支预测器。但是这种预测器需要时间来进行训练(建立历史记录),具有高昂 的成本(因为需要保存许多状态),并且在异常模式(flaky pattern)下它们的性能是不确 定的。


图l是根据本发明的
图2是根据本发明的
图3是根据本发明的
图4是根据本发明的
图5是根据本发明的
一个实施例的方法的流程图。
一个实施例的序列检测器的框图。
一个实施例的序列译码器状态机的示例的状态图。
一个实施例的处理器的框图。
一个实施例的系统的框图。
具体实施例方式
在各种实施例中,编译器生成的拷贝操作的属性可被用于更高效地执行迭代拷贝
操作。如本文中所使用的,术语"拷贝"操作被用作存储器拷贝、存储器移动和存储器设置操 作的通称,这些操作在存储器内移动数据、将数据移入或移出存储器。不同环境可以使用这 类操作的不同名称。这些拷贝操作的"快速模式"可以在许多情况中被执行。即使当不可用
时(例如,当别名风险测试(aliasing-risk-test)失败时),在许多情况下(假设随机分布 的情况),仍然可以执行比其中一次拷贝单个数据元素的固有模式更快的模式。因此优化的 拷贝序列从开始就尝试使用数个不同快速模式(即,比固有模式更快的模式)之一来执行 拷贝,并且仅仅在很少数情况下将导致使用固有长度的操作来执行拷贝操作。处理器指令 集可以包括一个或多个指令,用于命令处理器执行存储器拷贝或存储器设置(存储)操作, 当被高效实现时,其可以使得处理器硬件在不同的微架构和架构世代上保持其性能边界。
如下面将进一步描述的,一个实施例可以包括数个主要步骤(在下面详细描述), 包括(l)对开始"快速拷贝"所需的规则执行检查,并针对之后的步骤进行建立操作;(2) 头部,其中进行条件拷贝(使用条件操作来覆盖流水线的时延,以防止传播导致的气泡 (bubble)) ;(3)快速的固定大小的迭代,其具有处理感兴趣的情况的特性;以及(4)尾部。 所述检查和头部(步骤1和2)针对所有串长(即,拷贝长度或块长度)被执行。注意,头 部在所有的检查都通过的情况下被执行;否则,硬件进入固有循环,其以拷贝操作的固有大 小一次一个地执行拷贝操作。根据在头部中所分析的拷贝的长度,按照需要执行快速循环 和尾部。通过提早作出决定,可以选择流水线气泡最少并且没有分支误预测的执行路径。 对于一些长度或源(src)-目的地(dst)距离处理,可以应用一些额外限制,例如,在一些 实现中的"快速循环"内,可能存在将需要重新执行一些操作的不准确的异常检测,以允许 返回多达64B,除了在头部进行检查之外,还需要检查目的地指针是否落后源指针不超过 63B(即,(dst mod 4k)-(src mod4k) < 63B)。当这种额外检查失败时,仍可以转至次优的 代码例程来进行正确的执行。此外,在一些实施例中,对于拷贝操作长度非常长并且缓存提 示(caching hint)可以用来提高性能的情况,可以存在可选的特殊处理。应该注意的是, 尽管在此以特定大小的拷贝操作进行描述,但是本发明的范围并不限于此,并且这些实施 例可以处理针对其它大小(例如,不同数目的字节和高速缓存行宽度)而优化的拷贝操作。
现在参见图l,示出了根据本发明的一个实施例的方法的流程图。方法100可以在 诸如通用或专用硬件单元这样的处理器的不同位置被执行。方法ioo可以用于以优化方式 来执行迭代拷贝操作。如在图1中所示,方法ioo可以从执行检查并对拷贝操作进行预备
开始(框110)。更具体地,可以执行各种检查来确定要执行的拷贝操作的类型,以及通过将 拷贝操作中使用的各种计数值载入计数器中来初始化与拷贝操作相关联的各种计数器。首 先,可以执行数个检查来确定是否可以执行快速流程,其中在所述快速流程中,使用比指令 的固有长度更长的载入/存储操作来执行拷贝操作。如果任何一个检查失败,则执行固有 模式循环(框120),在所述固有模式循环中,使用指令的固有长度(例如,对于字节移动操 作为字节,而对于双字指令为双字)来进行拷贝操作。应该注意的是,这些检查使用在执行 阶段所获取的数据,其中在执行阶段中,所需信息已经可用并且已知。如果任何一个检查失 败,则误推测代价可能与相关联的性能影响一同发生,但是在通常的使用中这是少有的情 况,并且由于消耗的是固有循环,所以使得相对损失也较低。
在一个实施例中,被检查的条件包括检查数据串的目的地(dst)指针和源(src)指针之间的距离,以确保之前读取的src将不会改变操作的行为。该距离被测量如下;如果0字节(B) < ((dst mod 4K)-(src mod4K)) < 16B,则可能退出至固有模式。在可替代的其中不关注页间的存储器别名的实施例中,可以在不进行"mod 4K"的情况下进行操作。此外,方向(DF)标志被检查。如果DF标志二二"1",则可能退出至固有模式。对地址空间(对src和dst 二者)的回巻(wr即-around)的检查可以被确定,并且如果为真,则该检查导致退出至固有模式。替代的实现可以针对进入快速模式而增加其它条件或者消除一些条件。 在框110中,还可以执行对诸如"快速循环"(Fast Loop)这样的快速循环进行的预备以及尾部。在一个实施例中,这可以包括计算快速CL循环的计数(例如,如果在rcx寄存器中用字节来规定长度,并且每个循环对64个字节进行操作,则使用rcx/64来计算迭代的数目),并且将其载入零开销计数寄存器(假设当跳转至快速循环110时,如之后讨论的那样,"头"部拷贝多达64B的数据,并且计数器减1)。在其中"头"部处理多于64B (例如,128B)的数据的一些情况下,可能需要从rcx/64的计算中减去一常数。此外,尾部条件被计算,并且被置于零开销跳转控制寄存器中。 如果任何一个检查失败,则控制转至框120,其中,可以以固有模式来执行拷贝。在各种实施例中,该固有模式可以用于执行根据固有长度模式的拷贝操作,之后方法100可以结束。因此,在批(bunch)拷贝操作所需的条件未满足的情况下,固有长度被用于使用零开销循环的每个拷贝迭代(例如,对于重复移动字节指令(REP M0VSB)的情况,每个迭代为1个字节)。 而如果检查通过并且确定可以执行快速拷贝操作(基于框110中的检查和计算),则控制从框110转至框130。在框130,可以执行拷贝操作的头部。更具体地,可以执行条件载入/存储,其可以处理多达预定数量的任何长度的数据,例如64字节的数据。如将在本文中描述的,在一个这样的实施例中,可以执行多达八个拷贝操作,来拷贝多达64字节
的数据。更具体地,如果在框iio检查通过,则此时处理器知道可以执行比固有拷贝长度更
长的拷贝操作,而不影响结果的正确性。 因此,在框130,拷贝操作正在使用"条件"操作,其中,如果剩余长度中具有至少"N"个字节,则将执行长度为"N"字节的每个条件拷贝。应该注意的是,该条件在执行时被检查,由此不依赖于长度信息从执行阶段返回至译码阶段的传播。除了拷贝之外,每次迭代将会使源和目的地指针加"N"以供后续操作使用,并且将剩余长度减去"N"。
拷贝操作的数目被设置,以允许在"检查"步骤(框IIO)中进行的预备在流水线中传播,从而当它们被轮转到并且在译码阶段被使用时,将不会对它们有任何惩罚。应该注意的是,对于"载入零开销计数器"或"零开销分支条件",从译码到完成执行所花费的时间——其是条件操作在其中被译码并执行的窗口,等于从译码到执行的流水线深度。假设机器可以处理的最大载入/存储长度(用字节表示)是"N二2'n",则可以使用如下为2的幂的长度的序列(可以被称为2的幂的树)来执行拷贝序列1, 1,2,4,. . . N/2,N,N,N。例如,如果N = 16,并且假设处理器需要8个操作来覆盖流水线延迟,则序列将是1, 1, 2, 4, 8,16, 16, 16 ;其提供了最大64B的拷贝。对于范围0至64B中的每个数目,存在上述操作的子集,其可以精确移动该数据量(例如,为了移动3字节,应该执行1字节和2字节,或者为了移动10字节,应该执行2字节和8字节)。对于另一示例,如果N = 32并且需要8个操作来覆盖流水线延迟,则序列将是1, 1, 2, 4, 8, 16, 32, 32,共计96B。在一些实施例中,条件段可以处理的最大数据量是快速循环的大小的整数倍(例如,64BX1 = 64B或64BX2 =128B)是高效的。 在一个实施例中,实际上以上面的列表的相反顺序(例如,16, 16, 16,8,4,2, 1, 1)来执行操作的序列,以仅生成通过框130的头部正确拷贝从0到64B范围内的任何数目的字节所需的操作的子集。这是通过使条件查看剩余长度来进行的,并且如果Remainder—Length-N > 0,则进行操作,否则跳过。Remainder Length在每个拷贝操作之后被用该操作的长度来进行更新。应该注意的是,并不是每进行拷贝操作就更新src和dst指针,而可以仅更新相对于原始src和dst指针的偏移量,并在框130结束时(或者在该框的中间的某个其他快照点)将src和dst指针更新为它们的新值。这可以在每个条件步骤中节省一个"加"操作。 在头部130结束时,使用框110中的计数器、选择的循环类型和预备的条件来进行多路判决。更具体地,如果零开销计数器值等于或大于l,则该计数器减1并且执行框140的快速循环,否则如果尾部条件为真(即,剩余的字节数目小于64但大于0),则在框135执行尾部,否则,如果没有要拷贝的额外数据,则方法100结束。因此,零开销计数器值被用于确定是否需要调用"快速循环"。计数器被加载有迭代数+1,如果计数器> l,则其被减小,并且跳转至"快速循环"的头部。如果确定计数器为等于1或更小,则不需调用该循环。
仍参见图l,如果剩余计数值大于63字节,则控制转至框140,其中可以执行快速的固定大小的迭代,每次迭代时传送例如64字节和/或高速缓存行大小的数据。这是一个以预先载入的零开销循环计数器来处理预定义长度的拷贝操作的快速循环。在一些实施例中,在执行框140的拷贝操作之前,进行数个检查,当命中时所述数个检查采取误预测惩罚(但是将允许在其发生的情况中进行"更快速执行")。首先,可以执行附加的指针距离检查,如果快速循环的限制比在头部中的条件拷贝内的限制更严格,则可能需要该检查。例如,不跟踪其进度的快速循环可能需要从头重新执行,除了之前进行的所有检查之外,这还调用检查((src mod 4K)-(dst mod4K)) > 63B。如果该检查失败,则控制转至框160,其中执行第二快速循环(其在下面被更完整讨论,并且其可以对应于没有这些限制但是可能更慢执行的拷贝);(2)检查数据串的剩余长度,并且如果该长度大于定义的阈值(NT_threshold),则控制转至框150,框150是一个循环,其使用诸如针对载入和存储操作(例如,Intel的M0VNTDQA或M0VNTSQ指令)的非临时提示这样的缓存提示,用于避免高速缓存污染。在一个实施例中,N乙threshold参数可以针对高速缓存大小而被调整,以获得最好的性能影响。可替代的实现可以使用多个阈值级别来确定不同的缓存提示的最好应用。
在框140的循环的每次迭代期间,64B的数据以最快的可能方式被拷贝(S卩,使用针对该拷贝长度的优化的代码序列)。迭代的数量使用零开销循环计数器来确定。在框140的快速循环结束时,检查针对处理尾部的条件,并且可以采取以下决定(因为对条件进行了预先设置,所以再次具有零开销)如果tail—condition =真,则控制转至框135处的尾部,否则,如果没有要拷贝的额外数据,则方法100结束。 应该注意的是,在框160,fastj6循环类似于快速循环,但是(根据针对该拷贝长度的优化的序列)每次迭代拷贝16B的数据。零开销计数器在执行该循环之前被调整,以
7允许16B的迭代。 在进行了尽可能多的64B数据块的拷贝(或框140、 150、 160的其他大小的拷贝操 作)之后,可能留下多达63B的拷贝操作的剩余部分(应该注意的是,只有存在这样的尾 部,处理器才会到达此位置)。在框135使用条件拷贝操作的序列来处理尾部,所述序列类 似于头部所使用的序列,不同的是所述序列从单个l字节(1,2…)而不是两个l字节开始。 此外,尾部长度被设置成一个快速循环迭代中的数据量的大小减1 (例如,63B = 64B-1),并 且与流水线深度无关。因此,对于上面的N二 16并且快速循环为64B的示例,将以以下数 据块来拷贝尾部16,16,16,8,4,2,1字节(7个操作),如上面针对头部所讨论的,相反的顺 序被用来优化定义要被移动的操作子集的处理。对于N二 32,尾部序列将是32,16,8,4,2, 1 (6个操作)。 应该注意的是,当框110中所检查的DF标志为"1"时,数据串将为"相反"的顺序, 并且源和目的地指针被减小。上述算法使用固有循环(通过将控制转至框120)来应对这 种情况。可替代的实现可以通过使用对称方案将针对指针调节操作的操作进行反向,来使 用类似的"快速拷贝"实现此类拷贝操作。 尽管上述方法100的实现可以是针对使用REP M0VSB指令的迭代拷贝操作,但是 其它实现可以与其它拷贝指令一起使用。例如,与存储指令(例如,REP STOSB)—起使用 的算法可以使用与REPMOVSB相同的方案,使用上述大部分步骤,发生变化的是,不执行用 于拷贝操作的载入+存储,而仅执行存储。另外,还有一些针对REP STOSB情况所采用的简 化(1)不需要检查src和dst之间的距离;(2)不需要检查关于src指针的条件。还需要 额外步骤来为存储数据寄存器预备最长存储操作的长度(在上述实例中为N二 16或N二 32),所述存储数据寄存器保存数据的复制版本以用于存储操作(ST0SB包括需要在目的地 存储数据寄存器的每个字节中复制的一字节数据)。 尽管图1中所示的实现是针对REP M0VSB并且针对每次迭代64字节而进行调节, 但是其它实现可以用于处理不同长度的快速拷贝操作。此外,这些操作还可以用来执行使 用诸如移动双字长度的其他指令(例如,REP M0VSD)或其它此类指令的快速拷贝操作。可 替代的实施例可以采用与"无别名"的页面有关的"假设"(并因此移除对4K取模的支持)。
如上所述,一些代码序列被优化以针对它们包括的特定类型的指令以最高效的方 式执行期望的操作,而在其它的序列中,相同的指令可能不是以其最优方式执行。因此,在 各种实施例中,序列检测技术可以被实现来分析输入指令序列并向执行单元提供代码,以 使得能够以优化方式执行给定代码序列的一个或多个指令。 作为一个示例,在未预知长度的情况下,IA32REP M0VS和REP ST0S操作被调整来 处理拷贝操作。当前优化是基于将REP MOVSD用于移动数据的大部分而将REP M0VSB用于 处理剩余部分,在使用中已知所述剩余部分的长度为0-3 (用于优化REP M0VSB执行时间的 信息)。实现这些拷贝操作的代码的示例在表l中示出(类似结构适用于REP ST0S):
movl 0x0c(%esp), % edi 〃载入目的地地址
movl % edi, % eax movl 0xl0(%esp), % esi 〃载入源地址
movl 0xl4(%esp), % edx 〃将长度载入edx
cld movl %edX,%eCx 〃通过针对"双字"计数而设置ecx来开始移动序列 shrl $0x02, % ecx r印/movsl(% esi) , (% edi) movl%edx, % ecx 〃开始针对"剩余字节"计数而设置ecx andl $0x03, % ecx r印/movsb(% esi) , (% edi) 对此,通过快速处理长度为0-3的情况而对其它长度进行惩罚来优化REP MOVSB。 由于它之前的操作,上述方案确保计数绝不超出0-3。但是,也存在其它各种序列可以用于 执行该优化,尤其是用于针对REP MOVSB指令而设置计数。因此,将REP MOVSB的行为改变 为针对不同于0-3的其他长度进行优化(例如,将其与REP MOVSQ指令结合来使用将具有 0-7的剩余长度)将导致该代码在许多情况下(在该示例中,当长度为4-7时)发生错误 行为并且损失性能。类似地,针对REP MOVSB的其他优化(例如,使其对于处理任何长度都 很高效的优化,和作为导致长度0-3的情况下性能降低的优化的一部分)将使上述表1中 描述的代码发生错误行为并损失性能。关于REP MOVSB应该处理的长度的决定需要在指令 译码时作出,以防止流水线延迟上的时间损失而产生可能导致性能损失的"气泡",即使ecx 的值将仅在指令执行时才已知也是如此。 在所描述的优化(表1)中,MOVSB紧跟在REP MOVSD指令后(被称为D+B序列), 这用作程序员将REP MOVSB指令用于有限数目的字节(例如,0-3字节)的意图的提示。这 样,实施例可以借助该序列提示来向执行单元提供不同的指令代码,以使得能够优化(至 少)该第二拷贝指令。因为精确的指令序列可以改变,并且其它代码可以用来获得相同的 结果,因此取代搜索特定序列的是,硬件搜索跟在REP MOVSD指令之后并与之相隔少量指令 (例如,l-9)的REP M0VSB。因为不保证检测到D+B序列,并且也不保证D+B序列不被错误 地检测,所以无论对哪个流进行译码和选择哪种优化,对于任何给定的数据长度,译码都提 供正确的执行。 现在参见图2,示出了根据本发明的一个实施例的序列检测器的框图。如图2所 示,处理器200可以包括指令译码器210,其接收要被执行的指令。当在该译码器中被接收 时,这些指令可以存储在缓冲器215内。缓冲器215可以用来向译码逻辑220提供下一个执 行的指令,译码逻辑220还从包括序列检测器状态机240的反馈路径接收译码路径选择信 号。基于该选择信号和译码逻辑220的各种规则,指令可以被译码并被提供给执行单元230 以供执行。通常,译码逻辑220进行操作来接收输入指令,并从中生成译码指令。在一个实 施例中,这些译码指令可以是与指令相对应的机器代码形式,其随后被提供给执行单元230 以使得能够执行指令。例如,这些指令代码可以使执行单元执行微代码序列,或者选择给定 的功能单元来执行期望的操作。应该注意的是, 一些译码逻辑电路可以并行地执行数个指 令的译码。其它译码逻辑电路可以将单个指令转换成多个命令来执行。
如在图2中进一步示出的,译码指令可以被提供给反馈路径的译码指令比较器 225,其中,译码指令可以与从状态机240接收到的预期指令代码进行比较。该预期指令代 码可以对应于处于代码序列的开始处、希望使用状态机240和译码逻辑220来优化的给定 指令代码。在一些实现中,这可以通过内部微操作阵列的索引来实现。在一些实现中,可以提供多个这种状态机和比较器,其中每一个都与代码序列中要被搜索的给定指令相关联。在其它实现中,状态机240和比较器225可以被扩展来为比较和分析这多个指令提供支持。
如在图2的实施例中所示,对于单个指令的实现,如果比较器225的两个进入的代码之间发生了匹配,则将匹配信号从比较器225报告回状态机240。如在图2中进一步所示,状态机240还在每个周期中从指令译码器210接收停顿信号(或指令译码指示)。因此,尽管图2说明指令的译码一次进行一个的情况,但是其可以被扩展到对多个指令进行并行译码的情况。指令译码器210保存馈送到译码逻辑220中的指令。在一个实施例中,译码逻辑220可以包括使用特定状态信息(例如,可以将一些指令定义为非法的机器模式)来对指令进行解析的逻辑功能。译码器的输出是被称为"译码指令"的代码,其标识将针对该指令而被执行的微操作。这些操作的性质取决于机器的微架构的实现,但是也可以被看作是独特地描述指令的二进制值(或一系列值)。该代码被传送至执行单元230以在一个或多个周期中执行与译码指令相对应的操作。 在一个实现中,优化是基于松散方式的指令序列。它假设保证指令的正确操作而无论是何判决,这避免了需要保证序列的检测在所有情况下都是准确的,并且可以优化来检测大部分序列的发生。指令比较器225将来自状态机240的当前指令代码与从指令译码器220接收到的"下一指令代码"进行比较。该代码可以涵盖一系列代码或者多于一个的代码,这取决于下面将要讨论的状态机流程。 一旦检测到匹配,状态机240移动至下一步骤。该状态机基于检测到匹配而从一个步骤移动至另一个步骤(其可以从一个状态改变到另一个状态),或者基于时间或译码指令计数而从一个步骤移动至另一个步骤。当使用时间时,可以从指令译码器210提供停顿指示,以防止状态机在指令译码器210停顿时(例如,由于等待从更低级别的缓存或存储器中完成取指,或者在执行单元忙并且不能处理新指令的情况下)进行"计数"。通过这些停顿,执行周期计数变得与译码指令计数紧密接近,并且在一些情况下可能更易于实现。序列检测器状态机240向译码逻辑220反馈状态信息信号,其在图2中示出为"译码路径选择"信号。该状态信息改变译码逻辑220,使得对于指令缓冲器215内的相同指令,译码器规则将用信号向执行单元230发送不同的译码指令。
为了阐明操作,提供了针对两种情况来检测并优化REP MOVSB (和REP STOSB)的执行的示例(1)REP M0VSB本身用来拷贝可能大于3字节的未知数据长度(即,"长REPMOVSB"指令);以及REP MOVSB与REP MOVSD在代码序列中相结合来使用,在这种情况下,针对REPMOVSB指令的长度被期望在0-3字节的范围内,并且在此被称为"短REPMOVSB"。因此,可以从指令译码器210输出两个不同的代码,以使得执行单元230运行两种不同的优化拷贝操作中所选的一个。 图3是根据本发明的一个实施例的序列译码器状态机的示例的状态图,并且说明了该状态机的实现。如图3所示,在操作310,状态机被重置为正在寻找REP MOVSD或REPSTOSD指令的情况。在这种情况下,如果在代码序列中遇到REP MOVSB,则来自状态机的译码路径选择信号被设置为生成"长REP MOVSB"代码。同时,指令检测器被提供了REPMOVSD和REP STOSD代码,如果两者中的一个被遇到,则该指示被提供至序列检测器状态机,所述序列检测器状态机现在通过提供译码路径选择信号而切换到它正在寻找"紧跟的"REP MOVSB或REP MOVSB的模式,以编码用于"短REP MOVSB"操作的代码。针对所识别的REP MOVSB或REP STOSD阈值距离,状态机将保持此状态(在操作320-340)并持续较小数目的"n个非停顿周期"或相等的"nl个指令"。如果此时对一个指令进行译码,则nl可以等于n,而如果在同一时间对多个指令进行译码,则nl大于n (例如,为4n)。在取指-停顿或防止译码器发出用于该流程的新指令的任何其他停顿的情况中,计数被停顿以保证序列检测。在该示例中,数"n"较小,例如为4。在该延迟之后,不管REPMOVSB是否到达,序列返回到寻找REP MOVSD或REP STOSD的初始状态310,以作为新REP MOVSD+B序列的开始指示。未检测到REP MOVSB或者REP STOSB的情况覆盖了这样的场景,即,该代码仅包括REP MOVSD并且在其它地方可以"仅"包括一个REP MOVSB。在一些实施例中,状态机操作中间的诸如中断这样的事件可以被忽略,这是因为误预测的惩罚乘以它们发生的比率要比该事件的代价小。 可选地,以下是可以实现的,即状态机将寻找REP MOVSB或REPSTOSB作为从状态320和330提早离开并返回至状态310的出口 ,然而当该代码序列短时则这是不必要的(假设没有REP MOVSD紧随在REPMOVSB后并且在固定延迟内缺失)。因此,在其它实施例中,特别是在所识别的指令之间的序列空间可能更长的实施例中,在检测到第二指令(或其它附加指令)时,该状态机可以被重置为初始搜索状态(状态310)。 保证精确执行而不管所采用的优化,这一事实涵盖了诸如REPMOVSD和REP MOVSB指令之间发生异常的情况。如果发生这种少见的状况,则REP MOVSB的执行可以选择非优化路径,这可能会耗费一些性能,但是将不会破坏代码的正确执行。还存在其它情况可能导致误预测,例如流水线的转储清除(flushing)(例如,REP MOVSB在REP MOVSD之后被译码,并且然后被转储清除)。在这种情况下,通常希望状态机将不被重置,在该情况下,很可能将在允许的延迟窗口内对REP MOVSB进行重新译码。 在一个实施例中,序列检测器状态机的实现可以被放宽,以允许正确处理其中流程不准确和发生波动的情况。例如,使用计时器(对非停顿时钟或指令进行计数)而不搜索精确的序列也可以解决该问题。 现代译码器可以允许同时对多个指令进行译码。可以以多种方式来扩展上述实现以涵盖该情况。首先,对"被搜索"的指令的译码可以被限制为每次一个。在REP MOVSB的示例中,REP MOVSD和REP STOSD指令将由它们自身进行译码。第二,多个比较操作可以被放置在每个译码器的输出上并且被串行化(对后续操作进行转储清除),或者多个比较器被用于所有预期代码,以允许该状态机从任何操作紧随该代码序列。如果使用非串行化译码,则状态机可以被扩展为支持同时进行多个步骤分支(第二匹配译码并行于第一匹配译码,等等)。 因此,实施例允许对REP MOVSB指令的优化,其对于新代码提供了显著益处,而不会导致在被优化来使用REP MOVSD+B序列的已有代码上的性能损失。 现在参见图4,示出了根据本发明的一个实施例的处理器的框图。如图4所示,处理器400可以是多级流水线乱序处理器。在图4中用相对简化的视图示出了处理器400,以说明所使用的与上述指令调整有关的各种特征。 如图4所示,处理器400包括前端单元410,其可以用于获取要执行的宏指令,并且对它们进行预备以供之后在处理器中使用。例如,前端单元410可以包括取指单元404、指令高速缓存406、和指令译码器408。在一些实现中,前端单元410还可以包括追踪高速缓存、微代码存储设备以及Pop存储设备。取指单元404可以例如从存储器或指令高速缓
11存406获取宏指令,并将它们馈送至指令译码器408以将它们译码成原语,S卩,由处理器执行的P op。指令译码器408可以根据本发明的实施例被配置为包括用于执行序列检测的逻辑,从而当一组输入指令包括预先确定的由两个或多个指令构成的序列(或诸如上述那样选择的彼此紧密接近的指令的序列)时,该逻辑可以使得指令译码器408提供不同的译码指令(例如,供之后在处理器流水线中执行的Pop)以优化性能。此外,在一些实现中,当接收到给定的宏指令时,指令译码器408可以使得发送给定的微代码序列以供执行,其中,该序列可以根据本发明的实施例来处理快速模式拷贝操作。在其它实现中,可以用特定硬件来扩展执行单元,以响应于译码指令而高效地执行这种快速拷贝操作。
耦合在前端单元410和执行单元420之间的是乱序(000)引擎415,其可以被用于接收宏指令并对它们进行预备以供执行。更具体地,OOO引擎415可以包括各种缓冲器,用于对宏指令流进行重排序和分配执行所需的各种资源,以及提供诸如寄存器文件430和扩展寄存器文件435这样的各种寄存器文件中的存储位置上的逻辑寄存器的重命名。寄存器文件430可以包括用于整型和浮点型操作的分别的寄存器文件。扩展寄存器文件435可以为矢量大小的单元提供存储,例如,每寄存器256或512比特。 在执行单元420内可以存在各种资源,例如包括各种整型、浮点型和单指令多数据(SIMD)逻辑单元,和其它专用硬件。结果可以被提供给引退逻辑,即重排序缓冲器(R0B)440。更具体地,ROB 440可以包括各种阵列和逻辑,用于接收与被执行的指令相关联的信息。该信息接着由ROB 440进行检查,来确定该指令是否可以被有效引退并且结果数据是否被提交给处理器的架构状态,或者是否发生一个或多个阻止所述指令的正确引退的异常。当然,ROB 440可以处理与引退相关联的其他操作。 如图4所示,ROB 440被耦合到高速缓存450,在一个实施例中,高速缓存450可以是低级高速缓存(例如,Ll高速缓存),但是本发明的范围不限于此。此外,执行单元420可以直接耦合到高速缓存450。可以从高速缓存450与更高级的高速缓存、系统存储器等进行数据通信。尽管在图4的实施例中用该高级别示出,但是应该理解,本发明的范围并不限于此。 实施例可以以许多不同的系统类型来实现。现在参见图5,示出了根据本发明的一个实施例的系统的框图。如图5所示,多处理器系统500是点对点互连系统,并且包括经由点对点互连550耦合的第一处理器570和第二处理器580。如图5所示,处理器570和580的每一个都可以是多核处理器,其包括第一和第二处理器核心(S卩,处理器核心574a和574b以及处理器核心584a和584b)。每个处理器核心可以包括诸如图1_4中所示的用于执行指令调整的硬件、软件和固件。 仍然参见图5,第一处理器570还包括存储器控制器中心(MCH)572和点对点(P-P)接口 576与578。类似地,第二处理器580包括MCH 582和P-P接口 586与588。如图5所示,MCH 572和582将处理器耦合到相应的存储器,即存储器532和存储器534,它们可以是在本地附接到相应处理器的主存储器(例如,动态随机存取存储器(DRAM))的部分。第一处理器570和第二处理器580可以通过P-P互连552和554分别耦合到芯片组590。如图5所示,芯片组590包括P-P接口 594和598。 此外,芯片组590包括接口 592,以将芯片组590与高性能图形引擎538进行耦合。芯片组590又可以通过接口 596耦合到第一总线516。如图5所示,各种I/O设备514可以与总线桥518 —起耦合到第一总线516,所述总线桥518将第一总线516耦合到第二总线520。各种设备可以耦合到第二总线520,在一个实施例中,例如包括键盘/鼠标522、通信设备526和诸如盘驱动器或其它大容量存储设备这样的数据存储单元528,该数据存储单元528可以包括代码530。此外,音频I/0 524可以耦合到第二总线520。
这些实施例可以用代码来实现并且可以被存储在其上存储有指令的存储介质上,所述指令可以用来对系统进行编程以执行这些指令。所述存储介质可以包括但不限于任何类型的盘,包括软盘、光盘、光盘只读存储器(CD-ROM)、可重写光盘(CD-RW)以及磁光盘;半导体器件,例如只读存储器(ROM)、诸如动态随机存取存储器(DRAM)与静态随机存取存储器(SRAM)这样的随机存取存储器(RAM)、可擦可编程只读存储器(EPROM)、闪速存储器、电可擦可编程只读存储器(EEPROM)、磁卡或光卡;或者适合于存储电子指令的任何其他类型的介质。 尽管已经针对数量有限的实施例描述了本发明,但是本领域技术人员将从中意识到许多修改和变型。所附权利要求意图涵盖落入本发明的实质精神和范围内的所有这种修改和变型。
权利要求
一种装置,包括执行单元,用于执行指令代码指示的操作;以及指令译码器,用于接收输入指令,其中,所述指令译码器包括第一逻辑,用于接收第一输入指令,并从反馈路径接收路径选择信号,所述反馈路径耦合到所述指令译码器并且包括耦合到所述指令译码器的、用于生成所述路径选择信号的序列检测器,所述路径选择信号对应于检测到所述指令译码器在所述第一输入指令的阈值距离内接收到不同的输入指令,所述第一逻辑响应于所述路径选择信号而将所述第一输入指令译码成第一指令代码或第二指令代码。
2. 如权利要求1所述的装置,还包括比较器,用于接收来自所述指令译码器的指令代 码和来自所述序列检测器的预期代码,并且如果所述指令代码和所述预期代码相匹配,则 生成匹配信号。
3. 如权利要求2所述的装置,其中,如果未生成所述匹配信号,则所述序列检测器生成 第一状态的路径选择信号,以使得所述第一逻辑将所述第一输入指令译码成所述第一指令 代码,所述第一指令代码对应于针对第一数据长度而优化的拷贝操作。
4. 如权利要求3所述的装置,其中,响应于所述匹配信号,所述序列检测器生成第二状 态的路径选择信号,以使得所述第一逻辑将所述第一输入指令译码成所述第二指令代码, 所述第二指令代码对应于针对与所述第一数据长度不同的第二数据长度而优化的拷贝操 作。
5. 如权利要求4所述的装置,其中,所述第二指令代码使得所述执行单元执行长度受 限的拷贝操作。
6. 如权利要求4所述的装置,其中,如果所述指令译码器在与所述第一输入指令的阈 值距离相对应的第一数量的指令中接收到所述不同的输入指令,则所述序列检测器生成所 述第二状态的路径选择信号。
7. 如权利要求6所述的装置,其中,所述阈值距离是通过周期数目和译码停顿信息来 估计的。
8. 如权利要求6所述的装置,其中,所述序列检测器包括状态机,如果在所述第一数目 的指令内未接收到所述不同的输入指令,则所述状态机重置。
9. 一种方法,包括至少部分地基于与迭代拷贝指令相关联的信息来确定所述迭代拷贝指令是否能够被 优化;如果是,则通过第一条件拷贝操作序列来执行所述迭代拷贝指令的第一部分,其中使 用2的幂的拷贝的树将多达第一数目的块中多达第一数量的数据从第一源位置拷贝到第 一目的地位置;如果要被拷贝的数据的剩余部分大于第一阈值,则通过拷贝操作的快速循环将第二数 量的数据从第二源位置拷贝到第二目的地位置,来执行所述迭代拷贝指令的第二部分;之后,如果仍剩余有要拷贝的数据,则通过第二条件拷贝操作序列来执行所述迭代拷 贝指令的第三部分,其中将多达第三数目的块中多达第三数量的数据从第三源位置拷贝到 第三目的地位置。
10. 如权利要求9所述的方法,还包括在执行所述第一条件拷贝操作序列之前,获得针对所述快速循环和所述第二条件拷贝操作序列的建立信息。
11. 如权利要求9所述的方法,还包括确定数据的所述第二数量是否大于第二阈值, 并且如果是,则使用缓存提示将所述第二数量的数据直接拷贝到存储器,而不用在高速缓 存中存储。
12. 如权利要求9所述的方法,其中,所述第一条件拷贝操作序列的第一操作拷贝N字 节的数据块,增加与所述第一拷贝操作序列相关联的第一和第二指针,并且更新与要拷贝 的剩余数据相关联的计数器。
13. 如权利要求9所述的方法,其中,2的幂的树从与处理器的最大载入或存储长度相 对应的2的第一个幂的长度开始,并且以与一个字节相对应的2的最后一个幂结束。
14. 如权利要求9所述的方法,还包括确定与所述迭代拷贝指令相关联的第一指针和 第二指针之间的差是否在第三阈值和第四阈值之间,并且如果是,则通过宽度小于所述快 速循环的一次迭代的拷贝操作来拷贝所述第二数量的数据。
15. —种系统,包括处理器,其具有前端,所述前端包括具有译码逻辑的译码器,所述译码逻辑用于接收进 入拷贝指令和来自耦合到所述译码器的反馈路径中的第二逻辑的选择信号,所述选择信号 指示在所述译码器中接收到包括所述进入拷贝指令和至少一个其他拷贝指令的指令序列, 并且所述译码逻辑用于响应于所述选择信号而将所述进入拷贝指令译码成第一指令代码 或第二指令代码,所述处理器还具有执行单元,用于接收所述第一或第二指令代码,并且响 应于此而相应地执行第一拷贝操作或第二拷贝操作;以及动态随机存取存储器(DRAM),其耦合到所述处理器。
16. 如权利要求15所述的系统,其中,所述第二逻辑包括序列检测器,用于如果所述进 入拷贝指令是在与所述至少一个其它拷贝指令相对应的第二进入拷贝指令之后的第一数 目的指令内接收到的,则生成所述选择信号以使得所述译码逻辑生成所述第二指令代码, 否则使得所述译码逻辑生成所述第一指令代码。
17. 如权利要求16所述的系统,其中,如果所述进入拷贝指令不是在所述第一数目的指令内接收到的,则所述序列检测器重置为第一状态来搜索所述第二进入拷贝指令。
18. 如权利要求17所述的系统,其中,在检测到所述第二进入拷贝指令之后,所述序列检测器从所述第一状态前进到第二状态来搜索所述进入拷贝指令。
19. 如权利要求16所述的系统,还包括比较器,用于接收来自所述译码器的指令代码 和来自所述序列检测器的预期代码,并且用于如果所述指令代码和所述预期代码相匹配, 则生成匹配信号。
20. 如权利要求15所述的系统,其中,所述第一拷贝操作针对第一数据长度而被优化, 而所述第二拷贝操作针对与所述第一数据长度不同的第二数据长度而被优化。
全文摘要
在一个实施例中,本发明包括指令译码器,其能够接收输入指令和路径选择信号,并且响应于该路径选择信号而将该输入指令译码成第一指令代码或第二指令代码。表示同一输入指令的这两个不同的指令代码可以被执行单元用于执行针对不同数据长度而优化的操作。还描述了其它实施例,并且要求保护这些实施例。
文档编号G06F9/38GK101788903SQ20091100015
公开日2010年7月28日 申请日期2009年11月5日 优先权日2008年11月5日
发明者L·拉波波特, M·米沙利, O·法利克, R·加博尔, Y·库罗莱普 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1