本發(fā)明涉及多線程處理,且更特定來(lái)說(shuō)涉及用于在多線程處理系統(tǒng)中執(zhí)行子例程的技術(shù)。
背景技術(shù):單指令多數(shù)據(jù)(SIMD)處理系統(tǒng)是一種類(lèi)型的并行計(jì)算系統(tǒng),其包含在多個(gè)數(shù)據(jù)塊上執(zhí)行相同指令的多個(gè)處理元件。SIMD系統(tǒng)可為獨(dú)立計(jì)算機(jī)或計(jì)算系統(tǒng)的子系統(tǒng)。舉例來(lái)說(shuō),一或多個(gè)SIMD執(zhí)行單元可用于圖形處理單元(GPU)中以實(shí)施支持可編程著色的可編程著色單元。SIMD處理系統(tǒng)允許以并行方式在多個(gè)處理元件上同步地執(zhí)行程序的多個(gè)執(zhí)行線程,借此增加其中需要對(duì)多個(gè)數(shù)據(jù)塊執(zhí)行相同一組操作的程序的通過(guò)量。由于每一線程對(duì)不同數(shù)據(jù)產(chǎn)生作用,所以如果程序包含條件性分支指令,那么有可能針對(duì)執(zhí)行于系統(tǒng)中的一些線程而滿足分支條件且針對(duì)執(zhí)行于系統(tǒng)中的其它線程而不滿足分支條件。此條件可稱(chēng)作發(fā)散分支條件且導(dǎo)致SIMD系統(tǒng)不能夠以同步方式在多個(gè)處理元件上執(zhí)行所有線程。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明是針對(duì)用于在經(jīng)受發(fā)散線程條件的單指令多數(shù)據(jù)(SIMD)處理系統(tǒng)中執(zhí)行子例程的技術(shù)。特別地說(shuō),描述用于管理發(fā)散線程的基于恢復(fù)計(jì)數(shù)器的方法,其利用程序模塊特定型最小恢復(fù)計(jì)數(shù)器(MINRC)來(lái)有效處理控制流指令。如本文中所使用,程序模塊可指主程序模塊(例如,頂級(jí)程序模塊)或子例程程序模塊。因而,在處理系統(tǒng)中執(zhí)行的每一子例程可使用子例程特定型MINRC來(lái)控制對(duì)所述子例程中包含的控制流指令的處理。程序模塊特定型MINRC的使用允許實(shí)施基于MINRC的控制流的系統(tǒng)支持執(zhí)行子例程程序指令。在一個(gè)實(shí)例中,本發(fā)明描述一種方法,所述方法包含通過(guò)一或多個(gè)處理器基于第一MINRC來(lái)控制對(duì)程序的執(zhí)行。第一MINRC指定指示與所述程序的多個(gè)執(zhí)行線程相關(guān)聯(lián)的多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值的值。所述方法進(jìn)一步包含通過(guò)一或多個(gè)處理器基于與所述程序的子例程相關(guān)聯(lián)的第二MINRC來(lái)控制對(duì)所述子例程的執(zhí)行。第二MINRC指定指示來(lái)自多個(gè)恢復(fù)計(jì)數(shù)器值的子集的最小恢復(fù)計(jì)數(shù)器值的值,所述多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)子例程的執(zhí)行時(shí)為有效的所有線程。在另一實(shí)例中,本發(fā)明描述包含一或多個(gè)處理器的系統(tǒng),所述一或多個(gè)處理器經(jīng)配置以基于第一MINRC來(lái)控制對(duì)程序的執(zhí)行且基于與所述程序的子例程相關(guān)聯(lián)的第二MINRC來(lái)控制對(duì)所述子例程的執(zhí)行。第一MINRC指定指示與所述程序的多個(gè)執(zhí)行線程相關(guān)聯(lián)的多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值的值。第二MINRC指定指示來(lái)自多個(gè)恢復(fù)計(jì)數(shù)器值的子集的最小恢復(fù)計(jì)數(shù)器值的值,所述多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)子例程的執(zhí)行時(shí)為有效的所有線程。在另一實(shí)例中,本發(fā)明描述包含用于基于第一MINRC來(lái)控制對(duì)程序的執(zhí)行的裝置的設(shè)備。第一MINRC指定指示與所述程序的多個(gè)執(zhí)行線程相關(guān)聯(lián)的多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值的值。所述設(shè)備進(jìn)一步包含用于基于與所述程序的子例程相關(guān)聯(lián)的第二MINRC來(lái)控制對(duì)所述子例程的執(zhí)行的裝置。第二MINRC指定指示來(lái)自多個(gè)恢復(fù)計(jì)數(shù)器值的子集的最小恢復(fù)計(jì)數(shù)器值的值,所述多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)子例程的執(zhí)行時(shí)為有效的所有線程。在另一實(shí)例中,本發(fā)明描述存儲(chǔ)指令的計(jì)算機(jī)可讀存儲(chǔ)媒體,所述指令在執(zhí)行時(shí)致使一或多個(gè)處理器基于第一MINRC來(lái)控制對(duì)程序的執(zhí)行。第一MINRC指定指示與所述程序的多個(gè)執(zhí)行線程相關(guān)聯(lián)的多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值的值。所述指令進(jìn)一步致使一或多個(gè)處理器基于與所述程序的子例程相關(guān)聯(lián)的第二MINRC來(lái)控制對(duì)所述子例程的執(zhí)行。第二MINRC指定指示來(lái)自多個(gè)恢復(fù)計(jì)數(shù)器值的子集的最小恢復(fù)計(jì)數(shù)器值的值,所述多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)子例程的執(zhí)行時(shí)為有效的所有線程。在附圖及以下描述中闡述本發(fā)明的一或多個(gè)實(shí)例的細(xì)節(jié)。本發(fā)明的其它特征、目標(biāo)和優(yōu)勢(shì)將從描述和附圖以及從權(quán)利要求書(shū)顯而易見(jiàn)。附圖說(shuō)明圖1是說(shuō)明可用于實(shí)施本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例處理系統(tǒng)的框圖。圖2是根據(jù)本發(fā)明的更詳細(xì)地說(shuō)明圖1的實(shí)例處理系統(tǒng)中的控制單元的框圖。圖3是說(shuō)明可用于實(shí)施本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例控制流模塊的框圖。圖4是說(shuō)明本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例控制流的概念圖。圖5是說(shuō)明本發(fā)明的子例程執(zhí)行技術(shù)的另一實(shí)例控制流的概念圖。圖6是根據(jù)本發(fā)明的技術(shù)的說(shuō)明實(shí)例程序空間布置的概念圖。圖7到18是說(shuō)明利用本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例指令處理技術(shù)的流程圖。圖19是說(shuō)明可用于實(shí)施本發(fā)明的子例程執(zhí)行技術(shù)的另一實(shí)例控制流模塊的框圖。圖20是根據(jù)本發(fā)明的特征化圖19中所說(shuō)明的控制流模塊的示范性操作的狀態(tài)轉(zhuǎn)變圖。圖21是根據(jù)本發(fā)明的特征化圖19中所說(shuō)明的控制流模塊的示范性操作的狀態(tài)轉(zhuǎn)變表。圖22到28說(shuō)明用于實(shí)施本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例偽碼。圖29是根據(jù)本發(fā)明的說(shuō)明用于基于程序模塊特定型MINRC來(lái)控制處理系統(tǒng)的實(shí)例技術(shù)的流程圖。圖30是根據(jù)本發(fā)明的說(shuō)明用于執(zhí)行子例程調(diào)用指令的實(shí)例技術(shù)的流程圖。圖31是根據(jù)本發(fā)明的說(shuō)明用于執(zhí)行子例程返回指令的實(shí)例技術(shù)的流程圖。具體實(shí)施方式本發(fā)明是針對(duì)用于在經(jīng)受發(fā)散線程條件的單指令多數(shù)據(jù)(SIMD)處理系統(tǒng)中執(zhí)行子例程的技術(shù)。特別地說(shuō),描述用于管理發(fā)散線程的基于恢復(fù)計(jì)數(shù)器的方法,其利用程序模塊特定型最小恢復(fù)計(jì)數(shù)器(MINRC)來(lái)有效處理控制流指令。如本文中所使用,程序模塊可指主程序模塊(例如,頂級(jí)程序模塊)或子例程程序模塊。因而,在處理系統(tǒng)中執(zhí)行的每一子例程可使用子例程特定型MINRC來(lái)控制對(duì)所述子例程中包含的控制流指令的處理。程序模塊特定型MINRC的使用允許實(shí)施基于MINRC的控制流的系統(tǒng)支持執(zhí)行子例程程序指令。在一些實(shí)例中,本發(fā)明的技術(shù)可包含使用主程序MINRC來(lái)控制對(duì)主程序的執(zhí)行及使用子例程特定型MINRC來(lái)控制對(duì)由主程序或由其它子例程調(diào)用的子例程的執(zhí)行。主程序MINRC值可指示來(lái)自一組一或多個(gè)恢復(fù)計(jì)數(shù)器值的最小恢復(fù)計(jì)數(shù)器值,所述一組一或多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)主程序的執(zhí)行時(shí)為有效的所有線程(其通常為執(zhí)行于系統(tǒng)中的所有線程)。類(lèi)似地,每一子例程特定型MINRC可指定指示來(lái)自一組一或多個(gè)恢復(fù)計(jì)數(shù)器值的最小恢復(fù)計(jì)數(shù)器值的值,所述一組一或多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)相應(yīng)子例程的執(zhí)行時(shí)為有效的所有線程。每一恢復(fù)計(jì)數(shù)器值可對(duì)應(yīng)于執(zhí)行于處理系統(tǒng)上的多個(gè)線程中的相應(yīng)者,且如果所述相應(yīng)線程無(wú)效,那么恢復(fù)計(jì)數(shù)器值可指示所述無(wú)效線程經(jīng)調(diào)度以再激活所處的程序計(jì)數(shù)器值。當(dāng)一或多個(gè)線程被去活時(shí),當(dāng)前控制處理系統(tǒng)的執(zhí)行的MINRC可用于控制在向前跳躍之后或在向前分支指令之后執(zhí)行哪個(gè)指令。舉例來(lái)說(shuō),在某些情況下,在執(zhí)行向前跳躍指令或向前分支指令之后,處理系統(tǒng)可將由MINRC指示的指令選擇為將執(zhí)行的下一指令。通過(guò)將獨(dú)立的MINRC用于主程序和用于子例程中的每一者,處理系統(tǒng)可確保子例程不從子例程分支到主程序中或分支到不在調(diào)用或返回指令的執(zhí)行范圍中的另一子例程中。這樣,本發(fā)明的技術(shù)可確保用于在使用MINRC來(lái)控制對(duì)向前跳躍指令和向前分支指令的執(zhí)行的處理系統(tǒng)中執(zhí)行子例程的恰當(dāng)控制流。根據(jù)本發(fā)明的一些方面,描述用于切換MINRC的技術(shù),所述MINRC用于在進(jìn)入和退出子例程之后即刻切換控制對(duì)處理系統(tǒng)的執(zhí)行。舉例來(lái)說(shuō),響應(yīng)于執(zhí)行調(diào)用指令,處理系統(tǒng)可經(jīng)配置以:保存對(duì)應(yīng)于調(diào)用者程序的MINRC的狀態(tài);初始化對(duì)應(yīng)于子例程程序的新MINRC;以及基于對(duì)應(yīng)于子例程程序的MINRC來(lái)控制對(duì)子例程的執(zhí)行。響應(yīng)于執(zhí)行返回指令,處理系統(tǒng)可經(jīng)配置以:還原對(duì)應(yīng)于調(diào)用者程序的MINRC的所保存狀態(tài);以及基于MINRC的所還原狀態(tài)來(lái)恢復(fù)控制對(duì)調(diào)用者程序的執(zhí)行。根據(jù)本發(fā)明的一些方面,描述用于響應(yīng)于激活和/或去活處理系統(tǒng)中的一或多個(gè)線程來(lái)更新MINRC值的技術(shù)。一般來(lái)說(shuō),為更新MINRC值,處理系統(tǒng)可確定一組候選恢復(fù)計(jì)數(shù)器值以供用于確定MINRC值,且將MINRC設(shè)定到指示來(lái)自所述一組候選恢復(fù)計(jì)數(shù)器值的最小恢復(fù)計(jì)數(shù)器值的值。一組候選恢復(fù)計(jì)數(shù)器值可為對(duì)應(yīng)于執(zhí)行于處理系統(tǒng)中的所有線程的一組完整恢復(fù)計(jì)數(shù)器值的子集。在一些情況下,一組候選恢復(fù)計(jì)數(shù)器值可排除對(duì)應(yīng)于在起始對(duì)當(dāng)前執(zhí)行的程序模塊的執(zhí)行時(shí)為無(wú)效的線程的一或多個(gè)恢復(fù)計(jì)數(shù)器值。通過(guò)在更新MINRC時(shí)排除此些恢復(fù)計(jì)數(shù)器值而不予考慮,本發(fā)明的技術(shù)可確保子例程特定型MINRC被更新到在與子例程相關(guān)聯(lián)的程序空間內(nèi)的值。如果SIMD處理系統(tǒng)的指令集架構(gòu)(ISA)支持控制流指令,那么可由包含單一程序計(jì)數(shù)器的單一控制流單元來(lái)控制所有線程。由于每一線程對(duì)不同數(shù)據(jù)產(chǎn)生作用,所以有可能針對(duì)執(zhí)行于系統(tǒng)中的一些線程而滿足特定分支指令的分支條件且針對(duì)執(zhí)行于系統(tǒng)中的其它線程而不滿足特定分支指令的分支條件。如果針對(duì)執(zhí)行于系統(tǒng)中的所有有效線程而滿足或不滿足由特定條件性分支指令所指定的條件,那么所述分支指令的分支發(fā)散據(jù)稱(chēng)是一致的。否則,如果針對(duì)一些有效線程而滿足條件且針對(duì)其它有效線程而不滿足條件,那么所述分支指令的分支發(fā)散據(jù)稱(chēng)是發(fā)散的。如果發(fā)生發(fā)散分支,那么經(jīng)調(diào)度以針對(duì)一些有效線程所執(zhí)行的下一指令可不同于經(jīng)調(diào)度以針對(duì)其它有效線程所執(zhí)行的下一指令。此可導(dǎo)致SIMD處理系統(tǒng)不能夠以鎖步方式執(zhí)行所有線程。為處理發(fā)散分支指令,在一些實(shí)例中,本發(fā)明的技術(shù)可去活滿足或不滿足分支條件的線程的一個(gè)子集以使得剩余有效線程皆被同步化以執(zhí)行相同的下一指令。為控制對(duì)所去活線程的再激活,本發(fā)明的技術(shù)可使用基于恢復(fù)計(jì)數(shù)器的方法,所述方法涉及:為執(zhí)行于處理系統(tǒng)中的每一線程分配恢復(fù)計(jì)數(shù)器;將正去活的每一線程的恢復(fù)計(jì)數(shù)器設(shè)定到指示應(yīng)再激活相應(yīng)線程所處的程序計(jì)數(shù)器值的值;以及在執(zhí)行每一指令之前執(zhí)行恢復(fù)檢查操作。舉例來(lái)說(shuō),基于恢復(fù)計(jì)數(shù)器的方法可響應(yīng)于發(fā)散分支條件來(lái)去活一或多個(gè)線程,且針對(duì)正去活的每一線程而將相應(yīng)線程的恢復(fù)計(jì)數(shù)器(例如,寄存器)設(shè)定到指示對(duì)應(yīng)于將由所去活線程執(zhí)行的下一指令的程序計(jì)數(shù)器值的值。如果線程有效,那么所述線程的恢復(fù)計(jì)數(shù)器可設(shè)定到默認(rèn)值。在一些實(shí)例中,默認(rèn)值可為對(duì)應(yīng)于大于程序的地址范圍的值的“無(wú)限值”(例如,最大寄存器值)。每次程序計(jì)數(shù)器寄存器加載有新的程序計(jì)數(shù)器值時(shí),可執(zhí)行恢復(fù)檢查操作,所述恢復(fù)檢查操作可再激活其中線程的恢復(fù)計(jì)數(shù)器值等于所述新的程序計(jì)數(shù)器值的任何線程。為確保在使用上述基于恢復(fù)計(jì)數(shù)器的方法來(lái)用于線程再激活的處理系統(tǒng)中維持恰當(dāng)?shù)目刂屏?,處理系統(tǒng)可使用“最小值地址優(yōu)先”線程處理次序。一般來(lái)說(shuō),“最小值地址優(yōu)先”線程處理次序可指以下次序:經(jīng)調(diào)度以處理較低值地址處的指令的線程是在經(jīng)調(diào)度以處理較高值地址處的指令的線程之前執(zhí)行的。此處理次序可防止控制流在不首先再激活無(wú)效線程的情況下針對(duì)此些線程而跳過(guò)任何恢復(fù)點(diǎn)。換句話說(shuō),此處理次序可確保所有線程將有效且到最后一個(gè)程序語(yǔ)句已完成執(zhí)行的時(shí)間為止將已完成處理?!白钚≈档刂穬?yōu)先”線程處理次序可基于發(fā)散分支指令的方向(即,向前或向后)來(lái)區(qū)分什么線程響應(yīng)于所述分支指令而被去活。對(duì)于發(fā)散向后分支指令來(lái)說(shuō),本發(fā)明的技術(shù)可去活分支指令不被滿足所針對(duì)的線程,將正去活的每一線程的恢復(fù)計(jì)數(shù)器值設(shè)定到與在所述分支指令之后發(fā)生的下一順序指令相關(guān)聯(lián)的值,使程序計(jì)數(shù)器加載有與由所述分支指令指定的目標(biāo)指令相關(guān)聯(lián)的值,且著手執(zhí)行分支條件被滿足所針對(duì)的那些線程。對(duì)于發(fā)散向前分支指令來(lái)說(shuō),本發(fā)明的技術(shù)可去活分支指令被滿足所針對(duì)的線程,將正去活的每一線程的恢復(fù)計(jì)數(shù)器值設(shè)定到與由所述分支指令指定的目標(biāo)指令相關(guān)聯(lián)的值,使程序計(jì)數(shù)器加載有與在所述分支指令之后發(fā)生的下一順序指令相關(guān)聯(lián)的值,且著手執(zhí)行分支條件不被滿足所針對(duì)的那些線程。這樣去活線程確保經(jīng)調(diào)度以處理較低值地址處的指令的發(fā)散線程是在經(jīng)調(diào)度以處理較高值地址處的指令的線程之前執(zhí)行的(即,“最小值地址優(yōu)先”線程處理次序)。在其中一或多個(gè)線程業(yè)已被去活且剩余有效線程執(zhí)行向前跳躍指令或一致滿足的向前分支指令(即,其中針對(duì)所有有效線程而一致滿足分支條件的向前分支指令)的情況下,一種用以處置控制流的方法可為總是跳躍到向前跳躍或向前分支指令中所指定的目標(biāo)指令,因?yàn)樗杏行Ь€程將保持有效。然而,此方法不保證“最小值地址優(yōu)先”線程處理次序。特別地說(shuō),在一些情況下,一或多個(gè)無(wú)效線程可具有在跳躍或分支指令的當(dāng)前程序計(jì)數(shù)器值與目標(biāo)程序計(jì)數(shù)器值(即,與分支或跳躍指令中所指定的目標(biāo)指令相關(guān)聯(lián)的程序計(jì)數(shù)器值)之間的恢復(fù)計(jì)數(shù)器值。如果控制流將跳過(guò)此些無(wú)效線程,那么有可能在完成程序的執(zhí)行之前將不再激活此些線程。為避免此情形,可使用全局MINRC,其存儲(chǔ)指示來(lái)自對(duì)應(yīng)于系統(tǒng)中的所有線程的一組恢復(fù)計(jì)數(shù)器值的最小恢復(fù)計(jì)數(shù)器值的值。當(dāng)所述恢復(fù)計(jì)數(shù)器中的任一者設(shè)定到新值時(shí)(例如,在去活線程后即刻),可更新MINRC以反映新的最小恢復(fù)計(jì)數(shù)器值。處理系統(tǒng)可使用MINRC來(lái)確定在當(dāng)前執(zhí)行的向前跳躍或向前分支指令與指令中所指定的目標(biāo)指令之間是否存在任何恢復(fù)點(diǎn),所述確定反過(guò)來(lái)可用于確定處理系統(tǒng)是否可直接跳躍到目標(biāo)指令而不致使系統(tǒng)針對(duì)無(wú)效線程而略過(guò)一或多個(gè)恢復(fù)點(diǎn)。舉例來(lái)說(shuō),當(dāng)執(zhí)行得到一致滿足的向前跳躍指令或向前分支指令時(shí),處理系統(tǒng)可比較由跳躍或分支指令所指定的目標(biāo)程序計(jì)數(shù)器值與MINRC值且基于所述比較來(lái)選擇將加載到程序計(jì)數(shù)器中的目標(biāo)程序計(jì)數(shù)器值或MINRC值。當(dāng)目標(biāo)程序計(jì)數(shù)器值小于或等于MINRC值時(shí),處理系統(tǒng)可將目標(biāo)程序計(jì)數(shù)器值選擇為將加載到程序計(jì)數(shù)器中的值。當(dāng)目標(biāo)程序計(jì)數(shù)器值不小于或等于MINRC值時(shí),處理系統(tǒng)可將MINRC選擇為將加載到程序計(jì)數(shù)器中的值。由于MINRC值指示所有無(wú)效線程的最小恢復(fù)計(jì)數(shù)器值,所以以上述方式執(zhí)行向前跳躍及一致的向前分支將確??刂屏鞑会槍?duì)任何無(wú)效線程而略過(guò)恢復(fù)點(diǎn)。這樣,MINRC可用于當(dāng)在使用恢復(fù)計(jì)數(shù)器以控制對(duì)所去活線程的再激活的處理系統(tǒng)中執(zhí)行向前跳躍和向前分支指令時(shí)確保恰當(dāng)控制流。用于確保向前跳躍和向前分支指令的恰當(dāng)控制流的基于MINRC的方法也可比可用于相同目的的其它技術(shù)更有效。舉例來(lái)說(shuō),用于確保恰當(dāng)控制流的另一技術(shù)可涉及每當(dāng)執(zhí)行向前跳躍指令或一致滿足的向前分支指令時(shí)去活所有線程且順序地遞增程序計(jì)數(shù)器貫穿在當(dāng)前程序計(jì)算器值與目標(biāo)程序計(jì)數(shù)器值之間的每一程序計(jì)數(shù)器值以使得在執(zhí)行目標(biāo)指令之前恰當(dāng)?shù)卦偌せ畈?zhí)行具有在當(dāng)前程序計(jì)數(shù)器值與目標(biāo)程序計(jì)數(shù)器值之間的恢復(fù)計(jì)數(shù)器值的任何無(wú)效線程。雖然此方法可保證“最小值地址優(yōu)先”線程處理次序,但此方法的效率不及基于MINRC的方法。舉例來(lái)說(shuō),在一些情況下,所有無(wú)效線程的恢復(fù)計(jì)數(shù)器在可大于或等于與在爭(zhēng)論中的向前跳躍或分支指令相關(guān)聯(lián)的目標(biāo)程序計(jì)數(shù)器值。在此情形中順序地遍歷在當(dāng)前指令與目標(biāo)指令之間的每一程序計(jì)數(shù)器值可歸因于其中不發(fā)生任何線程的執(zhí)行的浪費(fèi)的休眠指令周期而效率低下。基于MINRC的方法可響應(yīng)于處理向前跳躍指令或一致滿足的向前分支指令而將目標(biāo)程序計(jì)數(shù)器值或MINRC值直接加載到程序計(jì)數(shù)器中,而非順序地遍歷在當(dāng)前指令與目標(biāo)指令之間的每一程序計(jì)數(shù)器值。這允許在下一指令周期期間處理下一指令而無(wú)需具有在當(dāng)前指令的執(zhí)行與下一指令之間的額外休眠指令周期。通過(guò)允許在下一指令周期處理下一指令,控制流的基于MINRC的方法可相對(duì)于不使用MINRC的基于恢復(fù)計(jì)數(shù)器的系統(tǒng)來(lái)改善向前跳躍和向前分支指令的性能。然而,使用單一全局MINRC值的一個(gè)缺陷是此值可能自己本身并不適合確保用于包含子例程的程序的恰當(dāng)控制流。如果程序包含子例程,那么有可能全局MINRC值可指向位于當(dāng)前正執(zhí)行的子例程的程序空間外部的程序計(jì)數(shù)器值。舉例來(lái)說(shuō),一或多個(gè)線程可能已經(jīng)在主程序模塊中去活,且MINRC可已經(jīng)被設(shè)定到主程序空間中的對(duì)應(yīng)于將由此些線程執(zhí)行的下一指令的程序計(jì)數(shù)器值。在在主程序空間(其中所去活線程經(jīng)調(diào)度以再激活)中的程序計(jì)數(shù)器值下執(zhí)行指令之前,剩余有效線程可開(kāi)始執(zhí)行子例程。如果在所述子例程期間執(zhí)行向前跳躍或向前分支指令,那么有可能MINRC值可仍指向主程序空間中的程序計(jì)數(shù)器值,所述程序計(jì)數(shù)器值是在所述子例程的程序空間的外部。這可致使控制流跳出子例程且返回到在返回指令外部的主程序。一般來(lái)說(shuō),使用專(zhuān)用調(diào)用指令和返回指令以在執(zhí)行程序期間在主程序與子例程之間或在不同子例程之間轉(zhuǎn)移控制流。這些指令允許在將控制轉(zhuǎn)移到另一程序模塊之前保存一個(gè)程序模塊(即,主程序或子例程)的系統(tǒng)狀態(tài)且在先前保存了另一程序模塊的系統(tǒng)狀態(tài)的情況下將它還原。如上述實(shí)例中所描述,致使控制流跳出子例程且返回到在調(diào)用指令或返回指令外部的主程序中可致使系統(tǒng)以不明確的狀態(tài)操作。因此,雖然單一全局MINRC可能夠改善在使用恢復(fù)計(jì)數(shù)器的系統(tǒng)中的向前分支和向前跳躍指令的性能,但全局MINRC獨(dú)自可不能夠充分支持執(zhí)行程序內(nèi)的子例程。本發(fā)明描述用于在使用基于MINRC的控制流技術(shù)的處理系統(tǒng)中執(zhí)行子例程的技術(shù)。用于執(zhí)行子例程的技術(shù)可包含維持一或多個(gè)程序模塊特定型MINRC。每一程序模塊特定型MINRC可對(duì)應(yīng)于將執(zhí)行的程序的特定程序模塊,且指示來(lái)自一組一或多個(gè)恢復(fù)計(jì)數(shù)器值的最小恢復(fù)計(jì)數(shù)器值,所述一組一或多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)當(dāng)前執(zhí)行的程序模塊的執(zhí)行時(shí)為有效的所有線程。通過(guò)將獨(dú)立的MINRC用于主程序和用于子例程中的每一者,處理系統(tǒng)可確保子例程不從子例程分支到主程序中或分支到不在調(diào)用或返回指令的執(zhí)行范圍中的另一子例程中。這樣,可在使用基于MINRC的方法來(lái)控制對(duì)向前跳躍指令和向前分支指令的執(zhí)行的處理系統(tǒng)中確保用于執(zhí)行子例程的恰當(dāng)控制流。用于管理發(fā)散線程的其它技術(shù)可包含使用堆棧來(lái)存儲(chǔ)同步化令牌和發(fā)散令牌及使用軟件觸發(fā)的線程再激活系統(tǒng)來(lái)控制對(duì)所去活線程的再激活。舉例來(lái)說(shuō),每次發(fā)生考慮到發(fā)散的分支指令時(shí),便可將同步化令牌推入到指示在最初遇到分支指令時(shí)為有效的線程的堆棧上。如果分支指令為發(fā)散分支指令,那么系統(tǒng)可將發(fā)散令牌推入到指示未采取分支的線程的堆棧和對(duì)應(yīng)于用于未采取分支的線程的下一指令的程序計(jì)數(shù)器值上。系統(tǒng)可繼續(xù)執(zhí)行采取分支的剩余線程直到遇到命令系統(tǒng)從堆棧拿走發(fā)散令牌的專(zhuān)用軟件旗標(biāo)和/或軟件指令為止。響應(yīng)于從堆棧拿走發(fā)散令牌,系統(tǒng)可著手去活采取分支的線程,且再激活并執(zhí)行未采取分支的線程。系統(tǒng)可繼續(xù)執(zhí)行未采取分支的剩余線程直到遇到命令系統(tǒng)從堆棧拿走同步化令牌的專(zhuān)用軟件旗標(biāo)和/或軟件指令為止。響應(yīng)于從堆棧拿走同步化令牌,系統(tǒng)可著手再激活線程以使得線程狀態(tài)與在最初遇到發(fā)散分支指令時(shí)相同。然而,此方法的一個(gè)缺陷是需要特殊軟件指令以便控制對(duì)線程的再激活。此外,由于此方法在每次發(fā)生發(fā)散分支時(shí)將條目放置在堆棧中,所以系統(tǒng)可處置的嵌套發(fā)散分支的數(shù)目基于堆棧的大小而受限制。嵌套發(fā)散分支可指在執(zhí)行另一發(fā)散分支指令的已采取路徑或不采取路徑期間發(fā)生的發(fā)散分支。即,嵌套發(fā)散分支為在一或多個(gè)線程歸因于先前發(fā)生的發(fā)散分支指令而業(yè)已去活且此些線程尚未被再激活時(shí)發(fā)生的發(fā)散分支。和上文所描述的用于再激活發(fā)散線程的軟件觸發(fā)、基于堆棧的方法形成對(duì)比,不必需要專(zhuān)用軟件指令以實(shí)施本發(fā)明的基于恢復(fù)計(jì)數(shù)器的方法。相反,在一些實(shí)例中,可在每一指令周期執(zhí)行恢復(fù)檢查以確定任何所去活線程是否經(jīng)調(diào)度以針對(duì)那個(gè)周期而再激活。此可允許隱藏去活和再激活發(fā)散線程的方式而使程式設(shè)計(jì)師和/或編譯者不可見(jiàn)且允許程式設(shè)計(jì)師和/或編譯者產(chǎn)生可在經(jīng)設(shè)計(jì)以處理發(fā)散線程的并行系統(tǒng)與未經(jīng)設(shè)計(jì)成處理發(fā)散線程的非并行系統(tǒng)兩者上執(zhí)行一組單一可執(zhí)行代碼。另外,基于恢復(fù)計(jì)數(shù)器的方法能夠執(zhí)行最初設(shè)計(jì)用于非并行系統(tǒng)的代碼而無(wú)需重新編譯和/或重寫(xiě)舊代碼以實(shí)現(xiàn)發(fā)散線程處置。此外,由于基于恢復(fù)計(jì)數(shù)器的方法使用一組有限的恢復(fù)計(jì)數(shù)器(與堆棧相反)來(lái)控制對(duì)所去活線程的再激活,所以此方法可處置的嵌套發(fā)散分支的數(shù)目在概念上是無(wú)限的且并不基于堆棧的大小而受限制。在一些實(shí)例中,應(yīng)注意,本發(fā)明的技術(shù)可使用堆棧來(lái)存儲(chǔ)MINRC值。然而,MINRC值是響應(yīng)于子例程調(diào)用指令和返回指令而不是響應(yīng)于發(fā)散分支本身而被推入到此堆棧上和拿離此堆棧。因此,即使MINRC堆??捎糜趯?shí)施本發(fā)明的技術(shù),此堆棧仍不限制可發(fā)生在此系統(tǒng)中的嵌套發(fā)散分支的數(shù)目。圖1是說(shuō)明可用于實(shí)施本發(fā)明的子例程執(zhí)行技術(shù)的實(shí)例處理系統(tǒng)10的框圖。處理系統(tǒng)10經(jīng)配置成以并行方式執(zhí)行程序的指令。處理系統(tǒng)10包含控制單元12、處理元件14A-14D(共同地稱(chēng)為“處理元件14”)、指令存儲(chǔ)器16、數(shù)據(jù)存儲(chǔ)器18和通信路徑20、22、24、26A-26D。通信路徑26A-26D可共同地稱(chēng)為“通信路徑26”。處理系統(tǒng)10可實(shí)施于個(gè)人計(jì)算機(jī)、臺(tái)式計(jì)算機(jī)、膝上型計(jì)算機(jī)、計(jì)算機(jī)工作站、平板計(jì)算裝置、視頻游戲平臺(tái)或控制臺(tái)、無(wú)線通信裝置(例如(例如)所謂的智能電話、移動(dòng)電話、蜂窩式電話、衛(wèi)星電話和/或移動(dòng)電話手機(jī))、固定電話、因特網(wǎng)電話、例如便攜式視頻游戲裝置或個(gè)人數(shù)字助理(PDA)的手持式裝置、個(gè)人音樂(lè)播放器、視頻播放器、顯示裝置、電視、電視機(jī)頂盒、服務(wù)器、中間網(wǎng)絡(luò)裝置、主計(jì)算機(jī)、處理和/或顯示圖形數(shù)據(jù)的任何其它類(lèi)型的裝置,或執(zhí)行計(jì)算的任何類(lèi)型的裝置在一些實(shí)例中,控制單元12和處理元件14可為形成可編程處理器或可編程處理器的部分的硬件組件。舉例來(lái)說(shuō),控制單元12和處理單元14可一同形成圖形處理單元(GPU)或GPU的一部分。在一些實(shí)例中,處理系統(tǒng)10可為經(jīng)配置以使用處理元件14來(lái)執(zhí)行程序的多個(gè)執(zhí)行線程的單指令多數(shù)據(jù)(SIMD)處理系統(tǒng)。在此SIMD系統(tǒng)中,處理元件14可關(guān)于不同數(shù)據(jù)項(xiàng)而一次一同處理單一指令。程序可在與所述程序相關(guān)聯(lián)的所有線程完成執(zhí)行之后引退??刂茊卧?2經(jīng)配置以控制處理系統(tǒng)10執(zhí)行用于存儲(chǔ)于指令存儲(chǔ)器16中的程序的指令。對(duì)于程序的每一指令來(lái)說(shuō),控制單元12可經(jīng)由通信路徑20從指令存儲(chǔ)器16檢索指令,且處理所述指令。在一些實(shí)例中,控制單元12可通過(guò)致使在處理元件14中的一或多者上執(zhí)行與指令相關(guān)聯(lián)的操作來(lái)處理指令。舉例來(lái)說(shuō),由控制單元12檢索的指令可為命令處理系統(tǒng)10關(guān)于由指令指定的數(shù)據(jù)項(xiàng)執(zhí)行算術(shù)運(yùn)算的算術(shù)指令,且控制單元12可致使處理元件14中的一或多者對(duì)指定的數(shù)據(jù)項(xiàng)執(zhí)行算術(shù)運(yùn)算。在另外的實(shí)例中,控制單元12可在不致使對(duì)處理元件14執(zhí)行操作的情況下處理指令??刂茊卧?2可通過(guò)經(jīng)由通信路徑22提供指令到處理元件14來(lái)致使對(duì)處理元件14中的一或多者執(zhí)行操作。所述指令可指定將由處理元件14執(zhí)行的操作。提供到處理元件14中的一或多者的指令可與從指令存儲(chǔ)器16檢索的指令相同或不同。在一些實(shí)例中,控制單元12可通過(guò)以下步驟中的一者或兩者來(lái)致使對(duì)處理元件14的特定子集執(zhí)行操作:激活應(yīng)對(duì)其執(zhí)行操作的處理元件14的特定子集;以及去活不應(yīng)對(duì)其執(zhí)行操作的處理元件14的另一子集。控制單元12可通過(guò)經(jīng)由通信路徑22提供相應(yīng)激活和/或去活信號(hào)到處理元件14中的每一者來(lái)激活和/或去活處理元件14。在一些實(shí)例中,控制單元12可通過(guò)提供激活和/或去活信號(hào)到處理元件14結(jié)合提供指令到處理元件14來(lái)激活和/或去活處理元件14。在另外的實(shí)例中,控制單元12可在提供指令到處理元件14之前激活和/或去活處理元件14??刂茊卧?2可使用處理元件14來(lái)執(zhí)行程序的多個(gè)執(zhí)行線程。處理元件14中的每一者可經(jīng)配置以針對(duì)多個(gè)線程中的相應(yīng)線程來(lái)處理程序的指令。舉例來(lái)說(shuō),控制單元12可將每一執(zhí)行線程指派給處理元件14中的個(gè)別者以供處理。程序的不同執(zhí)行線程可關(guān)于一組數(shù)據(jù)項(xiàng)中的不同數(shù)據(jù)項(xiàng)而執(zhí)行一組相同指令。舉例來(lái)說(shuō),處理元件14A可關(guān)于多個(gè)數(shù)據(jù)項(xiàng)中的數(shù)據(jù)項(xiàng)的第一子集來(lái)執(zhí)行存儲(chǔ)于指令存儲(chǔ)器16中的程序的第一執(zhí)行線程,且處理元件14B可關(guān)于多個(gè)數(shù)據(jù)項(xiàng)中的數(shù)據(jù)項(xiàng)的第二子集來(lái)執(zhí)行存儲(chǔ)于指令存儲(chǔ)器16中的程序的第二執(zhí)行線程。第一執(zhí)行線程可不同于第二執(zhí)行線程,且數(shù)據(jù)項(xiàng)的第一子集可不同于數(shù)據(jù)項(xiàng)的第二子集。在一些實(shí)例中,控制單元12可激活和去活多個(gè)執(zhí)行線程中的個(gè)別線程。當(dāng)控制單元12去活線程時(shí),控制單元12也可去活和/或停用經(jīng)指派以執(zhí)行所述線程的處理元件14A-14D。類(lèi)似地,當(dāng)控制單元12激活線程時(shí),控制單元12也可激活經(jīng)指派以執(zhí)行所述線程的處理元件14A-14D??刂茊卧?2可激活和去活一或多個(gè)線程的各種組合以幫助處置發(fā)散分支條件,如稍后在本發(fā)明中予以進(jìn)一步詳細(xì)闡釋。如本文中所使用,有效線程可指被激活且當(dāng)前經(jīng)配置成執(zhí)行程序的指令的線程。無(wú)效線程可指被去活且當(dāng)前經(jīng)配置成不執(zhí)行程序的指令的線程。對(duì)于在給定處理周期期間執(zhí)行于處理系統(tǒng)10中的多個(gè)線程來(lái)說(shuō),有效線程中的每一者可經(jīng)配置以處理由所述多個(gè)線程的全局程序計(jì)數(shù)器寄存器在所述處理周期期間識(shí)別的程序的指令。舉例來(lái)說(shuō),控制單元12可激活被指派給有效線程的處理元件14以便將此些處理元件14配置成在處理周期期間處理程序的指令。另一方面,無(wú)效線程中地每一者可經(jīng)配置成在處理周期期間不處理程序的指令。舉例來(lái)說(shuō),控制單元12可去活被指派給無(wú)效線程的處理元件14以將此些處理元件14配置成在處理周期期間不處理程序的指令。在一些實(shí)例中,指令處理周期可指在程序計(jì)數(shù)器的連續(xù)加載之間的時(shí)間間隔。舉例來(lái)說(shuō),指令處理周期可指在當(dāng)程序計(jì)數(shù)器加載有與第一指令相關(guān)聯(lián)的第一值時(shí)與當(dāng)程序計(jì)數(shù)器加載有與第二指令相關(guān)聯(lián)的第二值時(shí)之間的時(shí)間。第二指令可為由系統(tǒng)緊接在第一指令之后處理的指令。第一值和第二值可為相同或不同值,且第一指令和第二指令可為相同或不同指令。在一些實(shí)例中,指令處理周期可指在程序計(jì)數(shù)器的連續(xù)同步加載之間的時(shí)間間隔。在一些實(shí)例中,程序計(jì)數(shù)器的同步加載可指由時(shí)鐘信號(hào)觸發(fā)的加載。在本文中可將指令處理周期替代地稱(chēng)為指令周期或處理周期。在一些實(shí)例中,指令處理周期可對(duì)應(yīng)于一或多個(gè)時(shí)鐘周期。有時(shí)在處理下一指令之前,控制單元12確定將由處理系統(tǒng)10處理的下一指令??刂茊卧?2確定將處理的下一指令的方式取決于最近執(zhí)行的指令是否為控制流指令而不同。如果最近執(zhí)行的指令非為控制流指令,那么控制單元12可確定將由處理系統(tǒng)10處理的下一指令對(duì)應(yīng)于存儲(chǔ)于指令存儲(chǔ)器16中的下一順序指令。舉例來(lái)說(shuō),指令存儲(chǔ)器16可按有序序列來(lái)存儲(chǔ)程序的指令,且下一順序指令可為有序指令序列中的緊接在最近執(zhí)行的指令之后出現(xiàn)的指令。如果最近執(zhí)行的指令為控制流指令,那么控制單元12可基于控制流指令中指定的信息來(lái)確定將由處理系統(tǒng)10處理的下一指令。舉例來(lái)說(shuō),控制流指令可為無(wú)條件控制流指令(例如,無(wú)條件分支指令或跳躍指令),在所述情況下,控制單元12可確定將由處理系統(tǒng)10處理的下一指令為由控制流指令識(shí)別的目標(biāo)指令。作為另一實(shí)例,控制流指令可為條件性控制流指令(例如,條件性分支指令),在所述情況下,控制單元12可將由控制流指令識(shí)別的目標(biāo)指令或存儲(chǔ)于指令存儲(chǔ)器16中的下一順序指令中的一者選擇為將從指令存儲(chǔ)器16處理的下一指令。如本文中所使用,控制流指令可指指導(dǎo)控制單元12基于不同于無(wú)條件選擇下一順序指令的技術(shù)來(lái)確定將執(zhí)行的下一指令的指令。控制流指令可指定存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令。舉例來(lái)說(shuō),控制流指令可包含指示對(duì)應(yīng)于存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令的目標(biāo)程序計(jì)數(shù)器值的值。作為另一實(shí)例,控制流指令可通過(guò)指導(dǎo)控制單元12從堆棧存儲(chǔ)結(jié)構(gòu)拿走返回地址來(lái)指定目標(biāo)指令。返回地址可對(duì)應(yīng)于存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令。在一些實(shí)例中,目標(biāo)指令可不同于存儲(chǔ)于指令存儲(chǔ)器16中的下一順序指令。高級(jí)程序代碼可包含例如(例如)if、switch、do、for、while、continue、break和goto語(yǔ)句的控制流語(yǔ)句。編譯者可將高級(jí)控制流語(yǔ)句翻譯成低級(jí)(例如,機(jī)器級(jí))控制流指令。非為控制流指令的指令可在本文中稱(chēng)為順序指令。順序指令可指其中控制單元12必要地將下一順序指令選擇為將執(zhí)行的下一指令的指令。在一些實(shí)例中,順序指令可能不包含識(shí)別目標(biāo)指令的信息。對(duì)于控制流指令來(lái)說(shuō),識(shí)別目標(biāo)指令的信息可為指示存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令的值。在一些實(shí)例中,指示目標(biāo)指令的值可為指示對(duì)應(yīng)于存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令的指令地址的值。在一些情況下,指示指令地址的值可為存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令的地址。在額外情況下,指示指令地址的值可為用于計(jì)算目標(biāo)指令的地址的值。在另外的實(shí)例中,指示指令地址的值可為指示對(duì)應(yīng)于目標(biāo)指令的目標(biāo)程序計(jì)數(shù)器值的值。在一些情況下,指示目標(biāo)程序計(jì)數(shù)器值的值可為對(duì)應(yīng)于目標(biāo)指令的目標(biāo)程序計(jì)數(shù)器值。在額外情況下,指示目標(biāo)程序計(jì)數(shù)器值的值可為用于計(jì)算目標(biāo)程序計(jì)數(shù)器值的值。在一些實(shí)例中,對(duì)應(yīng)于目標(biāo)指令的目標(biāo)程序計(jì)數(shù)器值可等于存儲(chǔ)于指令存儲(chǔ)器16中的目標(biāo)指令的地址??刂屏髦噶羁蔀橄蚯翱刂屏髦噶罨蛳蚝罂刂屏髦噶???蓪⒖刂屏髦噶钍窍蚯靶瓦€是向后型的性質(zhì)稱(chēng)為控制流的方向。向前控制流指令可為其中在存儲(chǔ)于指令存儲(chǔ)器16中的有序指令序列中目標(biāo)指令出現(xiàn)在控制流指令之后的控制流指令。向后控制流指令可為其中在存儲(chǔ)于指令存儲(chǔ)器16中的有序指令序列中目標(biāo)指令出現(xiàn)在下一順序指令之前的控制流指令。在有序指令序列中,下一順序指令可緊接在控制流指令之后出現(xiàn)??刂屏髦噶羁蔀闂l件性控制流指令或無(wú)條件控制流指令。條件性控制流指令包含指定用于跳躍到與控制流指令相關(guān)聯(lián)的目標(biāo)指令的條件的信息。當(dāng)處理?xiàng)l件性控制流指令時(shí),如果控制單元12確定滿足條件,那么控制單元12可確定將處理的下一指令為目標(biāo)指令。另一方面,如果控制單元12確定不滿足條件,那么控制單元12可確定將處理的下一指令為存儲(chǔ)于指令存儲(chǔ)器16中的下一順序指令。無(wú)條件控制流指令不包含指定用于跳躍到與控制流指令相關(guān)聯(lián)的目標(biāo)指令的條件的信息。當(dāng)處理無(wú)條件控制流指令時(shí),控制單元12可無(wú)條件確定將處理的下一指令為由控制流指令識(shí)別的目標(biāo)指令。換句話說(shuō),此情況下的確定不以無(wú)條件控制流指令自身中指定的任何條件為條件。條件性控制流指令的實(shí)例包含條件性分支指令。本發(fā)明中對(duì)通用術(shù)語(yǔ)分支指令的使用通常指條件性分支指令,除非分支指令另外標(biāo)示為無(wú)條件分支指令。無(wú)條件控制流指令的實(shí)例包含跳躍指令、調(diào)用指令和返回指令。條件性分支指令可包含關(guān)于一或多個(gè)數(shù)據(jù)項(xiàng)值所指定的條件。舉例來(lái)說(shuō),一個(gè)類(lèi)型的條件可為針對(duì)執(zhí)行于處理系統(tǒng)10中的每一有效線程來(lái)比較第一數(shù)據(jù)項(xiàng)值與第二數(shù)據(jù)項(xiàng)值的比較條件。比較數(shù)據(jù)項(xiàng)值可包含例如確定第一數(shù)據(jù)項(xiàng)值是否大于、小于、不大于、等于或不等于第二數(shù)據(jù)項(xiàng)值。另一類(lèi)型的條件可為確定執(zhí)行于處理系統(tǒng)10中的每一有效線程的數(shù)據(jù)項(xiàng)值等于或不等于零的零檢查條件。由于處理元件14中的每一者對(duì)不同數(shù)據(jù)項(xiàng)產(chǎn)生作用,所以評(píng)估所述條件的結(jié)果對(duì)于執(zhí)行于處理系統(tǒng)10中的每一有效線程來(lái)說(shuō)可不同。如果執(zhí)行于處理系統(tǒng)10中的所有有效線程滿足分支條件或執(zhí)行于處理系統(tǒng)10中的所有有效線程不滿足分支條件,那么發(fā)生一致分支條件且分支指令的分支發(fā)散據(jù)稱(chēng)是一致的。另一方面,如果執(zhí)行于處理系統(tǒng)10中的有效線程中的至少一者滿足分支條件且執(zhí)行于處理系統(tǒng)10中的有效線程中的至少譯者不滿足分支條件,那么發(fā)生發(fā)散分支條件且分支指令的分支發(fā)散據(jù)稱(chēng)是發(fā)散的。執(zhí)行于處理系統(tǒng)10中的線程可以鎖步方式執(zhí)行相同指令。換句話說(shuō),處理元件14中的每一者可在處理周期期間針對(duì)所有有效線程執(zhí)行相同指令。然而,當(dāng)發(fā)生發(fā)散分支條件時(shí),滿足分支條件的線程可經(jīng)調(diào)度以執(zhí)行下一些指令,所述下一些指令不同于經(jīng)調(diào)度以由不滿足分支條件的線程執(zhí)行的下一些指令。此可妨礙處理系統(tǒng)10中的線程以鎖步方式執(zhí)行單一指令。為處理發(fā)散分支條件,在一些實(shí)例中,控制單元12可去活滿足或不滿足分支條件的線程的一個(gè)子集以使得剩余有效線程皆被同步化到相同程序計(jì)數(shù)器地址。為控制對(duì)線程的再激活,控制單元12可使用基于恢復(fù)計(jì)數(shù)器的方法,所述方法涉及:為執(zhí)行于處理系統(tǒng)中的每一線程分配恢復(fù)計(jì)數(shù)器;根據(jù)“最小值地址優(yōu)先”線程處理次序來(lái)處理發(fā)散線程;以及在執(zhí)行每一指令之前執(zhí)行恢復(fù)檢查操作。更具體來(lái)說(shuō),控制單元12可響應(yīng)于發(fā)散分支條件來(lái)去活一或多個(gè)線程,且針對(duì)正去活的每一線程而將相應(yīng)線程的恢復(fù)計(jì)數(shù)器(例如,寄存器)設(shè)定到指示相應(yīng)線程經(jīng)調(diào)度以再激活所處的程序計(jì)數(shù)器值的值。在一些實(shí)例中,相應(yīng)線程經(jīng)調(diào)度以再激活所處的程序計(jì)數(shù)器值可為對(duì)應(yīng)于將由所去活線程執(zhí)行的下一指令的程序計(jì)數(shù)器值。如果線程有效,那么所述線程的恢復(fù)計(jì)數(shù)器可設(shè)定到默認(rèn)值,所述默認(rèn)值可對(duì)應(yīng)于大于程序的地址范圍的值(例如,最大寄存器值)。每次程序計(jì)數(shù)器寄存器加載有新的程序計(jì)數(shù)器值時(shí),控制單元12可執(zhí)行恢復(fù)檢查操作,所述恢復(fù)檢查操作可再激活其中線程的恢復(fù)計(jì)數(shù)器值等于所述新的程序計(jì)數(shù)器值的任何線程。在一些實(shí)例中,恢復(fù)檢查操作可比較與每一所去活線程相關(guān)聯(lián)的恢復(fù)計(jì)數(shù)器值與新近加載的程序計(jì)數(shù)器值以確定所去活線程中的任一者是否經(jīng)調(diào)度以在執(zhí)行指令之前被再激活?!白钚≈档刂穬?yōu)先”線程處理次序可基于發(fā)散分支指令的方向(即,向前或向后)來(lái)區(qū)分什么線程響應(yīng)于所述分支指令而被去活。對(duì)于發(fā)散向后分支指令來(lái)說(shuō),控制單元12可去活分支條件不被滿足所針對(duì)的線程,將正去活的每一線程的恢復(fù)計(jì)數(shù)器值設(shè)定到與在所述分支指令之后出現(xiàn)的下一順序指令相關(guān)聯(lián)的值,使程序計(jì)數(shù)器加載有與由所述分支指令指定的目標(biāo)指令相關(guān)聯(lián)的值,且著手執(zhí)行分支條件被滿足所針對(duì)的那些線程。對(duì)于發(fā)散向前分支指令來(lái)說(shuō),控制單元12可去活分支條件被滿足所針對(duì)的線程,將正去活的每一線程的恢復(fù)計(jì)數(shù)器值設(shè)定到與由所述分支指令指定的目標(biāo)指令相關(guān)聯(lián)的值,使程序計(jì)數(shù)器加載有與在所述分支指令之后出現(xiàn)的下一順序指令相關(guān)聯(lián)的值,且著手執(zhí)行分支條件不被滿足所針對(duì)的那些線程。這樣去活線程確保經(jīng)調(diào)度以處理較低值地址處的指令的發(fā)散線程是在經(jīng)調(diào)度以處理較高值地址處的指令的線程之前執(zhí)行的(即,“最小值地址優(yōu)先”線程處理次序)。此處理次序可防止控制流在不再激活無(wú)效線程且永久地結(jié)束程序的情況下針對(duì)此些線程而跳過(guò)任何恢復(fù)點(diǎn)。換句話說(shuō),此處理次序確保所有線程將有效且到最后一個(gè)程序語(yǔ)句已完成執(zhí)行的時(shí)間為止將已完成處理。根據(jù)本發(fā)明,控制單元12可基于與程序相關(guān)聯(lián)的第一MINRC來(lái)控制對(duì)程序的執(zhí)行,且基于與程序的子例程相關(guān)聯(lián)的第二MINRC來(lái)控制對(duì)所述子例程的執(zhí)行。第一MINRC可指定指示多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值的值,所述多個(gè)恢復(fù)計(jì)數(shù)器值與執(zhí)行于處理系統(tǒng)10中的多個(gè)線程相關(guān)聯(lián)。第二MINRC可指定指示來(lái)自多個(gè)恢復(fù)計(jì)數(shù)器值的子集的最小恢復(fù)計(jì)數(shù)器值的值,所述子集應(yīng)于在起始對(duì)子例程的執(zhí)行時(shí)為有效的所有線程。在一些情況下,第一MINRC的多個(gè)恢復(fù)計(jì)數(shù)器值可對(duì)應(yīng)于在起始對(duì)程序的執(zhí)行時(shí)為有效的所有線程。在一些實(shí)例中,當(dāng)程序?yàn)轫敿?jí)程序(例如,主程序)時(shí),在起始程序時(shí)所有線程可為有效的。在此些實(shí)例中,第一MINRC可為與執(zhí)行于處理系統(tǒng)10中的所有線程相關(guān)聯(lián)的一組恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值。一般來(lái)說(shuō),控制單元12可基于多個(gè)MINRC來(lái)控制對(duì)處理系統(tǒng)10的執(zhí)行。每一MINRC可用于控制完整程序內(nèi)的特定程序模塊。如本文中所使用,程序模塊可指主程序模塊(即,在起始對(duì)程序的執(zhí)行時(shí)程序最初所執(zhí)行的程序模塊)和/或由主程序摸跨哦或另一子例程程序模塊調(diào)用的子例程程序模塊。在一些實(shí)例中,控制單元12可位置正執(zhí)行的當(dāng)前程序模塊的MINRC值,且基于對(duì)應(yīng)于當(dāng)前程序模塊的MINRC值來(lái)控制對(duì)當(dāng)前程序模塊的執(zhí)行。MINRC值可指示來(lái)自一組一或多個(gè)恢復(fù)計(jì)數(shù)器值中的最小恢復(fù)計(jì)數(shù)器值,所述一組一或多個(gè)恢復(fù)計(jì)數(shù)器值對(duì)應(yīng)于在起始對(duì)當(dāng)前程序模塊的執(zhí)行時(shí)為有效的所有線程。當(dāng)控制單元12切換到執(zhí)行不同程序模塊時(shí),控制單元12可切換用于控制對(duì)處理系統(tǒng)10的執(zhí)行的MINRC。舉例來(lái)說(shuō),如果控制單元12從執(zhí)行調(diào)用者程序模塊切換到執(zhí)行子例程程序模塊,那么控制單元12可將用于控制對(duì)處理系統(tǒng)10的執(zhí)行的MINRC從與調(diào)用者程序模塊相關(guān)聯(lián)的第一MINRC切換到與子例程模塊相關(guān)聯(lián)的第二MINRC。類(lèi)似地,在完成對(duì)子例程程序模塊的執(zhí)行之后,控制單元12可將用于控制對(duì)處理系統(tǒng)10的執(zhí)行的MINRC從與子例程模塊相關(guān)聯(lián)的第二MINRC切換到與調(diào)用者程序模塊相關(guān)聯(lián)的第一MINRC值。調(diào)用者程序模塊可為主程序模塊或子例程程序模塊。在一些實(shí)例中,基于特定MINRC來(lái)控制對(duì)程序模塊的執(zhí)行可包含基于那個(gè)特定MINRC來(lái)控制對(duì)包含于所述程序模塊中的向前控制流指令的執(zhí)行。舉例來(lái)說(shuō),響應(yīng)于執(zhí)行向前跳躍指令或其中滿足分支條件的向前條件性分支指令,控制單元12可基于MINRC值來(lái)確定將執(zhí)行的下一指令。舉例來(lái)說(shuō),控制單元12可比較由分支或跳躍指令指定的目標(biāo)程序計(jì)數(shù)器值與MINRC值且選擇目標(biāo)程序計(jì)數(shù)器值或MINRC值以加載到程序計(jì)數(shù)器中。在一個(gè)實(shí)例中,當(dāng)目標(biāo)程序計(jì)數(shù)器值小于或等于MINRC值時(shí),控制單元12可將目標(biāo)程序計(jì)數(shù)器值選擇為將加載到程序計(jì)數(shù)器中的值。在此實(shí)例中,當(dāng)目標(biāo)程序計(jì)數(shù)器值不小于或等于MINRC值時(shí),控制單元12可將MINRC值選擇為將加載到程序計(jì)數(shù)器中的值。將目標(biāo)程序計(jì)數(shù)器值或MINRC值加載到程序計(jì)數(shù)器中防止處理系統(tǒng)10歸因于遞增程序計(jì)數(shù)器貫穿其中不發(fā)生執(zhí)行的值而浪費(fèi)程序周期。此外,由于MINRC值指示所有無(wú)效線程的最小恢復(fù)計(jì)數(shù)器值,所以以上述方式執(zhí)行向前跳躍和一致向前分支將確??刂屏鞑惶^(guò)任何無(wú)效線程的恢復(fù)點(diǎn)。這樣,基于一或多個(gè)MINRC值來(lái)控制對(duì)處理系統(tǒng)10的執(zhí)行可改善在利用恢復(fù)計(jì)數(shù)器以用于發(fā)散線程處置的系統(tǒng)中的向前跳躍指令和向前分支指令的性能。根據(jù)本發(fā)明的一些方面,控制單元12可經(jīng)配置以切換MINRC,所述MINRC用于在進(jìn)入和/或退出子例程之后即刻控制對(duì)處理系統(tǒng)的執(zhí)行。舉例來(lái)說(shuō),響應(yīng)于執(zhí)行調(diào)用指令,控制單元12可經(jīng)配置以:保存對(duì)應(yīng)于調(diào)用者程序的第一IMNRC的狀態(tài);初始化對(duì)應(yīng)于子例程程序的第二MINRC;以及基于對(duì)應(yīng)于子例程程序的第二MINRC來(lái)控制對(duì)子例程的執(zhí)行。響應(yīng)于執(zhí)行返回指令,處理系統(tǒng)可經(jīng)配置以:還原對(duì)應(yīng)于調(diào)用者程序的第一MINRC的所保存狀態(tài);以及基于第一MINRC的所還原狀態(tài)來(lái)恢復(fù)控制對(duì)主程序的執(zhí)行。在一些實(shí)例中,控制單元12可至少部分地通過(guò)將存儲(chǔ)于第一MINRC的MINRC寄存器中的值推入到堆棧存儲(chǔ)結(jié)構(gòu)上來(lái)保存對(duì)應(yīng)于調(diào)用者程序的第一MINRC的狀態(tài)。在此些實(shí)例中,控制單元12可至少部分地通過(guò)從堆棧存儲(chǔ)結(jié)構(gòu)拿取第一MINRC的所保存狀態(tài)且用對(duì)應(yīng)于第一MINRC的所保存狀態(tài)的值來(lái)改寫(xiě)存儲(chǔ)于MINRC寄存器中的值而還原對(duì)應(yīng)于調(diào)用者程序的MINRC的所保存狀態(tài)。當(dāng)執(zhí)行調(diào)用指令時(shí),控制單元12可至少部分地通過(guò)將第二MINRC設(shè)定成等于默認(rèn)值(例如,最大寄存器值或大于程序的地址范圍的值)來(lái)初始化對(duì)應(yīng)于子例程程序的第二MINRC。當(dāng)處理系統(tǒng)10中的恢復(fù)計(jì)數(shù)器值中的任一者設(shè)定到新值時(shí),控制單元12可更新MINRC值以反映新的最小恢復(fù)計(jì)數(shù)器值。舉例來(lái)說(shuō),控制單元12可響應(yīng)于去活一或多個(gè)線程和/或響應(yīng)于執(zhí)行恢復(fù)檢查操作來(lái)更新MINRC值。根據(jù)本發(fā)明的一些方面,當(dāng)更新MINRC值時(shí),控制單元12可使用各種技術(shù)從用于更新與子例程相關(guān)聯(lián)的MINRC中排除與在起始對(duì)子例程的執(zhí)行時(shí)為無(wú)效的線程相關(guān)聯(lián)的恢復(fù)計(jì)數(shù)器值。通過(guò)在更新MINRC時(shí)排除此些恢復(fù)計(jì)數(shù)器值而不予考慮,本發(fā)明的技術(shù)可確保子例程特定型MINRC被更新到在與子例程相關(guān)聯(lián)的程序空間內(nèi)的值。在一些實(shí)例中,控制單元12可在MINRC更新期間從影響所得MINRC值中排除大于或等于子例程的進(jìn)入點(diǎn)的恢復(fù)計(jì)數(shù)器值。在另外的實(shí)例中,控制單元12可維持一組旗標(biāo),其中所述一組旗標(biāo)中的每一旗標(biāo)指示在起始對(duì)子例程的執(zhí)行時(shí)相應(yīng)線程是否有效。在此些實(shí)例中,控制單元12可在MINRC更新期間從影響所得MINRC值中排除在起始對(duì)子例程的執(zhí)行時(shí)為無(wú)效的恢復(fù)計(jì)數(shù)器值??刂茊卧?2經(jīng)由通信路徑20通信地耦合到指令存儲(chǔ)器16,經(jīng)由通信路徑22通信地耦合到處理元件14,且經(jīng)由通信路徑24通信地耦合到數(shù)據(jù)存儲(chǔ)器18??刂茊卧?2可使用通信路徑20來(lái)發(fā)送讀指令到指令存儲(chǔ)器16。讀指令可指定在指令存儲(chǔ)器16中的指令地址,應(yīng)從所述指令地址檢索指令??刂茊卧?2可響應(yīng)于發(fā)送讀指令而從指令存儲(chǔ)器16接收一或多個(gè)程序指令??刂茊卧?2可使用通信路徑22來(lái)提供指令到處理元件14,且在一些實(shí)例中從處理元件14接收數(shù)據(jù)(例如,用于評(píng)估分支條件的比較指令的結(jié)果)。在一些實(shí)例中,控制單元12可使用通信路徑24來(lái)直接從數(shù)據(jù)存儲(chǔ)器18檢索數(shù)據(jù)項(xiàng)值(例如,以評(píng)估分支條件)。雖然圖1將處理系統(tǒng)10說(shuō)明為包含通信路徑24,但在其它實(shí)例中,處理系統(tǒng)10可不包含通信路徑24。處理元件14中的每一者可經(jīng)配置以執(zhí)行操作從而幫助處理系統(tǒng)10處理存儲(chǔ)于指令存儲(chǔ)器16中的程序的指令。在一些實(shí)例中,處理元件14中的每一者可經(jīng)配置以執(zhí)行一組相同操作。舉例來(lái)說(shuō),處理元件14中的每一者可實(shí)施相同指令集架構(gòu)(ISA)。在額外實(shí)例中,處理元件14中的每一者可為算術(shù)邏輯單元(ALU)。在另外的實(shí)例中,處理系統(tǒng)10可為向量處理器(例如,圖形處理單元(GPU)向量處理器),且處理元件14中的每一者可為向量處理器內(nèi)的處理元件。在額外實(shí)例中,處理系統(tǒng)10可為SIMD執(zhí)行單元,且處理元件14中的每一者可為SIMD執(zhí)行單元內(nèi)的SIMD處理元件。由處理元件14執(zhí)行的操作可包含算術(shù)運(yùn)算、邏輯運(yùn)算、比較運(yùn)算等。算術(shù)運(yùn)算可包含例如(例如)加法運(yùn)算、減法運(yùn)算、乘法運(yùn)算、除法運(yùn)算等的運(yùn)算。算術(shù)運(yùn)算也可包含例如整數(shù)算術(shù)運(yùn)算和/或浮點(diǎn)算術(shù)運(yùn)算。邏輯運(yùn)算可包含例如(例如)逐位AND運(yùn)算、逐位OR運(yùn)算、逐位XOR運(yùn)算等的運(yùn)算。比較運(yùn)算可包含例如(例如)大于運(yùn)算、小于運(yùn)算、等于零運(yùn)算、不等于零運(yùn)算等的運(yùn)算。大于和小于運(yùn)算可確定第一數(shù)據(jù)項(xiàng)大于還是小于第二數(shù)據(jù)項(xiàng)。等于零和不等于零運(yùn)算可確定數(shù)據(jù)項(xiàng)等于零還是不等于零。用于運(yùn)算的操作數(shù)可存儲(chǔ)于數(shù)據(jù)存儲(chǔ)器18中含有的寄存器中。處理元件14中的每一者可經(jīng)配置以響應(yīng)于經(jīng)由通信路徑22從控制單元12接收指令來(lái)執(zhí)行操作。在一些實(shí)例中,處理元件14中的每一者可經(jīng)配置以獨(dú)立于其它處理元件14而被激活和/或去活。在此些實(shí)例中,處理元件14中的每一者可經(jīng)配置以在相應(yīng)處理元件14A-14D被激活時(shí)響應(yīng)于從控制單元12接收指令來(lái)執(zhí)行操作,且在相應(yīng)處理元件14A-14D被去活(即,未激活)時(shí)響應(yīng)于從控制單元12接收指令不執(zhí)行操作。處理元件14A-14D中的每一者可經(jīng)由相應(yīng)通信路徑26A-26D通信地耦合到數(shù)據(jù)存儲(chǔ)器18。處理元件14可經(jīng)配置以經(jīng)由通信路徑26從數(shù)據(jù)存儲(chǔ)器18檢索數(shù)據(jù)及將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)存儲(chǔ)器18。在一些實(shí)例中,從數(shù)據(jù)存儲(chǔ)器18檢索的數(shù)據(jù)可為用于由處理單元14執(zhí)行的運(yùn)算的操作數(shù)。在一些實(shí)例中,存儲(chǔ)到數(shù)據(jù)存儲(chǔ)器18的數(shù)據(jù)可為由處理元件14執(zhí)行的運(yùn)算的結(jié)果。指令存儲(chǔ)器16經(jīng)配置以存儲(chǔ)供由處理系統(tǒng)10執(zhí)行的程序。所述程序可存儲(chǔ)為有序指令序列。在一些實(shí)例中,可由唯一指令地址來(lái)尋址每一指令。在此些實(shí)例中,指令序列中的較遲指令的指令地址大于指令序列中的較早指令的指令地址。在一些實(shí)例中,程序指令可為機(jī)器級(jí)指令。即,在此些實(shí)例中,指令可呈對(duì)應(yīng)于處理系統(tǒng)10的ISA的格式。指令存儲(chǔ)器16經(jīng)配置以經(jīng)由通信路徑20從控制單元12接收讀指令。讀指令可指定指令地址,應(yīng)從所述指令地址檢索指令。響應(yīng)于接收讀指令,指令存儲(chǔ)器16可經(jīng)由通信路徑20提供對(duì)應(yīng)于讀指令中指定的指令地址的指令到控制單元12。指令存儲(chǔ)器16可為任何類(lèi)型的存儲(chǔ)器、高速緩沖存儲(chǔ)器或其組合。當(dāng)指令存儲(chǔ)器16為高速緩沖存儲(chǔ)器時(shí),指令存儲(chǔ)器16可高速緩沖存儲(chǔ)與存儲(chǔ)于在處理系統(tǒng)10外部的程序存儲(chǔ)器中的程序相關(guān)聯(lián)的指令。雖然將指令存儲(chǔ)器16說(shuō)明為在處理系統(tǒng)10內(nèi),但在其它實(shí)例中,指令存儲(chǔ)器16可在處理系統(tǒng)10外部。數(shù)據(jù)存儲(chǔ)器18經(jīng)配置以存儲(chǔ)由處理元件14使用的數(shù)據(jù)項(xiàng)。在一些實(shí)例中,數(shù)據(jù)存儲(chǔ)器18可包括多個(gè)寄存器,每一寄存器經(jīng)配置以存儲(chǔ)由處理系統(tǒng)10操作的多個(gè)數(shù)據(jù)項(xiàng)內(nèi)的相應(yīng)數(shù)據(jù)項(xiàng)。數(shù)據(jù)存儲(chǔ)器18可耦合到一或多個(gè)通信路徑(未圖示),所述一或多個(gè)通信路徑經(jīng)配置以在數(shù)據(jù)存儲(chǔ)器18中的寄存器與存儲(chǔ)器或高速緩沖存儲(chǔ)器(未圖示)之間轉(zhuǎn)移數(shù)據(jù)。通信路徑20、22、24、26可經(jīng)配置以在處理系統(tǒng)10中的不同組件之間提供信號(hào)、指令和/或數(shù)據(jù)的傳達(dá),如圖1中所說(shuō)明。舉例來(lái)說(shuō),通信路徑20、22、24、26可各自實(shí)施為在圖1中所示的不同組件之間載運(yùn)電信號(hào)的一或多個(gè)總線(例如,芯片上總線)和/或電互連件(例如,導(dǎo)線和/或電路跡線)。雖然圖1說(shuō)明用于存儲(chǔ)由處理元件14使用的數(shù)據(jù)的單一數(shù)據(jù)存儲(chǔ)器18,但在其它實(shí)例中,處理系統(tǒng)10可包含用于處理元件14中的每一者的獨(dú)立、專(zhuān)用數(shù)據(jù)存儲(chǔ)器。出于示范目的,圖1說(shuō)明具有四個(gè)處理元件14的處理系統(tǒng)10。然而,在其它實(shí)例中,處理系統(tǒng)10可在相同或不同配置中具有相同或不同數(shù)目個(gè)處理元件1...