用于实现从由加载存储重新排序和优化所引发的推测性转发缺失预测/错误中恢复的方...的制作方法_3

文档序号:8501115阅读:来源:国知局
应是其保持Rl寄存器‘忙碌’等待数据,并且其不能被用于其他目的。存储器队列扩展资源池以保持数据。因此我们将LDR转换成LAD和后续LAD:
[0107]LAD QID,M[eal]
[0108]…许多指令
[0109]LAF M[eal]
[0110]ADD32 Rt, QID, R2
[0111]由于加载队列条目QID被使用,Rl被自由地用于其他目的。
[0112]或者加载具有Rt-QID的差的Rt,或者如果QID不存在,则从M[eal]重新加载数据,从其减去R2,并将结果放置在Rt中。
[0113]应足以的是用上述实现方式,不需要存储器地址计算在2个加载之间匹配。如果两个地址计算不同且QID仍是有效的,则很有可能存在不好的程序员。OS(在我们的示例32中)也不必在LAD与LAF之间匹配。比所需更多的数据可被LAD读取,在这种情况下,将使用数据读取的最低有效字节。或者LAF+后缀可能需要比LAD读更多的数据,在这种情况下将使用由LAD读取的最低有效字节,后面是O直至后缀操作足够为止。此外,地址计算操作数不必在LAD与LAF之间匹配,虽然为了有良好的编码,其应获得相同的结果产生的有效地址。
[0114]B.通过使正常ALU寄存器一寄存器操作变成ALU寄存器存储器操作,节省执行循环。
[0115]在这里,我们正在使用特殊QID = 0(%0)仅仅是为了将正常寄存器一寄存器ADD指令变成存储器引用。由于LAF是前缀且必须直接耦合到ADD,所以在中间不存在指令。QID=O始终可供使用,因为其立即被使用。
[0116]LAF M[eal]
[0117]ADD32 Rt, % qO, R2
[0118]LAF有效地将以上指令变成
[0119]ADD32 Rt,M[eal],R2
[0120]我们还可以使用SAF来将ALU寄存器一寄存器操作变体成将ALU操作的结果存储到存储器中的操作。
[0121]SAF M[eal]
[0122]ADD % qO, R2, R3
[0123]将把将R2和R3相加的结果在地址eal处存储到存储器中。
[0124]C.促进存储之上加载时,保持顺序语义
[0125]另一问题是我们想要促进存储(STR)之上加载(LDR),其可以也可不与加载的地址别名使用。别名:eal的某些或所有数据地址与ea2相同.
[0126]STR M[ea2]
[0127]LDR Rl,M[eal]
[0128]ADD32 Rt, Rl, R2
[0129]变成
[0130]LDR Rl,M[ea2]
[0131]O至许多指令
[0132]STR M[ea2],R3
[0133]O至许多指令
[0134]ADD32 Rt, Rl, R2
[0135]为了安全地完成此操作(生成正确代码),我们需要工具以完成此操作。在这里,我们使用LAD和SAD指令两者及其相应的LAF和SAF前缀+后缀指令,并且能够保持执行顺序且生成正确的代码。
[0136]LOOP:
[0137]SAD M[ea2],R3
[0138]O至许多指令
[0139]a)
[0140]LAD Rl, M[eal]
[0141]O至许多指令
[0142]b)
[0143]SAF M[eal],R3
[0144]O至许多指令
[0145]c)
[0146]saf-后缀
[0147]LAF M[eal]
[0148]d)
[0149]BRN 回路
[0150]在以上代码中,必须促进LAD和SAD两者且其保持相同的排序。可能发生什么?在每个点a、b、C、d处指示替换。
[0151]al)中断,使SAD无效,后续SAF将不许重新执行a2,LAD与SAD别名使用,使SAD无效,或者将相反地不会被插入存储器队列中
[0152]bl)中断,使SAD和LAD无效
[0153]b2) SAF与LAD别名使用,并且使LAD无效
[0154]b3) SAF使用仍有效的SAF或者重新执行,
[0155]cl)中断,使LAD无效,
[0156]c2)如果仍有效,则LAF使用LAD的数据,否则重新执行。
[0157]c3)循环,利用硬件,用IP标记和执行序列ID的组合,并且适当的管理QID、LAD/SAD/LAF/SAFo
[0158]在LA/SA和LD/SD的上述描述中,使用LA和SA相对程序顺序位置来强制执行用于转发目的的顺序。在另一实施例中,可以使用LD/SD相对程序顺序位置来强制执行用于转发目的的顺序(例如,如下所述)。
[0159]图4示出了根据本发明的一个实施例的其中图示出用于实现从由加载存储重新排序和优化引发的推测性转发缺失预测/错误中恢复的规则的过程400的步骤的流程图。
[0160]如步骤401所示,本发明的实施例的目的是在该存储与该加载之间有地址匹配时找到向加载进行转发的存储。在步骤402处,最近的早先存储(例如,按机器顺序)向加载进行转发。
[0161]在步骤403中,当按机器顺序来分配LD/SD时,针对LA/SA更新实际年龄。为LA/SA实际年龄指派(assign)以与LD/SD年龄相同的值。LD/SD保持实际年龄并执行原始程序顺序语义。
[0162]步骤404— 407示出了用于在支持推测性执行的同时保持程序连续语义的规则。步骤404— 407被示为被相互水平地布置以指示同时地实现这些规则功能的机制。如步骤404中所示,如果存储具有实际年龄但加载还没有获得实际年龄,则存储早于加载。如步骤405中所示,如果加载具有实际年龄但存储还没有获得实际年龄,则加载早于存储。如在步骤406中所示,如果加载或存储都没有获得实际年龄,则将使用虚拟标识符(VID)来找出哪个较早(例如,在某些实施例中,与加载/存储指令相关联的QID表示VID)。如步骤407中所示,如果加载和存储两者都已经获得实际年龄,则使用实际年龄来找出哪个较早。
[0163]应注意的是用来确定加载与存储之间的相对年龄的图4实施例所述的算法还可以用来确定多个存储之间的相对年龄。这在如下面在图4和后续图中所述的更新存储年龄戳时有用。
[0164]图5示出了图示出根据本发明的一个实施例的用处理器的加载队列和存储队列资源来实现过程400的规则的方式的图。图5实施例示出了其中指令回路已解开成两个相同指令序列401—402的示例。应注意的是SA和LA可以自由地重新排序,然而,SD和LD必须保持其相对程序顺序。较早的存储可以向较晚的加载进行转发。较早意味着较小的VID (例如,保持在虚拟ID表中)或较小的年龄。如果SA具有VID但没有年龄,则SA比具有年龄的加载晚。LA/SA的实际年龄在LD/SD分配时被更新,并被指派LD/SD的相同年龄。如果存储或加载具有实际年龄,则其与实际年龄相比较,否则使用VID年龄。
[0165]应注意的是VID表通过经由存储对应于每个VID唯一标识符的LA/SA对应的机器ID和机器资源来跟踪LA/SA与LD/SD指令之间的关联而运行。还应注意的是术语“VID”与术语“QID”是同义词,如在图2A和图2B的讨论中所描述的。
[0166]现在描述图4实施例的操作示例。最初,考虑其中分配指针410最初为3的情况。V3 LA已在加载队列条目#4中分派和分配。Vl SA和V2 SA两者都已分派。它们与V3 LA相比较,并且由于V2 SA小于V3 LA且比Vl SA更接近于V3 LA,所以其潜在地向V3 LA进行转发,并且因此其更新用于V3 LA加载队列条目的存储初始年龄。
[0167]分配指针现在移动至6。V2 SA (#5)的存储实际年龄现在更新V3 LA加载队列条目(因为V2 SA是已被加戳成向此加载进行转发的记录的存储)。V4 SA现在分派并与加载初始年龄相比较,并且由于V4大于V3 LA,所以其并不进行转发。分配指针现在移动至Ilo在分配V3 LD时,其用V3 LD(#7)的实际年龄来更新加载队列条目#4。现在分派Vl SA#11。由于V3 LA #1现在具有实际年龄但Vl SA #11没有,则加载早于存储,并且因此转发是不可能的。
[0168]预测表用于检测其中默认假设不正确的情况。该默认假设是没有存储向加载进行转发。一旦针对加载存储对检测到转发,则记录加载存储对的程序计数器,使得加载将始终等待该存储地址被分配和被计算的地址以找出该加载地址是否与该存储地址匹配且因此需要从其进行转发。
[0169]应注意的是在一个实施例中,本文所述的特征促进给定指令序列中的在分支之前或在分支范围内的LA/SA的重新排序,其中,允许LD/SD在不存在LA/SA的情况下进行分派。如果由于分支而跳过LA和SA,或者由于已引发存储器例外情况而将其忽视,则LD和SD仍可以正确地运行,因为其包括分派两次所需的信息:第一次作为LA/SA,并且第二次作为LD/SD。在这种情况下,LD/SD的第一分派是执行地址计算(例如,加载地址)。随后,同一 LD/SD可以再次地分派以满足加载或存储(例如,加载数据)的消耗部分。可以将此机制称为加载和存储指令的“双重分派”。
[0170]应注意的是在一个实施例中,LD/SD的双重分派在对应的经去融合的LA/SA不存在时发生(例如,如经融合的LD/SD的情况一样),或者如果由于分支而跳过LA/SA,或者其由于已引发存储器例外情况而被忽视等。
[0171 ] 上述双重分派功能确保LD/SD不依赖于被丢失、忽视和/或跳过LA/SA而正确地执行。由上述特征提供的益处是由加载/存储指定的数据的预取读可以通过甚至在存在分支、潜在错误、例外情况等情况下较早地调度LA/SA而按照程序顺序较早地开始(例如,减少时延)。
[0172]图6示出了图示出根据本发明的另一个实施例的用处理器的加载队列和存储队列资源来实现过程400的规则的方式的另一图。在图6实施例中,考虑其中分配指针最初为3的情况。V3 LA已在加载队列条目#4中分派和分配。分配指针现在移动至6。Vl和V2 (#4, #5)的存储实际年龄现在用机器ID 2和3来更新对应的SA。V4 SA现在分派并与加载初始年龄相比较,并且由于V4 SA大于V3 LA,所以其并不转发。分配指针现在移动至Ilo在分配V3 LD时,其用V3 LD(#7)的实际年龄来更新加载队列条目#4。现在分派ID 10的 Vl LA。
[0173]现在分派机器ID 2的Vl SA和机器ID 3的V2 SA两者。其与ID 10的Vl LA相比较,并且由于ID 10的Vl LA不具有机器年龄(其对应的LD尚未分配),所以虽然机器ID2的Vl SA和机器ID 3的V2 SA具有实际年龄,然后已知Vl和V2存储比Vl更早/更旧。然后,这两个存储(V2)中最新的一个可以向ID 10的Vl进行转发。现在分派SA(V2)#11。由于Vl LA和V2 SA不具有实际年龄,但其VID被用于比较,并且未检测到转发。分配指针现在移动至16。现在分派ID 16的V4 SA,并且其与ID 10的Vl LA相比较,并且由于VlLA具有实际年龄但V4 SA不具有,所以V4 SA比Vl LA晚。因此,不可能从此存储向此较早的加载进行转发。
[0174]图7示出了图示出根据本发明的另一个个实施例的用处理器的加载队列和存储队列资源来实现过程400的规则的方式的另一图。在图7实施例中,考虑其中分配指针最初为3的情况。在存储队列条目#4和#5中已分派并分配Vl SA和V2 SA。分配指针现在移动至6并分派V4 SA。Vl SA和V2 SA两者都获得
当前第3页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1