具有無阻塞并行架構(gòu)的圖形處理器相關(guān)申請的交叉引用本申請要求2011年6月16日提交的美國臨時專利申請?zhí)?1/497,915的優(yōu)先權(quán),出于所有目的,該申請通過引用以其全文結(jié)合于此。技術(shù)領(lǐng)域以下內(nèi)容總體上涉及并行處理資源的利用,并且在一個更具體方面涉及可以在不同種類的并行計算問題中使用的編程接口和架構(gòu),并且具體地涉及圖形處理,包括光線追蹤。
背景技術(shù):計算機架構(gòu)謀求在硬件級和軟件/操作系統(tǒng)級上提高并行度。已經(jīng)提出了各種技術(shù)來解決硬件和軟件的并行度。一個普遍概念是將多線程處理用作一種提高并行度的機制。關(guān)于基于軟件的多線程處理,操作系統(tǒng)可以通過在時間上使多個進程的執(zhí)行交錯來在單個硬件執(zhí)行資源上并發(fā)地執(zhí)行多個進程(典型地,多個獨立程序)。可以通過OS內(nèi)核完成這種交錯,OS內(nèi)核確定什么進程具有優(yōu)先級,并且還可以訪問其繼續(xù)進行執(zhí)行所需要的資源。當(dāng)一個進程具有兩個或更多個半獨立子任務(wù)時,多線程處理可以提高吞吐量,給出更好的響應(yīng)時間,加速操作,改進程序結(jié)構(gòu),使用更少的系統(tǒng)資源,并且更加高效地利用多個多處理器。使用多線程處理的情況下,一個進程具有多個控制線程。隨著用于處理器的更快的時鐘變得功耗過分高,并且晶體管預(yù)算用在更廣的架構(gòu)上,多線程計算的概念越來越常見。如此,已經(jīng)越來越多地使用術(shù)語“線程”,但其不總是用來指相同概念,而是使用的背景可以告知該術(shù)語的意義。一個進程可以被視作一個可以被執(zhí)行的單獨的程序或應(yīng)用程序。如此,一個進程具有一個有待執(zhí)行的指令序列。一個線程也具有用于執(zhí)行的一個指令序列,但典型地更細(xì)化。例如,一個函數(shù)可以代表一個線程的指令序列。如果被進程實例化,則線程共享該進程的地址空間,還可以在該進程內(nèi)擁有多個唯一的資源??梢詥为毜卣{(diào)度來自每個線程的指令,這允許按照資源可用性所指示的,并發(fā)地執(zhí)行一個進程的多個線程??梢酝ㄟ^一個創(chuàng)建進程來管理多個線程并且這些線程對操作系統(tǒng)的內(nèi)核是不可見的(也被稱為用戶級或應(yīng)用級線程)。在用戶空間中處理用戶線程,并且使用程序庫中提供的線程API對用戶線程進行控制。這種控制包括如創(chuàng)建、終止、同步、調(diào)度等操作。可以使用用戶空間線程執(zhí)行創(chuàng)建、終止和同步操作。因為用戶空間線程對內(nèi)核(其只意識到包含用戶空間線程的基本(overriding)進程)不直接可見,如果用戶空間線程阻塞,則其整個進程阻塞。當(dāng)這種情況發(fā)生時,失去或減少了線程并行度的益處??梢砸敫郊拥膹?fù)雜性層以減少阻塞,但以性能為代價。在內(nèi)核空間中處理并且由線程庫中的線程函數(shù)創(chuàng)建內(nèi)核線程。內(nèi)核線程為對操作系統(tǒng)可見的內(nèi)核可調(diào)度實體。內(nèi)核線程存在于進程的上下文中并且為操作系統(tǒng)提供解決和執(zhí)行該進程的更小節(jié)段的手段。內(nèi)核線程還能夠使程序利用硬件提供的用于并發(fā)和并行處理的能力。在使用內(nèi)核線程的情況下,每個用戶線程可以具有一個相應(yīng)的內(nèi)核線程。每個線程是可以被內(nèi)核獨立調(diào)度的,所以如果正由一個線程執(zhí)行的指令阻塞,則來自其他線程的指令可能能夠運行。由于線程管理必須涉及內(nèi)核,所以創(chuàng)建、終止和同步在內(nèi)核線程下比用戶線程下更慢。開銷會更大,但使用內(nèi)核線程,即使用單處理器系統(tǒng),更多并發(fā)性是可行的。其結(jié)果是,內(nèi)核空間線程的整體應(yīng)用性能可以超過用戶空間線程性能。然而,當(dāng)創(chuàng)建大量線程時,開發(fā)者必須小心,因為每個線程向進程添加更多權(quán)重并且對內(nèi)核產(chǎn)生負(fù)擔(dān)。內(nèi)核線程可以改變進程的角色,因為在這種環(huán)境中進程更是一個用于對一種應(yīng)用程序的相關(guān)線程進行分組的邏輯容器。每個進程包含至少一個線程。當(dāng)該進程啟動時,系統(tǒng)自動地創(chuàng)建此單個(初始)線程。應(yīng)用程序必須顯式地創(chuàng)建附加線程。只具有一個線程的應(yīng)用程序為“單線程”。具有不止一個線程的應(yīng)用程序為“多線程”。以下提供了一個線程相對于其他的線程的示例處理。進程的“狀態(tài)”信息包括一個標(biāo)引有待執(zhí)行的指令序列的程序計數(shù)器、以及寄存器狀態(tài)。寄存器上下文和程序計數(shù)器包含對程序執(zhí)行的當(dāng)前狀態(tài)進行指示的多個值。有待執(zhí)行的指令序列為實際程序代碼。例如,當(dāng)進程上下文進行切換時,新調(diào)度的進程的寄存器信息告知處理器該進程在其執(zhí)行中的何處中斷。更確切地說,線程的程序計數(shù)器將會包含有待在啟動時執(zhí)行的當(dāng)前指令。像進程的上下文一樣,線程的上下文由指令、屬性、帶有寄存器上下文的用戶結(jié)構(gòu)、專用存儲、線程結(jié)構(gòu)以及線程堆棧組成。像進程一樣,線程具有一種以控制指令集的執(zhí)行為基礎(chǔ)的生存周期。在整個時間過程中,線程像進程一樣被創(chuàng)建、運行、休眠和被終止。典型地使用fork()調(diào)用來創(chuàng)建新的進程(并且在多線程OS中,進程的至少一個線程),該fork()調(diào)用產(chǎn)生一個進程和線程ID。該進程及其線程鏈接到活躍列表上。新的線程被標(biāo)記為可運行,并且之后將其放置在運行隊列中。內(nèi)核調(diào)度該線程以使其運行,從而將該線程狀態(tài)改變至活躍運行狀態(tài)。當(dāng)在此狀態(tài)下時,給予該線程其請求的資源。這繼續(xù)進行直到出現(xiàn)時鐘中斷,或該線程放棄其時間來等待請求的資源,或者該線程被另一個(更高優(yōu)先級)線程搶先。如果出現(xiàn)這種情況,則切換出該線程的上下文。如果其必須等待請求的資源(否則,處理器將阻塞),則切換出線程。這致使該線程進入休眠狀態(tài)。該線程休眠直到其請求的資源返回并且使得其有資格再次運行。在該線程的休眠狀態(tài)過程中,內(nèi)核計入當(dāng)前正在運行的線程對CPU的使用情況。一段時期之后,內(nèi)核可以引起上下文切換至另一個線程。下一個有待運行的線程將是準(zhǔn)備運行的線程中具有最高優(yōu)先級的線程。對于該就緒狀態(tài)下的剩余線程而言,可以上調(diào)其優(yōu)先級。一旦線程獲取了所請求的資源,則其調(diào)用喚醒例程并且再次將狀態(tài)從休眠變成運行,使得該線程有資格再次運行。當(dāng)下一個上下文切換時,允許該線程運行,條件是其是下一個有資格的候選者。當(dāng)被允許運行時,該線程狀態(tài)再次變化至活躍運行。一旦該線程完成,其退出,釋放所有資源并且可以轉(zhuǎn)至廢止?fàn)顟B(tài)。一旦釋放了所有資源,則釋放該線程和這些進程條目,并且可以更新活躍進程/線程的鏈表。關(guān)于更多面向硬件的并行度,在幾乎所有計算設(shè)備中可以獲得實現(xiàn)并行計算硬件的能力,范圍從可以具有4個、8個、16個、32個或幾十個處理元件的強大的移動或桌面CPU開始,這些元件對于帶有許多(例如,幾百個)相對簡單的處理器的圖形處理單元(GPU)而言是相對復(fù)雜的。雖然GPU在最初被設(shè)計成用于并且仍然主要用于使光柵圖形加速,但GPU已經(jīng)逐漸地變得更加可編程。這種提高的可編程性已經(jīng)允許在GPU上表達并執(zhí)行一些多線程計算問題。盡管GPU架構(gòu)具有極高的理論最大每秒浮點運算次數(shù)(FLOPS),但僅光柵化的圖形和某些表現(xiàn)良好、高度可流化計算問題才可以貼近實現(xiàn)接近于理論吞吐量的實際吞吐量。提高計算的并行度典型地涉及到算法復(fù)雜性與在管理計算資源共享中產(chǎn)生的開銷之間的折中。另一個重要的考慮在于算法正確地執(zhí)行,從而使得不損壞數(shù)據(jù)值。線程的并行執(zhí)行(其可能使用共享的數(shù)據(jù))會由于讀和寫的不正確計時對共享數(shù)據(jù)值造成數(shù)據(jù)損壞。對這種共享數(shù)據(jù)的協(xié)商訪問或串行化訪問產(chǎn)生開銷。另一個關(guān)注點很大程度上在于在越來越多的并行執(zhí)行過程中保證數(shù)據(jù)的正確性。首要地,通過鎖定變量來處理不同線程之間的并行度(并且避免數(shù)據(jù)損壞),這些變量由于系統(tǒng)中的沖突進程而存在偏離正確順序被寫入(或讀取)的風(fēng)險。該概念本質(zhì)上在于,當(dāng)給定的進程想要寫入這種變量(例如,全局變量)時,該進程試圖鎖定該變量。如果沒有其他進程鎖定該變量,則可以將該鎖授予該請求進程。該進程執(zhí)行其寫入,并且然后釋放該鎖。如可以認(rèn)識到的,鎖的使用取決于對哪些變量應(yīng)被鎖保護進行檢測或標(biāo)識的機制和檢查鎖狀態(tài)、授予鎖狀態(tài)以及取消鎖狀態(tài)的仲裁器。哪些變量需要被保護還經(jīng)常取決于給定的軟件程序是否旨在可供用于在多線程平臺上使用,其中,這種程序的多個這種實例可以在多個并發(fā)執(zhí)行的進程中執(zhí)行。程序員可以指定有待被鎖保護的進程中的代碼的多個部分。在編譯時間,編譯程序可以處理這種代碼,并且在一些情況下還可以檢測可能處于風(fēng)險下但不受保護的變量,并且可以將這種鎖插入到編譯的目標(biāo)代碼內(nèi)。鎖的一種實現(xiàn)方式是相互排斥(互斥),其控制著計算機代碼的不同部分可以如何訪問共享資源,如全局變量。例如,需要讀取給定變量的代碼的一部分不應(yīng)被允許在另一個進程對該變量進行更新的過程中執(zhí)行。術(shù)語“互斥”還用于進行工作以針對沖突變量對不同程序元素的相互排斥進行協(xié)商的程序元素的意義中。在多線程執(zhí)行環(huán)境中,多個線程可以執(zhí)行,并且最終可能需要訪問受互斥保護的給定數(shù)據(jù)對象。如果互斥當(dāng)前是活躍的,則操作系統(tǒng)典型地將致使正在等待該互斥的線程進入休眠(即,停止執(zhí)行)。因此,隨著越來越多的線程達到該互斥,使得它們每個進入休眠以等到操作系統(tǒng)指示它們可以執(zhí)行的時候。操作系統(tǒng)可以通過這些線程達到互斥的相對順序來喚醒這些線程;它們被喚醒的順序可以簡單地是不確定的。對共享資源進行分配的其他方法包括信號量,這些信號量將無差別的資源元素分配在希望使用這些元素的多個進程之間。信號量本質(zhì)上對可供用于從該集合使用的資源的元素的數(shù)量進行計數(shù),從而當(dāng)保留和釋放資源時對該計數(shù)進行調(diào)整。當(dāng)給定資源中沒有可用元素時,則請求使用該資源的進程等待,直到已經(jīng)釋放該資源的一個元素。典型地,在操作系統(tǒng)中實施信號量以便進行資源分配?;炬i定概念存在變化,如自旋鎖定,當(dāng)給定鎖空閑時,其允許線程繼續(xù)活躍地詢問,從而使得通過不必被喚醒而提高它們的響應(yīng)能力,這產(chǎn)生開銷(上下文調(diào)換)。然而,自旋鎖定的確使用處理器周期,并且因此內(nèi)在地降低效率。其他變化包括遞歸鎖定,對鎖實施時間限制,從而使得進程將不會無限期等待獲取用于具體目標(biāo)的鎖,但反而(如果可能)如果在給定時期內(nèi)不滿足其鎖定請求,則繼續(xù)執(zhí)行。當(dāng)針對關(guān)鍵進程的絕對計時執(zhí)行可能是有必要時,這種方法在嵌入式系統(tǒng)中是有用的。進一步的示例變化是遞歸鎖定,遞歸鎖定是被提出用于對共享存儲器具有非均勻訪問(NUMA)的計算架構(gòu)的策略。典型地,多組通用處理器(每組帶有一個片上高速緩存并且在帶有共享主存儲器的系統(tǒng)中工作)將具有NUMA特性(實際上,大多數(shù)低成本計算平臺)。遞歸加鎖以下實現(xiàn)內(nèi)容為基礎(chǔ):由于由處理器之間的互連引起的通信延時差,駐留在具有鎖定的存儲器位置(標(biāo)準(zhǔn)測試和集合鎖定)的處理器上的進程比在一個不同芯片上的進程更可能被準(zhǔn)予訪問該鎖定的存儲器位置。遞歸鎖定尋求強制執(zhí)行對將鎖授予可能具有更多數(shù)據(jù)局部性的進程的可預(yù)測且可控制的優(yōu)先項,通過將鎖授予在已經(jīng)具有該鎖的節(jié)點上執(zhí)行的進程來進行強制執(zhí)行,這些通過向該授予鎖的進程添加以下條件:就哪個節(jié)點正在托管請求該鎖的線程,對標(biāo)識符進行測試。
技術(shù)實現(xiàn)要素:用于執(zhí)行并發(fā)圖形計算的示例系統(tǒng)的方面包括一個計算元件集群,其中每個計算元件包括一個本地存儲器和多個單指令多數(shù)據(jù)(SIMD)算術(shù)邏輯單元(ALU)。該系統(tǒng)還具有一個用于該計算元件集群的調(diào)度器。該調(diào)度器可操作用于接收對有待在該集群上執(zhí)行的一種第一類型計算的實例進行定義的輸入,其中這些實例中的每個實例與一個對應(yīng)的調(diào)度密鑰相關(guān)聯(lián)。該調(diào)度器可操作用于根據(jù)其調(diào)度密鑰將這些實例分類成多個包,并且發(fā)出一個包括多個計算實例的包。該系統(tǒng)具有一個分發(fā)器,該分發(fā)器可操作用于接收該包,并且在該集群的計算元件之間分發(fā)這些實例。這些計算元件中的每個計算元件可操作用于使多個實例與不同的調(diào)度密鑰組合,以便進行并發(fā)執(zhí)行,為此,應(yīng)當(dāng)執(zhí)行相同的計算并且為這些組合的離散計算部分并發(fā)地執(zhí)行該計算。多個進一步的示例性方面可以包括:針對對讀取和寫入開放的存儲器位置的存儲器訪問,可以通過對不同實例之間的沖突存儲器范圍進行標(biāo)識,在已經(jīng)將訪問那些沖突存儲器范圍的指令發(fā)送用于執(zhí)行之前,使多個實例與其他實例同步。該調(diào)度器可以使用針對變量聲明的實例特定的存儲器地址執(zhí)行對沖突存儲器范圍的如此的標(biāo)識。該系統(tǒng)可以在建立階段過程中在該多個計算元件之間分散實例特定的存儲器范圍。每個計算元件可操作用于根據(jù)包括以下內(nèi)容的標(biāo)準(zhǔn)來對該第二類型計算的實例的分組進行調(diào)度:(1)來自一個共同指令源的執(zhí)行,以及(2)強制執(zhí)行以下規(guī)則:沒有任何一個有待并行執(zhí)行的實例分組可以包括寫入相同存儲器位置的多個實例。在一個進一步的示例性方面中,一種有待在計算機系統(tǒng)上對圖形計算進行調(diào)度中執(zhí)行的方法提供了在多個計算集群之間分發(fā)一種第一類型的工作負(fù)載。每個集群可操作用于對來自被分配給獨立于該多個集群中的其他集群的那個集群的第一類型工作負(fù)載的指令的執(zhí)行進行調(diào)度。形成一種第二類型的工作負(fù)載的分組,以便在該多個計算集群中執(zhí)行?;谂c該第二類的工作負(fù)載相關(guān)聯(lián)的對應(yīng)調(diào)度密鑰確定這些分組。每個調(diào)度密鑰定義以下各項中的一個或多個:有待在每個工作負(fù)載的分組的執(zhí)行過程中使用的數(shù)據(jù)元素和針對該第二類型的每個工作負(fù)載有待執(zhí)行的指令集。選擇工作負(fù)載的分組并且在該多個計算集群之間分發(fā)該分組的工作負(fù)載。一個進一步的示例性方面包括一個用于在計算系統(tǒng)中使用的計算組件,該計算組件包括:一個存儲器,該存儲器包括一個瞬時部分和一個永久存儲部分。該組件進一步包括多個算術(shù)邏輯單元(ALU),每個算術(shù)邏輯單元可以讀訪問和寫訪問該存儲器并且具有一個用于接收有待在該多個ALU上執(zhí)行的離散計算定義的輸入隊列。這些定義包括一個程序引用和一個調(diào)度密鑰。本地調(diào)度器可操作用于對該多個ALU進行調(diào)度。該本地調(diào)度器可操作用于通過對具有相同程序引用和相同調(diào)度密鑰的計算定義的分組進行標(biāo)識來對計算的調(diào)度進行優(yōu)先次序排序。當(dāng)執(zhí)行該引用的程序時,該調(diào)度密鑰用于對存儲有待被這些ALU使用的數(shù)據(jù)的存儲器的高周轉(zhuǎn)部分中的位置進行標(biāo)識。在一個進一步的方面中,具有所存儲的計算機可執(zhí)行指令的有形計算機可讀介質(zhì)包括針對有待在計算單元上執(zhí)行的計算線程的多個指令。針對該線程的指令包括對計算例程進行調(diào)用的指令。計算例程的調(diào)用包括一個調(diào)度密鑰的定義、一個對用于讀取和寫入的存儲器位置進行標(biāo)識的有限存儲器引用、和一個有待被讀取用于該計算例程的存儲器位置、以及多個指令,這些指令有待在對該計算例程調(diào)用之后執(zhí)行,而不需要在其執(zhí)行過程中等待所調(diào)用計算例程產(chǎn)生的信息。該計算例程可以進一步被遞歸地實例化,并且每個遞歸地實例化的實例自動地繼承該有限存儲器引用,并且該讀存儲器位置是不同的。可以基于一種被訪問類型數(shù)據(jù)的規(guī)則訪問模式對該讀存儲器位置進行更新。附圖說明圖1描繪了一種示例系統(tǒng)的架構(gòu),其中,可以根據(jù)這些披露實施并發(fā)和并行處理及調(diào)度;圖2描繪了另一個示例性系統(tǒng)202,其中,可以實踐所披露的方面。圖3描繪了異構(gòu)計算的一個方面,其中,父線程可以使一種第二類型的計算的實例實例化,并且其可以遞歸地進一步使該第二類型的計算的多個實例實例化;圖4描繪了多個示例步驟,其中,異構(gòu)計算架構(gòu)可以支持多種類型的計算的實例的并發(fā)執(zhí)行;圖5描繪了根據(jù)本披露的纖程(fibre)計算的進一步方面;圖6描繪了纖程的輸入組的流,調(diào)度/工作分布抽象化提供了這些纖程在這些組中的分散;圖7描繪了一個集群的示例結(jié)構(gòu),該結(jié)構(gòu)可以用在圖1或圖2中描繪的集群陣列的實現(xiàn)中;圖8描繪了纖程例程在多個計算單元上的動態(tài)收集、調(diào)度和分發(fā)執(zhí)行。圖9描繪了一個包括多個ALU的集群的示例操作的多個方面;圖10描繪了一個計算集群的本地存儲器存儲了纖程數(shù)據(jù)存儲的線程局部變量和多個元素;圖11描繪了一個進程的多個部分,該進程可以由這些披露的實現(xiàn)方式中提供的集中控制器執(zhí)行;圖12描繪了一個優(yōu)先進程的多個方面,該進程可以根據(jù)本披露用在多個系統(tǒng)中;圖13描繪了根據(jù)本披露的示例進程的多個方面;圖14描繪了一個收集存儲器,在其中可以按本披露的多個方面對纖程進行分組;圖15描繪了一個接收分散的纖程的輸入緩沖器的示例實現(xiàn)方面;以及圖16描繪了根據(jù)本披露的示例進程的多個方面。具體實施方式并行度不根據(jù)計算資源可用性縮放的一個原因在于存儲器帶寬不與可用計算能力成比例縮放。因此,不享有固有數(shù)據(jù)局部性的計算問題會致使計算元件等待正在從存儲器被訪問的數(shù)據(jù)。即使最大理論可用存儲器帶寬已經(jīng)上升,存儲器訪問依然是一個問題,因為這種最大帶寬采取對這些種類的計算問題而言經(jīng)常不切實際的突發(fā)傳輸速率。進一步地,存儲器接口性能的可縮放性受到其他因素的阻礙,如存儲器接口的引腳數(shù)和存儲器訪問等待時間不輕易隨進程技術(shù)改變而縮放的事實。例如,DDR3列地址選通(CAS)等待時間可以為大約9ns,而典型的DDR2CAS等待時間為大約10ns。并且,處理節(jié)點之間的存儲器等待時間還可以是不同計算范例(如NUMA架構(gòu))中的一個因素。進一步地,這些計算集群的SIMD性質(zhì)意味著同時執(zhí)行多個線程必須遵循完全相同的程序執(zhí)行路徑,以便實現(xiàn)最大計算吞吐量。例如,如果這種SIMD集群中的一半線程采取一條分支單路并且剩余部分采取另一條分支,則硬件必須串行化這些兩條路徑(即,一半暫停而另一半執(zhí)行,從而使得該SIMD集群最終可以再次在向量化數(shù)據(jù)上執(zhí)行)。在這種情況下,計算單元僅以50%的吞吐量執(zhí)行。在正在被執(zhí)行的代碼基數(shù)包含許多分支的情況下,單單來自SIMD損失的最壞情況性能可以是l/SIMD_寬,這在32寬SIMD架構(gòu)上效率為約3%。存在大量計算問題,包括光線追蹤、空間搜索、分類和數(shù)據(jù)庫遍歷,雖然理論上它們是可并行化的,但尚未高效地映射到如此寬的SIMD架構(gòu)上。以下描述的技術(shù)的一些應(yīng)用涉及到圖形處理器,如可以執(zhí)行光柵化和/或光線追蹤的處理器。具體關(guān)于光線追蹤,光線追蹤可以用于產(chǎn)生從3-D場景渲染的逼真圖像(在視頻游戲背景下)、動畫、動畫廣告、工業(yè)模型、架構(gòu)模擬等。在渲染領(lǐng)域內(nèi)使用的一種構(gòu)造是提供物理場景模型,并且是表面信息與場景模型的不同部分相關(guān)聯(lián)。例如,場景模型可以包含多種物體,包括人、汽車和建筑物。場景的物理模型將描述這些物體的表面,例如,作為線框模型,其可以包括大量彼此互連的圖元形狀以描述這些表面的邊界。此物理模型通常缺乏關(guān)于這些物體表面的視覺外觀的信息。然后,信息和編程與具體表面和/或描述其外觀的具體表面的多個部分相關(guān)聯(lián)。這種信息可以包括表面的紋理,而與表面相關(guān)聯(lián)的編程經(jīng)常旨在為表面對碰撞該表面的光具有何種影響進行建模。例如,編程允許對玻璃、光亮的表面、凹凸不平的表面等進行建模。因此,這種編程和信息與對那些表面進行描述的物理模型的多個部分相關(guān)或以另外的方式相關(guān)聯(lián)。例如,編程可以與具體圖元相關(guān)聯(lián)或相關(guān)。對于具體圖元或場景物體而言,這種編程和其他描述、或其多個部分通??梢员环Q為用于該圖元或物體的“著色器”。以上描述示出了術(shù)語“線程”在不同情況下可以表示不同的意思(但,不是對該術(shù)語的潛在用途的窮盡性解釋)。因此,在以下描述中,將使用術(shù)語以試圖減少對與多線程相關(guān)聯(lián)的術(shù)語的依賴,例如,通過引入術(shù)語“纖程(fibre)”作為旨在共同地和單獨地表示多個概念的名字,不是所有這些概念需要在根據(jù)本披露的每個實現(xiàn)方式中被實踐。然而,如從以下描述中變得更加明顯的,多線程操作系統(tǒng)以及支持多線程應(yīng)用的并發(fā)和并行處理的機器可以被適配成用于實施這些披露的多個方面。在一個方面中,多處理環(huán)境下的進程或多線程環(huán)境下的線程(或多處理、多線程環(huán)境下的兩者)可以使用API來創(chuàng)建有待執(zhí)行的工作的一個或多個單元,為了方便的目的,在此每個單元被稱為一個“纖程”。在一個方面中,纖程是代碼的實例,如可以被一個父線程重復(fù)分叉或者可以從同一纖程例程的另一個實例遞歸地進入的例程(例如,C函數(shù)聲明)。一個纖程例程的實例(為了方便,纖程例程的實例被簡單地稱為“纖程”)包括數(shù)據(jù)元素的被用作調(diào)度密鑰的一個標(biāo)識符、和纖程存儲的(聲明)具體元素的標(biāo)識。共享一個調(diào)度密鑰的纖程可以被分組以便進行并發(fā)執(zhí)行(如以下所述,這種分組不強行要求嚴(yán)格地并行進行這種執(zhí)行)。針對執(zhí)行,引用纖程存儲的相同元素的所有纖程可以被傳遞至具有該本地高速緩存的纖程存儲的元件的一個計算元件。在一個示例性實現(xiàn)方式中,對于給定纖程,或纖程集合而言,纖程存儲的給定元件至少具有以下特征:此纖程存儲元件只對該纖程或纖程集合可讀和可寫;此限制可以是隨時間變化的或絕對的??梢酝ㄟ^適當(dāng)?shù)木幊虒嵺`、通過編譯程序、通過硬件、以及通過以上的某種組合強制執(zhí)行此限制。在一個方面中,可以通過標(biāo)準(zhǔn)C函數(shù)聲明定義纖程并且該纖程包含完整執(zhí)行該纖程所需的所有代碼(可以提供函數(shù)的標(biāo)準(zhǔn)線上擴展)。操作差異在于纖程不等待來自該纖程內(nèi)調(diào)用的另一個函數(shù)的返回值。在該示例性方面,該纖程例程函數(shù)聲明包含至少一個自變量,針對該自變量,將一個值存儲在與使用該纖程例程聲明使纖程分叉的線程相關(guān)聯(lián)的纖程存儲中。在一個示例性方面中,引用纖程存儲的給定元素的所有纖程(例如,通過父線程(或纖程)被實例化)使其執(zhí)行受到控制或被分發(fā),從而使得它們在給定處理器內(nèi)串行地執(zhí)行(處理器可以本身通過處理元件的分組,并且在一個示例中,可以包括多個SIMD處理元件),并且與具有相同(或匹配)纖程密鑰的其他纖程例程并發(fā)地或通常并行執(zhí)行。在一個示例中,被認(rèn)為是處理器的一個處理器元件分組在此上下文中根據(jù)那些可以寫入具體纖程存儲位置的處理元件確定。在一個示例中,出于強制執(zhí)行引用該具體纖程存儲位置的纖程的串行執(zhí)行的目的,所有可以寫入具體纖程存儲位置的處理器元件被認(rèn)為是有待成為一個處理器的一個組。關(guān)于系統(tǒng)內(nèi)的存儲器子集考慮這種寫入,如本地存儲器,然而可以不那樣處理訪問。在一個示例性方面中,只有最終追蹤到共父的纖程訪問被分配用于這些纖程的纖程存儲元件。因此,追蹤到該集合的不同父的纖程不訪問這種纖程存儲位置。進一步地,在示例性方面中,來自同一父的兩個或更多個纖程不被調(diào)度用于并行執(zhí)行,從而使得纖程存儲位置不要求互斥或鎖定管理。然而,在這種示例性方面中,纖程以另外的方式可以完全訪問標(biāo)準(zhǔn)線程將具有的所有特征,包括完整全局存儲器訪問、本地存儲器、屏障、紋理采樣器、私有變量和所有算術(shù)和邏輯操作。該纖程例程還可以包含直接從其父線程的內(nèi)核自變量取得的自變量,這允許該纖程訪問全局存儲器指針和其他共享變量??梢允褂脴?biāo)準(zhǔn)存儲器保護技術(shù)訪問這些存儲器位置。系統(tǒng)中的每個線程可以定義多個纖程,每個纖程帶有一個對應(yīng)的調(diào)度密鑰。進一步地,可以定義多個纖程例程,從而使得給定線程可以定義多個纖程,這些纖程是不同纖程例程的實例。如以上解釋的,在一個示例性方面中,同一纖程例程的纖程(共享一個代碼基數(shù))和來自同一父(例如,父線程或纖程)的纖程在實現(xiàn)方式中在執(zhí)行時不重疊,這些實現(xiàn)方式針對訪問只可供這些纖程使用的至少一個變量或數(shù)據(jù)源避免了互斥或鎖定。在一些實現(xiàn)方式中,API可以被提供用于父線程(或另一個纖程)通過語義(以下提供了其示例)使纖程例程實例化/對其進行調(diào)用(如以上解釋的,每個纖程為一個纖程例程的調(diào)用)。在一些方面中,并且不像典型多線程環(huán)境下的函數(shù)調(diào)用,內(nèi)核(或者其他系統(tǒng)調(diào)度器資源)不一定即刻試圖執(zhí)行或準(zhǔn)備執(zhí)行這樣調(diào)用的纖程(在典型多線程環(huán)境下,如同其將是一個線程一樣)。以上介紹了這種準(zhǔn)備的示例。相反,在一個示例性方面中,其激活(對實際處理資源進行分配以便進行執(zhí)行)被延遲直到未知的將來時間。進一步地,在父線程使纖程實例化之后(例如,通過使用纖程定義API語義),如果以另外的方式允許,則父線程可以繼續(xù)執(zhí)行(例如,繼續(xù)是活躍的線程,使其程序計數(shù)器增量并且使用硬件資源)。API還可以同時提供語義用于使多個纖程實例化(例如,同一纖程例程的纖程或不同纖程例程的纖程)。在一個示例中,這些纖程中的每個纖程可以具有一個共用密鑰,并且在另一個示例中,這些纖程可以具有相同的纖程密鑰,但在一個或多個不同值上工作。在本示例性方面中,因為父線程不阻塞或等待來自此纖程的返回值,所以纖程不向父線程返回任何返回值,標(biāo)準(zhǔn)C函數(shù)也將一樣。相比之下,當(dāng)完成時,纖程例程可以簡單地停止存在(例如,進入廢止?fàn)顟B(tài),從而等待存儲器資源的取消分配),并且不返回至調(diào)用程序(父)線程。因此,在本方面中,對于纖程而言,為了生效或產(chǎn)生有用的輸出,纖程有待將結(jié)果寫入纖程存儲中。要指出的是,盡管纖程使用互斥或鎖定管理具有將結(jié)果寫入在該纖程外共享的存儲器資源(例如,全局或本地存儲器)的能力,但這種操作將比寫入纖程存儲緩慢得多。在一個示例性方面中,因為纖程不返回值,所以纖程(例如,從共用線程實例化的纖程)之間存在的數(shù)據(jù)受到駐留在或被聲明駐留在纖程存儲中的數(shù)據(jù)的限制。實際上,預(yù)期通過將快速可用存儲器資源分配給纖程存儲來實踐在此披露的示例性方面,并且如此,典型地預(yù)期將是更加有限的資源。例如,如主存儲器與高速緩存存儲器之間一樣,高速緩存的比較大的部分專用于纖程存儲而不用于可以被纖程使用的其他數(shù)據(jù)。具有某種普遍性的另一個方面在于對引用纖程存儲的同一元素的纖程進行引用計數(shù)(例如,當(dāng)發(fā)出引用該纖程存儲元素的纖程時,使計數(shù)器增量,而當(dāng)纖程完成時,進行減量)。因此,達到零的引用計數(shù)指示不再有未解決的引用給定纖程存儲位置(或在給定纖程集合引用多個位置的情況下的位置)的纖程。因此,這種達到零的引用計數(shù)可以是對父線程的觸發(fā)器:纖程存儲內(nèi)的數(shù)據(jù)可供使用和/或提取。通過進一步的示例,父線程可以對響應(yīng)于零值的標(biāo)志建立(如內(nèi)建函數(shù)提供的標(biāo)志)進行監(jiān)控。以下是對可以用在根據(jù)這些披露的實現(xiàn)方式中的語義進行編碼的示例構(gòu)造。本示例是解釋性的,而不是限制如何可以構(gòu)建具體的實現(xiàn)方式,或限制這種實現(xiàn)方式的內(nèi)容。__纖程(__fibre):本限定詞用于聲明函數(shù)作為纖程例程。纖程例程將本限定詞放在函數(shù)聲明開始處。__纖程存儲(__fibrestorage):本限定詞聲明變量存在于纖程存儲中。在父線程內(nèi),用本限定詞聲明有待在子纖程之間共享的變量。纖程例程不聲明纖程存儲。纖程例程包含具有本限定詞的至少一個自變量。__纖程密鑰(__fibrekey):纖程密鑰用于指示對纖程的執(zhí)行進行調(diào)度時使用的一個或多個標(biāo)準(zhǔn)。纖程密鑰的示例包括全局存儲器中的偏移、和分支條件。平臺可以基于纖程密鑰匹配將一個纖程調(diào)度成與其他纖程并行執(zhí)行。在一個實現(xiàn)方式中,纖程例程函數(shù)聲明包含恰好一個這種類型的自變量。+纖程例程(a,b)(+Fibreroutine(a,b)):通過進行標(biāo)準(zhǔn)函數(shù)調(diào)用但將符號+放在函數(shù)名前面來調(diào)用纖程例程。這種調(diào)用不立即對纖程例程造成跳轉(zhuǎn)執(zhí)行,而是將其調(diào)用延遲到將來的時間。調(diào)用例程的執(zhí)行可以和正常一樣繼續(xù),并且纖程例程不返回值,正常函數(shù)調(diào)用也一樣。布爾是_初始_線程_啟動()(boolis_initial_thread_Iaunch()):這是一個內(nèi)建函數(shù),只有當(dāng)在其初始啟動被父線程調(diào)用時該內(nèi)建函數(shù)才返回真。提供本函數(shù)以便于在正在被典型線程啟動調(diào)用的父線程例程與來自父線程的所有子纖程已完成的通知(可以通過達到零的引用計數(shù)確定)之間進行區(qū)分。附錄中的偽代碼舉例說明了一種纖程計算的途徑,其中,線程可以使根據(jù)本披露表現(xiàn)的纖程實例化,并且其中,纖程可以遞歸地使引用同一纖程數(shù)據(jù)存儲的其他纖程實例化,但這些纖程具有不斷變化的調(diào)度密鑰。鑒于以上介紹性解釋和通過進一步的解釋,以下解釋了各種架構(gòu)示例和操作情況。在其中可以實踐纖程計算方面的架構(gòu)是多種多樣的。一種示例性架構(gòu)類型是這樣一種類型:其中,多個計算集群各自包括多個算術(shù)邏輯單元(ALU)、和一個對這些ALU進行控制的本地控制器。在這種架構(gòu)的一個更具體的實例中,一個集群的所有ALU從該本地控制器選擇的共用程序計數(shù)器運行。然而,每個ALU可以具有一個獨立的對本地存儲器端口。在一些示例中,該本地存儲器可以類似于通用處理器的寄存器組而工作;每個ALU可以從該本地存儲器讀取和寫入該本地存儲器。在一些實現(xiàn)方式中,可以在逐指令的基礎(chǔ)上無等待時間地改變每個集群中的活躍程序計數(shù)器。在一些具有如此的多個集群的架構(gòu)中,可以在每個集群中執(zhí)行全部線程,并且這種線程的狀態(tài)保持在這些集群的本地存儲器中。在一些實現(xiàn)方式中,本地控制器可以與線程不同地處理纖程(就對其在被該本地控制器控制的ALU中的執(zhí)行進行調(diào)度而言)。在一些實現(xiàn)方式中,引用一個共用纖程存儲器存儲位置的纖程(即,纖程共享一個共源)將本調(diào)度用于在任何實現(xiàn)方式(不在其中實施存儲器仲裁)中的集群中進行并發(fā)執(zhí)行。一個示例架構(gòu)顯式地避免針對纖程的本地存儲器訪問進行仲裁,從而使得可以使存儲器訪問加速。在實施所披露的方面的計算架構(gòu)內(nèi)處理的示例工作負(fù)載主要涉及圖形渲染工作負(fù)載,并且更具體地,光線追蹤被提供作為纖程計算原理的主要應(yīng)用示例。然而,可以通過應(yīng)用所披露的纖程計算的方面來解決各種計算問題。在使用纖程計算的方面來實施光線追蹤功能性的背景下,圖形芯片可以基于用線程計算原理進行的圖形處理和使用相同數(shù)量的的計算集群來繼續(xù)實施光柵化??梢愿鶕?jù)纖程計算或線程計算原理實施互斥和像元著色函數(shù)(其可以類似地適用于幾何形狀和圖像處理)。因此,纖程計算系統(tǒng)架構(gòu)提供了接受從發(fā)散源指定的工作負(fù)載,如不同的線程或其他纖程。每個工作負(fù)載可以具有一個第一和一個第二數(shù)據(jù)元素,其中這些數(shù)據(jù)元素之一可以用作一個控制密鑰對如何將該工作負(fù)載與其他工作負(fù)載分組進行控制,并且另一個數(shù)據(jù)元素在多個計算元件之間對在何處執(zhí)行該工作負(fù)載進行控制。圖1和圖2中描繪了在其中可以實踐所披露的方面的示例系統(tǒng)架構(gòu)。圖1描繪了一種示例系統(tǒng)10的架構(gòu),其中,可以根據(jù)這些披露實施并發(fā)和并行處理及調(diào)度。例如,根據(jù)示例系統(tǒng)10的系統(tǒng)可以用于實現(xiàn)圖形處理器。主接口40可以包括一個線程API42并且可以包括一個纖程API41。在主處理器(未描繪出)上運行的例程可以使用線程API42,以便使有待在系統(tǒng)10上執(zhí)行的新線程實例化。線程API42可以被提供例如作為可在帶有一個或多個通??删幊烫幚砥骱诵模ㄈ绺鶕?jù)架構(gòu)規(guī)范并且與指令集架構(gòu)一起工作的計算核心)的片上系統(tǒng)(SoC)中使用的固件編碼API。在其他示例中,線程API42可以提供有用于附加卡的驅(qū)動程序,該附加卡將圖形處理負(fù)載從主處理器上分流。在一個示例中,并且如以下所描述的,在主處理器上運行的線程可以使用纖程API41,以便使在根據(jù)示例系統(tǒng)10的系統(tǒng)內(nèi)執(zhí)行的纖程實例化。如以下將要描述的,在這種系統(tǒng)內(nèi)執(zhí)行的線程還可以訪問根據(jù)這些披露提供的API,從而使得在該系統(tǒng)上執(zhí)行的線程還可以定義纖程以便執(zhí)行。在一些示例中,不在主接口層級下暴露纖程API,而是使其僅可供在該圖形處理器系統(tǒng)10內(nèi)執(zhí)行的線程使用。示例系統(tǒng)10包括多個管理器,其起到對有待在系統(tǒng)10中執(zhí)行的計算進行建立的作用。在一些示例中,在系統(tǒng)10中執(zhí)行的計算比旨在在處理器上執(zhí)行的典型應(yīng)用程序代碼顯著更規(guī)則且量更大。相反,示例工作負(fù)載可以包括對頂點或像元的大集合進行著色的工作負(fù)載。頂點數(shù)據(jù)管理器10和像元數(shù)據(jù)管理器11可以被提供用于建立使用可用計算元件(下述)來執(zhí)行這種計算)。通過進一步的示例,計算數(shù)據(jù)管理器2和光線數(shù)據(jù)管理器13可以被提供用于針對大規(guī)模數(shù)字?jǐn)?shù)值分析程序和針對光線追蹤工作負(fù)載建立計算。粗調(diào)度器44從數(shù)據(jù)管理器中接收輸入,如上述數(shù)據(jù)管理器10至13。粗調(diào)度器可以操作用于分配獨立地工操作的計算元件以執(zhí)行可以來自這些數(shù)據(jù)管理器的計算負(fù)載。粗調(diào)度器從系統(tǒng)10中的可用資源接收狀態(tài)信息。這種資源包括位于集群陣列65(下述)內(nèi)的存儲器的狀態(tài)。這種存儲器可以是對該集群陣列65內(nèi)的具體計算單元(例如,核心70至73)私有的,如存儲器76至79。這些存儲器76至79可以被實現(xiàn)作為可以在多個線程之間分配的高速緩存,這些線程正在與每個存儲器聯(lián)接的核心上執(zhí)行(例如,可以在在核心71上執(zhí)行的線程之間分配存儲器76)??梢杂纱终{(diào)度器44處理這種存儲器的分配。每個數(shù)據(jù)管理器(頂點、像元、計算機、光線)可以將存儲器分配要求傳達至粗調(diào)度器44。出于線程調(diào)度和資源分配的目的,授予Howson的美國專利公開號2007/0101013中描述了粗調(diào)度器44的操作方面以及數(shù)據(jù)管理器之間的通信,該專利通過引用以其全文結(jié)合于此。這種操作是示例性的,而不是窮盡性的;還可以鑒于這些披露對這種操作進行適配。該示例性系統(tǒng)10還包括一個包單元105、一個收集定義存儲器107、一個空堆棧108、以及一個打包機單元109,該包單元包括就緒堆棧106的組成組件。以下將描述示例架構(gòu)10內(nèi)的包單元105的功能、用途和操作。示例系統(tǒng)10還可以包括被適配成用于執(zhí)行特定功能的各種協(xié)處理器,并且被描繪為協(xié)處理器115至117??梢蕴峁┢渌厥庥猛竟δ埽缂y理加載器118。圖1描繪了可以通過任務(wù)分發(fā)器45分發(fā)由粗調(diào)度器44調(diào)度的線程。在所描繪的圖1的架構(gòu)中,該集群陣列、調(diào)度器44、以及數(shù)據(jù)管理器10至13全都可以使用總線43進行通信。當(dāng)然,總線43為一種在所描繪的結(jié)構(gòu)和功能元件之間進行通信的示例方法,并且可以提供其他方法,如網(wǎng)格互連、多級網(wǎng)絡(luò)等。示例性系統(tǒng)10還可以包括一個高速緩存層次15(其包括一個或多個高速緩存存儲器層級)、和一個可以與主存儲器接合的系統(tǒng)存儲器接口16,該主存儲器可以被實現(xiàn)作為高速圖形RAM、DRAM等中的一個或多個。隨著新技術(shù)的開發(fā),可以將多種途徑適配于大規(guī)模的存儲器容量,并且眾所周知的首字母縮寫詞(如DRAM)的使用并不旨在將所披露的方面的適用性限制到給定的進程或存儲器技術(shù)上。圖2描繪了另一個示例性系統(tǒng)202,其中,可以實踐所披露的方面。系統(tǒng)202包括一個包單元205(其包括一個空堆棧)、一個本地存儲分配器208、一個就緒堆棧210、一個收集定義存儲器(collectiondefinitionmemory)212、以及一個包214。包單元205可以與粗調(diào)度器222通信,該粗調(diào)度器可以包括一個線程存儲器狀態(tài)模塊220。包單元205收集有待在該多個計算集群之間分發(fā)的纖程的分組,如下所述,這些計算集群將執(zhí)行由這些纖程指定的工作。粗調(diào)度器222對該多個計算集群中的計算資源的使用進行追蹤,如存儲器分配和使用。在一些實現(xiàn)方式中,本地存儲器的一部分在具體計算集群中的分配是靜態(tài)的并且當(dāng)在該計算集群上建立線程時對其進行分配。粗調(diào)度器222還可以對這些纖程進行分配以便在這些集群中執(zhí)行。在一個示例中,在具體集群上執(zhí)行的線程可以使纖程例程實例化(從而制作出一個纖程)。粗調(diào)度器222可以接收關(guān)于該實例的信息并且對具體集群進行分配以執(zhí)行該纖程。如以上介紹的,對纖程進行分配以在集群上執(zhí)行不指示執(zhí)行將立即開始,而是這種纖程的執(zhí)行以情況而定。抽象化/分發(fā)器層225將一系列計算集群(描繪了集群227和229)與粗調(diào)度器222以及與包單元205分離開。根據(jù)以下描述的示例性途徑,分發(fā)器層225接受來自包單元205的纖程的分組并且致使在這些計算集群之間分發(fā)這些纖程。層225是一種用于將這些分組分發(fā)到將執(zhí)行該計算的計算區(qū)域中的示例裝置。每個集群包括一個對應(yīng)的控制器(分別為集群227和229描繪了控制器230和232)。每個集群控制器(例如230和232)控制著多個算術(shù)邏輯單元(ALU)(例如,集群控制器230控制著多個ALU,包括ALU235和ALU236)。一個集群的每個ALU與一個線程本地和纖程存儲存儲器(例如,線程本地和纖程存儲240)進行通信。在一個實現(xiàn)方式中,每個ALU具有一條至線程本地和纖程存儲的分離開的且專用的訪問路徑,從而使得每個ALU可以與該集群的其他ALU并發(fā)地從該存儲器讀取和寫入該存儲器。給定集群的存儲器資源進一步包括一個廣播數(shù)據(jù)存儲器(例如,集群227的廣播數(shù)據(jù)存儲器260)。在一個示例實現(xiàn)方式中,可以在與線程本地和纖程存儲240相同的物理存儲介質(zhì)中實現(xiàn)廣播數(shù)據(jù)存儲器260。一種示例實現(xiàn)方式,廣播數(shù)據(jù)存儲器260可以是允許存儲器的具體位置映射到該廣播數(shù)據(jù)存儲器中的多個不同位置上的高度交叉的高速緩存。在一些實現(xiàn)方式中,廣播數(shù)據(jù)存儲器可以包括一個環(huán)形緩沖區(qū)或FIFO存儲器實現(xiàn)方式。通過直接存儲器訪問單元(DMA)241來饋送這些廣播數(shù)據(jù)存儲器。在一個示例實現(xiàn)方式中,DMA241控制著數(shù)據(jù)在多個集群中的多個廣播數(shù)據(jù)存儲器中的存儲。集群是一種用于使用對應(yīng)的單個控制流程在對應(yīng)的多個數(shù)據(jù)元素上執(zhí)行并發(fā)計算的裝置。每個集群包括一個輸入緩沖器,例如,集群227包括輸入緩沖器267。由分發(fā)層225寫入并且由該集群的對應(yīng)控制器讀取每個集群的每個輸入緩沖器。例如,分發(fā)層225寫入到輸入緩沖器267,由集群控制器230讀取該輸入緩沖器。鑒于以上對示例系統(tǒng)202的組件的介紹,以下描述了本示例系統(tǒng)202的操作方面。圖3描繪了纖程計算的一個方面,然而,父線程305可以使一個第一纖程308實例化;第一纖程308可以遞歸地使共同地被標(biāo)識為310的另外一組纖程實例化。類似地,那些纖程各自可以使共同地被標(biāo)識為312的另外的纖程等等直到纖程314實例化。圖3中描繪的纖程中的每個纖程引用本地存儲器位置317,并且如以下將描述的,包括在這些纖程之間變化的至少一個其他數(shù)據(jù)元素并且其可以用作調(diào)度密鑰以便從不同父線程資源中分組纖程,以便在這些計算集群之間進行分發(fā)和執(zhí)行。在所描繪的纖程正在在一個集群(或多個集群)上執(zhí)行的時間期間,父線程305可以暫停執(zhí)行或可以繼續(xù)執(zhí)行獨立的代碼。例如,在使纖程308實例化之后,即使當(dāng)纖程308至314在同一集群上并發(fā)執(zhí)行時,父線程305可以繼續(xù)執(zhí)行代碼。圖4描繪了多個示例步驟,其中,異構(gòu)計算架構(gòu)可以支持并發(fā)線程處理和纖程執(zhí)行。在圖4中,線程305可以通過使新的線程分叉318而使新的線程實例化。其中,這些數(shù)據(jù)管理器中的任何數(shù)據(jù)管理器還可以執(zhí)行對有待在集群陣列上執(zhí)行的新線程的建立請求。當(dāng)接收到分叉318時,調(diào)度器272可以對實行或以另外的方式執(zhí)行線程所需的資源進行標(biāo)識;執(zhí)行該線程所需的資源可以與集群陣列65中的不同集群之間的當(dāng)前資源使用進行比較(在圖1的示例中)。此外,在324,可以對該線程的優(yōu)先級進行標(biāo)識;可以給予更高優(yōu)先級線程執(zhí)行的優(yōu)先級。在326,已經(jīng)確定為準(zhǔn)備好開始執(zhí)行的線程可以使存儲器被分配并且在將要執(zhí)行該線程的具體集群內(nèi)的其他資源被分配。隨后,當(dāng)將要執(zhí)行該線程內(nèi)的指令以便作為整體執(zhí)行該線程時,該線程所分配到的集群可以負(fù)責(zé)進行調(diào)度(328)。圖4還挑選了一個用于對有待在該集群陣列65內(nèi)執(zhí)行的纖程進行建立的示例流程。具體地,圖4描繪了可以接收330一個新的纖程實例。在一個示例中,該纖程實例可以包括一個調(diào)度密鑰,在332對該調(diào)度密鑰進行標(biāo)識。在333,執(zhí)行收集分組算法。該收集分組算法操作用于基于對應(yīng)纖程的匹配調(diào)度密鑰來收集纖程。此外,每個實例化的纖程可以與一個對應(yīng)的優(yōu)先級相關(guān)聯(lián)。在334,可以確定和使用哪些優(yōu)先級來形成纖程收集的代表性優(yōu)先級。在336,可以執(zhí)行對有待在該集群陣列上執(zhí)行的纖程的收集進行選擇的算法。如以下解釋的,對所選定收集的纖程進行標(biāo)識的信息隨后分散在該陣列的集群之間。在337,執(zhí)行將所選定的纖程的一個或多個收集分散在這些集群之間。圖5描繪了纖程的聲明的進一步方面,包括對于實例化纖程的纖程存儲元件的聲明和根據(jù)其調(diào)度密鑰回收纖程的進一步方面。例如,可以在包單元205(圖2)內(nèi)實現(xiàn)圖5的方面。在圖5中所描繪的示例中,一個第一實例化的纖程(如纖程實例化360)引起對所聲明的纖程數(shù)據(jù)存儲351進行分配,這可以由存儲器寫入355填入。隨著計算時間的進展,可以遞歸地使越來越多的纖程實例化,這些纖程全都引用纖程數(shù)據(jù)存儲351。然而,這些實例化纖程中的每個纖程典型地將具有一個不同的調(diào)度密鑰并且因此可以與引用不同纖程數(shù)據(jù)元素存儲的廣泛不同的纖程分組在一起。每次遞歸地使進一步的纖程實例化,就增加與那些纖程相關(guān)聯(lián)的引用計數(shù)。以下描述了這種引用的示例使用和其他操縱。圖5中描繪了這些概念,其中所聲明的數(shù)據(jù)元素存儲352和353各自被不同的纖程類群引用。圖5進一步描繪了可以通過中央纖程收集和實例化358來管理所有實例化的纖程,該中央纖程收集和實例化根據(jù)其調(diào)度密鑰形成那些纖程的收集。纖程收集和實例化358輸出收集以便在可用的計算資源內(nèi)執(zhí)行。如該圖例所描繪的,在這種執(zhí)行過程中,每個纖程可以引用其對應(yīng)的纖程數(shù)據(jù)元素,該圖例指示,針對起源于創(chuàng)建具體纖程數(shù)據(jù)元素的初始纖程實例的所有纖程,可以重復(fù)執(zhí)行過程中的讀取/寫入。圖5因此描繪了纖程計算概念的若干示例。從一個初始纖程實例發(fā)送或以另外的方式遞歸地實例化許多纖程,如圖3和圖4中所示,可以由一個線程創(chuàng)建該初始纖程實例。然而,與典型的多線程處理相比之下,每個實例化的纖程不一定被調(diào)度用于執(zhí)行,或者甚至試圖對其進行調(diào)度。相反,根據(jù)調(diào)度密鑰來收集實例化的纖程。在圖5的示例中,可以由集中調(diào)度資源完成調(diào)度,該調(diào)度資源最終在多個可獨立工作的計算集群之間分發(fā)被確定準(zhǔn)備執(zhí)行的纖程收集。不管起源于具體線程的線程的數(shù)量,每個線程最終可以訪問纖程數(shù)據(jù)的同一元素。如在一個示例中將描述的,使每個引用具體纖程數(shù)據(jù)元素的線程在集群陣列中的一個單個集群、或者其他可用并行計算資源上串行地執(zhí)行。進一步地,因為在許多這種示例中,每個計數(shù)集群可以獨立地操作用于在執(zhí)行多個線程和纖程之間進行切換,從中央纖程收集點輸出纖程的收集并不密切地控制何時執(zhí)行這種纖程,而是如以下所解釋的,該收集的纖程被存儲在對最終將在其中執(zhí)行那些纖程的集群而言適當(dāng)?shù)妮斎刖彌_器中。圖6從圖5的示例繼續(xù);圖6描繪了纖程輸入組432流,調(diào)度和工作分發(fā)抽象化430致使這些組的纖程分散在多個集群之間,圖6中描繪了其中的兩個集群。在圖6的示例中,分散包括將對該纖程和以下將描述的其他數(shù)據(jù)的引用存儲在每個集群的對應(yīng)本地存儲器內(nèi),由該集群的調(diào)度器訪問該本地存儲器。具體地,ALU集群調(diào)度器420從本地存儲器424讀取并且保持該本地存儲器,而ALU集群調(diào)度器422從本地存儲器426讀取并且保持該本地存儲器。每個ALU集群調(diào)度器420、422對在其對應(yīng)的集群416、418上執(zhí)行哪個指令流進行控制。在圖6的示例中,每個集群416至418可以讀訪問和寫訪問對應(yīng)的高速緩存410、412。此外,每個ALU集群416至418還可以寫訪問對應(yīng)的簡單高速緩存411和413。高速緩存410和412相對于對應(yīng)物簡單高速緩存411至413之間的一個操作性區(qū)別在于,預(yù)期以不同的數(shù)據(jù)頻繁地覆蓋該簡單高速緩存并且預(yù)期數(shù)據(jù)訪問之間的時間局部性比較低。相比之下,預(yù)期高速緩存410和412將時間局部性保持到更高的程度。在圖6的示例中,響應(yīng)于直接存儲器訪問建立請求,主存儲器層次405對簡單高速緩存411和412進行饋送,可以例如由工作分發(fā)抽象化430生成這些請求。然而,除了本地線程存儲之外,高速緩存411和412典型地也將被建立成用于存儲數(shù)據(jù)元素。因此,這些高速緩存將主要被控制用于線程和纖程實例化并且不基于指令特定的存儲器讀訪問要求,尤其用于纖程執(zhí)行。圖7描繪了一個集群的示例結(jié)構(gòu),例如,該集群可以用在圖1或圖2中所描繪的集群陣列中。圖7描繪了集群控制器455可以保持多個程序計數(shù)器456至458。每個程序計數(shù)器可以用于引用來自指令存儲器層次460的可用程序指令序列。在一些示例中,指令存儲器層次可以包括一個指令高速緩存,可以將最近使用的指令存儲在該高速緩存中。這種高速緩存可以實施例如最近使用的算法或者追蹤高速緩存(tracecache)途徑,其中將包括分支的指令序列保持在該高速緩存內(nèi)。追蹤高速緩存途徑可以更適用于在其中ALU可以進行推測性執(zhí)行的集群,例如,在集群控制可以包括一個預(yù)測機制以便預(yù)測是否將采取分支。無論特定的指令實施序列,例如,可以從指令存儲器層次460向多個ALU471至473提供指令462和指令464。因此,在圖7中所描繪的實現(xiàn)方式中,每個ALU執(zhí)行同一指令;然而,被提供用于該指令的執(zhí)行的數(shù)據(jù)可以變化。每個ALU傳達纖程完成信息476并且可以提出請求或以另外的方式為新的纖程475提供信息??梢酝ㄟ^纖程分配模塊479保持纖程分配狀態(tài)用于該集群。在一些示例中,這種模塊可以包括在控制器455中。這種模塊可以從全局調(diào)度器478接收狀態(tài)信息。例如,這種纖程信息可以包括有待在該集群內(nèi)執(zhí)行的新纖程的信息。可以在全局調(diào)度器和該集群之間保持的其他信息包括纖程引用計數(shù)信息,在一些示例中,可以在集群內(nèi)保持這種纖程引用計數(shù)信息,相關(guān)纖程在該集群上執(zhí)行。換言之,一種示例實現(xiàn)方式致使在一個單個集群上執(zhí)行所有相關(guān)纖程,并且在這種實現(xiàn)方式中,引用計數(shù)可以保持在用于那些相關(guān)纖程的集群內(nèi)。圖7的示例還示出了每個ALU471至473保持一個至高速緩存480的端口。高速緩存480存儲如通過線程本地存儲器485至487舉例說明的線程本地數(shù)據(jù);高速緩存480還可以存儲高速緩存全局變量488。高速緩存480還包括多個纖程存儲器位置490至492。圖7的示例還包括一個廣播輸入隊列495。在圖7的示例中,每個ALU471至473可以與用于寄存器組類似的方式使用高速緩存480,從而使得SIMD集群控制器455針對不同線程和不同纖程在逐指令的基礎(chǔ)上對指令進行調(diào)度而不引起等待時間。可以通過高速緩存一致性/控制481對高速緩存480進行管理或者以另外的方式使其變得一致。在一些實現(xiàn)方式中,可以將高速緩存480分配到有區(qū)別地管理的不同部分。在一個示例中,可以將高速緩存480分成一個高速緩存部分和一個受管理部分。根據(jù)在ALU471至473中正在處理的指令序列過程生成的讀/寫事務(wù)填充該高速緩存部分。該高速緩存部分尋求與存儲器層次的其他部分保持一致性,并且因此,至該高速緩存部分的寫入將生成一致性事務(wù)。并且,為了對該高速緩存部分提供與高速緩存一樣的行為,可以針對該高速緩存部分保持如標(biāo)簽存儲器和一致性指示等技術(shù)。該受管理部分被分配成用于特定存儲計算過程中的本地數(shù)據(jù),并且不具有與另一個存儲器或存儲器層次相一致的期望或目標(biāo)。該受管理部分不使用標(biāo)簽存儲器或一致性指示,因為在已知位置中的數(shù)據(jù)建立該受管理部分,并且不為了一致性而保持該存儲器。因此,訪問該受管理部分的正確地發(fā)起和執(zhí)行的代碼將能夠在沒有針對一致性而強制執(zhí)行的限制的情況下讀取和/或?qū)懭朐撌芄芾聿糠?。纖程存儲器490至492是這種存儲器類型的一個示例。全局調(diào)度器或工作分發(fā)可以參與對集群本地存儲器的受管理部分的建立。例如,調(diào)度抽象化430或本地存儲分配208可以執(zhí)行此功能。粗調(diào)度器222可以與本地存儲分配208互操作以協(xié)調(diào)由線程和/或纖程使用的高速緩存的分配以及這種高速緩存的將像高速緩存一樣工作的部分的分配。在一些情況下,可以像纖程的只讀存儲器一樣處理該高速緩存部分,從而使得在促成一致性中不產(chǎn)生寫回事務(wù)。圖8描繪了纖程例程在多個計算核心543至545上的收集、調(diào)度和分發(fā)執(zhí)行的動態(tài)示例。更具體地,所描繪的示例示出了可以使有待處理505的多個纖程實例化。可以通過使纖程實例化的線程或通過使派生纖程實例化的纖程來進行如所描述的這種實例化。在一些示例性實現(xiàn)方式中,線程可以使新的纖程存儲實例化,但纖程僅可以創(chuàng)建引用該實例化纖程的范圍內(nèi)的已經(jīng)實例化的纖程存儲的派生纖程。圖8描繪了每個纖程定義包括一個調(diào)度密鑰510、一個數(shù)據(jù)引用511,并且可以進一步包括優(yōu)先化信息512。數(shù)據(jù)引用511旨在是對纖程存儲的引用??梢酝茢喑稣{(diào)度密鑰510,或者其可以是顯式的。圖8進一步描繪了兩個函數(shù)模塊,一個是收集形成模塊515,而另一個是纖程存儲保持模塊516。可以作為調(diào)度器模塊的一部分執(zhí)行每個函數(shù),或者可以由分開的硬件和/或軟件提供每個函數(shù)。這些模塊接收關(guān)于有待處理505的纖程的信息??梢栽诰€程、纖程或其組合在核心543至545中執(zhí)行的過程中生成這種信息。返回的信息可以包括該纖程的標(biāo)識信息(如標(biāo)識符字符串,例如,數(shù)字)、關(guān)于調(diào)度密鑰的信息、以及關(guān)于當(dāng)執(zhí)行纖程(例如,程序計數(shù)器)時有待運行的程序的信息。然而,不是所有此信息需要被返回或傳送到收集形成模塊515。例如,在一些實現(xiàn)方式中,可以使引用纖程存儲的具體元素的所有纖程在帶有可以訪問該纖程存儲元素的本地儲存器的核心上執(zhí)行(在存儲器之間具有纖程元素的不相交分離的示例中)。因此,在這種實現(xiàn)方式中,當(dāng)引用這種存儲器元素的一個纖程使另一個纖程實例化時,可以本地地保持關(guān)于新實例化纖程的信息的某一部分。例如,對可以本地地保持對該纖程將要執(zhí)行的程序進行標(biāo)識的信息;還可以本地地保持正在被引用的纖程存儲器元素的位置(相比之下,例如,從將所有纖程數(shù)據(jù)發(fā)送到中央收集保持函數(shù)-此處為收集形成模塊515)。纖程存儲保持模塊516結(jié)合纖程存儲器建立525操作用于提供或分配核心543至545的分布式存儲器中的纖程存儲器存儲位置。如此,纖程存儲保持模塊516可以保持關(guān)于核心543至545中的當(dāng)前存儲器使用的信息。除了纖程存儲器存儲之外,這種存儲器使用可以包括線程的線程本地存儲。收集存儲518存儲纖程的與其調(diào)度密鑰相關(guān)的標(biāo)識,從而使得可以選擇并且一起輸出具有共用調(diào)度密鑰的纖程的分組。調(diào)度器533可以選擇需要輸出纖程的哪個分組,通過具體示例示出了纖程的發(fā)送包519。包519還包括一個包標(biāo)識符和一個包優(yōu)先級指示符。當(dāng)基于其匹配的調(diào)度密鑰選擇一組纖程時,調(diào)度器533可以創(chuàng)建這些元素。隨后,在輸入緩沖器540至542之間分發(fā)一個給定包的這些纖程,每個輸入緩沖器對應(yīng)于一個對應(yīng)的核心543至545。基于具體纖程所用的纖程數(shù)據(jù)元素位于這些核心的分布式存儲器之間的何處來確定纖程的分發(fā)。例如,可以基于纖程ID或基于顯式的存儲器引用來選擇這種存儲器。當(dāng)其正在執(zhí)行工作負(fù)載(其可以包括多個線程和纖程例程)的每個核心可以輸出纖程狀態(tài)信息549。這種狀態(tài)信息可以包括例如被其他纖程或線程實例化的新纖程以及關(guān)于已經(jīng)完成了哪些纖程的信息。關(guān)于完成纖程的信息可以用于使要求訪問纖程存儲的同一元素的纖程的引用計數(shù)減量;同樣,引用纖程存儲的給定元素的新纖程的實例化引起這種引用計數(shù)的增加??梢杂山o定核心(一組相關(guān)纖程在其中執(zhí)行)或由例如如圖2中所示的集中資源來保持這些引用計數(shù)。在一個示例實現(xiàn)方式中,使用基于硬件的散列來實施收集形成515,其中,可以根據(jù)對應(yīng)的纖程標(biāo)識符的散列將每個纖程開槽至一個收集中。該收集形成函數(shù)515根據(jù)調(diào)度密鑰對纖程進行分組。圖8描繪了分別與具有不斷變化的纖程數(shù)量的收集相關(guān)聯(lián)的調(diào)度密鑰520至523,每個纖程被包括在收集存儲518內(nèi)??傊?,圖8描繪了如何可以在一個分布式計算資源中并發(fā)地實例化或處理多個纖程流,而沒有關(guān)于在不同的計算資源核心之間的存儲器訪問的同步化或程序執(zhí)行的同步化的嚴(yán)格標(biāo)準(zhǔn)。相反,圖8描繪了對有待執(zhí)行的工作收集(例如,纖程)制定一個目標(biāo),即,對更大、更慢的存儲器資源的訪問的緩沖和數(shù)據(jù)存儲的持續(xù)性,在給定計算元件序列過程中將持續(xù)地使用或更新該數(shù)據(jù)。圖9用于解釋一個集群的示例操作,該集群包括根據(jù)本披露工作的多個ALU234至237。ALU集群控制器230從輸入緩存器267讀取以對有待執(zhí)行的工作的多個部分進行標(biāo)識。在本示例中,可以通過工作ID對這些工作部分進行標(biāo)識,在一個實現(xiàn)方式中,這些工作ID是程序計數(shù)器或?qū)τ写龍?zhí)行的指令的其他引用。在一個示例實現(xiàn)方式中,這些工作ID可以是針對緩沖器267中的每個纖程指示下一個有待執(zhí)行的指令的當(dāng)前程序計數(shù)器。當(dāng)然,在任何給定時間,不是可以將輸入緩沖器267內(nèi)的所有纖程拿來用于在該集群中執(zhí)行,并且在這種情況下,這些工作ID可以簡單地是有待針對那些對應(yīng)纖程執(zhí)行的纖程例程的第一指令的標(biāo)識符。因此,在本示例中,可以保持等待執(zhí)行的纖程的和已經(jīng)部分執(zhí)行的纖程的狀態(tài)信息??梢詫⑦@種程序計數(shù)器保持在這種輸入緩沖器內(nèi)的一個原因在于,在一些實現(xiàn)方式中,可以從同一程序計數(shù)器驅(qū)動該集群的所有ALU,從而使得ALU集群控制器230只可以收集將要執(zhí)行相同的下一個指令的纖程,以便執(zhí)行。對于ALU集群調(diào)度器可以在執(zhí)行過程中中斷纖程例程的實現(xiàn)方式(如在逐指令基礎(chǔ)上)而言,這種狀態(tài)信息更加相關(guān)。然而,在其他實現(xiàn)方式中,可以對來自輸入緩沖器267的還沒有開始執(zhí)行的一組纖程例程進行調(diào)度并且可以在沒有中斷和不同程序流的執(zhí)行的情況下對其進行完全執(zhí)行。在任一種情況下,可以有區(qū)別地處理線程,因為ALU集群控制器可以中斷線程的執(zhí)行,如出于執(zhí)行從輸入緩沖器267中選定的纖程例程的目的。例如,可以中斷正在執(zhí)行的線程以執(zhí)行纖程例程。圖9進一步描繪了從輸入緩沖器267中選定的工作ID可以被分組到一個本地纖程調(diào)度輸出端560中。在本示例中,對于纖程而言,每個帶有匹配的工作ID的纖程可以被包括在輸出端560中。每個纖程引用可以用于從線程本地和纖程存儲240中檢索纖程存儲數(shù)據(jù)的具體元素并且向這些ALU234至237中的不同ALU提供該對應(yīng)的纖程存儲數(shù)據(jù)元素。類似地,包括在調(diào)度輸出端560中的每個纖程可以引用存儲在簡單高速緩存260中的一個或多個數(shù)據(jù)元素。在一個示例中,每個纖程可以引用簡單高速緩存260中的不同數(shù)據(jù)元素,并且在不同實現(xiàn)方式中,被調(diào)度用于在ALU234至237上執(zhí)行的這些纖程中的多個纖程可以引用來自簡單高速緩存260的同一數(shù)據(jù)元素。因此,每個ALU234至237執(zhí)行同一控制線程,但可以在來自簡單高速緩存260的不同數(shù)據(jù)元素中的不同纖程數(shù)據(jù)元素上操作。每個ALU可以進一步輸出有待存儲在線程本地和纖程存儲240中的信息。這些寫入是針對纖程存儲的對應(yīng)元素,并且因為沒有兩個引用同一纖程存儲元素的纖程被調(diào)度用于由ALU235至237并行執(zhí)行,所以在這種實現(xiàn)方式中,針對這種纖程存儲位置,用于線程本地和纖程存儲240的保護機制是不必要的。還可以從ALU234至237向ALU集群控制器230提供關(guān)于纖程調(diào)度和狀態(tài)的信息564。反過來,ALU集群控制器230可以對纖程存儲位置計數(shù)565進行更新以將由已經(jīng)執(zhí)行的纖程例程創(chuàng)建的新纖程計算在內(nèi)并且還將現(xiàn)在已經(jīng)完成的纖程計算在內(nèi)。然而,應(yīng)指出的是,在許多實現(xiàn)方式中,ALU集群控制器不對用已經(jīng)創(chuàng)建的新纖程填充其輸入緩沖器267進行控制。相反,用中央控制器填充輸入緩沖器267,該中央控制器還填充了其他ALU集群(此處未描繪)的一個或多個其他輸入緩沖器。圖10描繪了一種情況:計算集群的本地存儲器存儲多個線程本地變量和多個纖程數(shù)據(jù)存儲元素,例如,線程588使用存儲器589中的該本地存儲部分590。預(yù)期在線程建立過程中分配本部分作為該線程588能夠使用的最大量存儲器。圖10描繪了纖程582和584的兩個不同族,兩者引用纖程存儲591的不同位置,而每族的成員引用纖程存儲的同一元素。圖10進一步描繪了給定纖程(例如,纖程584)族的成員進行的存儲器引用將要這些相關(guān)纖程的遞歸實例化的過程中發(fā)生變化。在本示例中,對主存儲器587進行這些存儲器引用585。進一步地,本示例示出了這些存儲器引用可以在規(guī)則跨步或區(qū)間588上。在一些實現(xiàn)方式中,這些存儲器引用可以用作調(diào)度密鑰來收集不同族的纖程,例如,可以基于這些存儲器引用的匹配將來自纖程582和纖程584的纖程收集在一起。圖10進一步描繪了計算資源592,這些計算資源可以被配置成用于執(zhí)行纖程和友元(friends)(如以上解釋的)并且是基于對在計算592中并發(fā)執(zhí)行的線程和纖程的控制流進行追蹤的程序計數(shù)器。如將從以上理解到的,可以將存儲器589分配給多個不同的管理方案??梢宰鳛楦咚倬彺婀芾泶鎯ζ?89的一部分,其中,如最近使用的高速緩存管理策略可以對什么數(shù)據(jù)存儲在該存儲器中進行控制。并且,存儲器589的這種高速緩存部分將具有與存儲器層次中其他存儲器組件(如主存儲器587)相一致的目的。這種高速緩存部分可以被安排成交叉存儲器或該高速緩存部分內(nèi)的其他合適的組織途徑。圖10描繪了這種存儲器部分作為高速緩存部分594??梢允狗峙渲粮咚倬彺娌糠?94的存儲器598的量值改變或變化。在一些實現(xiàn)方式中,該變化可以動態(tài)地發(fā)生;在其他情況下,可以在計算的建立階段作出該變化;如在計算工作負(fù)載的兩個獨特的部分之間。例如,在圖形處理工作負(fù)載中,可以在幀的渲染之間進行重新分配。其他可以引起重新分配的條件是線程(例如,線程588)完成、空出附加存儲器。除了高速緩存部分594以外,存儲器589還包括一個管理部分,其中,纖程存儲591是一個示例。該管理部分具有與高速緩存部分594的特征不相同的特征。該管理部分不具有與存儲器層次中的其他存儲器(例如,存儲器587)相一致的期望或目的。應(yīng)指出的是,該管理部分中的數(shù)據(jù)可以被寫出到存儲器587,或者以另外的方式可用于被非本地計算訪問。然而,在可以包括至該存儲器的許多讀取和寫入的本地計算序列之后出現(xiàn)寫入或可訪問性,不針對該內(nèi)產(chǎn)生成存儲器一致性操作??梢曰诖_定與另一個執(zhí)行或調(diào)度纖程存在存儲器沖突來調(diào)度纖程以開始執(zhí)行,或者可以基于這種存儲器沖突檢查而類似地發(fā)送來自纖程的指令或者將其暫留而不進行發(fā)送。在面向線程的計算中,發(fā)送來自線程的指令以便執(zhí)行,并且當(dāng)一個指令發(fā)起將會對一個不同指令造成危害的存儲器事務(wù)時,通過對存儲器位置進行鎖定來保持存儲器正確性。該不同指令可以開始執(zhí)行,但該線程(該指令是其一部分)將停止,等待消除該危害。圖11描繪了一個進程的多個部分,該進程可以由這些披露的實現(xiàn)方式中提供的集中控制器執(zhí)行。所描繪的進程包括接收(602)纖程例程的規(guī)范。基于該規(guī)范,可以對主存儲器讀操作進行標(biāo)識(604)。可以從該主存儲器讀操作對存儲器地址或其一部分進行標(biāo)識(606);所標(biāo)識的存儲器地址或其一部分可以用作調(diào)度密鑰。這種調(diào)度密鑰的一種用途是對調(diào)度密鑰或其多個部分進行比較/使其匹配(608)以便將纖程收集(610)在一起。選擇(612)多組纖程以便給予如優(yōu)先級、收集豐滿度等標(biāo)準(zhǔn)、以及啟發(fā)法進行調(diào)度。如以上解釋的,可以或者由線程或或者另一個纖程單獨地使纖程實例化。然而,發(fā)送纖程以便在多個組中執(zhí)行。如果希望針對這種纖程分組實施優(yōu)先化方案,則圖12中舉例說明了這種優(yōu)先化的一種方法。圖12描繪了有待分組646的多個纖程是可用的,可以根據(jù)其纖程密鑰(在此也稱為調(diào)度密鑰)來收集或存儲(623)這些纖程。每個纖程還可以與一個單獨優(yōu)先級相關(guān)聯(lián),可以獲得(638)該優(yōu)先級。當(dāng)確定了這種纖程的分組時,還可以確定(640)每個確定分組的優(yōu)先級(642)。還可以確定(642)包標(biāo)識符644??梢蕴峁└鞣N方法用于基于包括在該分組內(nèi)的單獨纖程的優(yōu)先級確定纖程的分組的優(yōu)先級。在一個示例中,這些單獨纖程優(yōu)先級的平均值可以用于建立一個組優(yōu)先級。在另一個示例中,當(dāng)具有特別高優(yōu)先級的纖程可以對該組的總體優(yōu)先級具有比簡單平均值將提供的高得多的影響時,可以使用加權(quán)平均值。在其他實現(xiàn)方式中,分配給纖程分組的優(yōu)先級也會受到在系統(tǒng)內(nèi)執(zhí)行的線程的當(dāng)前狀態(tài)的影響。為了促成這種示例變化,圖12還描繪了包的纖程所使用的纖程數(shù)據(jù)的所期望的存儲位置可以用于確定該包的優(yōu)先級。例如,如果存儲給定包中的纖程的纖程數(shù)據(jù)的多個存儲器正接近容量,則可以提高這種包的優(yōu)先級。值得注意地,由于纖程存儲已經(jīng)被分配用于纖程(除了新實例化的纖程族之外),所以不一定需要更多的本地存儲以便增加同一族內(nèi)的纖程的數(shù)量。圖13描繪了以上的一些披露的概述中的進程。所描繪的進程包括:確定(682)纖程的收集以調(diào)度用于執(zhí)行;發(fā)送(684)表示所確定纖程收集的包。在處理集群的不同輸入隊列之間分發(fā)(686)這種纖程包,這些處理集群將基于其對應(yīng)的輸入隊列的內(nèi)容執(zhí)行該計算,并且其中已經(jīng)為執(zhí)行對線程進行了調(diào)度或標(biāo)符號。圖14進一步解釋了在示例內(nèi)計算的這種纖程的某些方面,在該示例中,收集存儲器703存儲各種纖程的信息,根據(jù)纖程是哪個收集中的成員來組織這些纖程。通常期望一個纖程只存在于一個收集內(nèi);然而,將期望引用同一纖程數(shù)據(jù)元素的纖程可以存在于收集存儲器703內(nèi)的大量收集中。為了促進該示例,選擇收集705、707、709和711用于發(fā)送。響應(yīng)于這種選擇,發(fā)起對主存儲器層次701的事務(wù),向線程本地和纖程存儲727、729和731提供這些事務(wù)的結(jié)果。然而,在輸入緩沖器721、723和725之間發(fā)送和分發(fā)所選定的收集。在一個示例中,這種分發(fā)可以基于每個纖程的標(biāo)識符的一部分,該標(biāo)識符部分反過來可以與線程本地和纖程存儲的存儲器地址范圍相關(guān)。所描繪的示例還示出了,對于任何給定的纖程包而言,通常期望平均地在不同的計算集群之間分發(fā)這些纖程,并且其不集中到這些集群的僅一個子集中。圖15描繪了以上示例中所示的輸入緩沖器的實現(xiàn)方式的示例。圖15描繪了有待在多個計算集群的多個輸入緩沖器之間分發(fā)的新收集742。每個輸入緩沖器可以保持一個每纖程優(yōu)先級750。最初,這種每纖程優(yōu)先級可以基于包優(yōu)先級,但可以被本地集群控制器更新。此外,可以提供纖程的一種老化機制,其中,可以將這種老化輸入到纖程優(yōu)先級選擇中。在上下文中還可以將圖15理解成纖程計算的實現(xiàn)方式允許集中選擇將選擇哪些計算部分用于在計算時間的一般窗口內(nèi)執(zhí)行,并且可以完成和緩沖將被那些計算部分需要的主存儲器訪問,其結(jié)果是這種主存儲器訪問以分發(fā)的方式存儲在將執(zhí)行這些計算部分的計算集群之間。然而,在每個計算集群內(nèi),可以提供什么指令執(zhí)行以及以什么順序的廣泛自主權(quán),其中,由本地控制器處理這種本地調(diào)度,以將特定于該控制器的條件考慮在內(nèi)并且避免這些計算集群之間的協(xié)調(diào)引起的開銷。圖16描繪了根據(jù)本披露的示例進程的多個方面。在780,接收纖程例程的規(guī)范,并且在782,對該纖程例程內(nèi)的主存儲器讀操作進行標(biāo)識。在784,將存儲器地址(或其一部分)標(biāo)識為調(diào)度密鑰??梢葬槍Σ煌睦w程多次執(zhí)行進程部分780、782和784。在786,對不同纖程的調(diào)度密鑰進行比較。在788,根據(jù)其調(diào)度密鑰回收纖程。在790,根據(jù)如準(zhǔn)備就緒的標(biāo)準(zhǔn)選擇纖程的一個或多個收集用于執(zhí)行。準(zhǔn)備就緒的標(biāo)準(zhǔn)可以包括多個方面,如優(yōu)先級和數(shù)目啟發(fā)法。期望纖程通過寫回到本地纖程存儲來施加影響或輸出,并且不針對共享存儲器資源進行仲裁。進一步地,在許多實現(xiàn)方式中,對纖程例程進行編碼以避免對另一個例程進行調(diào)用,該另一個例程返回一個值并且引起該纖程例程無限期停止,從而等待返回這種值。因此,針對語法分量和對纖程進行實例化或以其他方式進行調(diào)用,在這些實現(xiàn)方式中,還不需要停止或等待該纖程將任何值返回至該調(diào)用線程或其他纖程。如此,完成任何具體纖程的執(zhí)行的時間不那么關(guān)鍵,因為不需要停止其他計算流程來等待完成該纖程。在以上許多示例實現(xiàn)方式中描述了調(diào)度密鑰。在一些實現(xiàn)方式中,并且在一些情況下,取決于正在執(zhí)行的工作負(fù)載的性質(zhì),調(diào)度密鑰可以被壓縮或以另外的方式用速記符號被引用。光線追蹤的示例工作負(fù)載將被用作一個示例。在這種示例中,父光線追蹤線程可以針對其想要在場景中追蹤的每條光線輸出一個不同的纖程。因此,一些線程可以輸出若干個纖程,一些線程可以輸出數(shù)千萬或數(shù)億、或數(shù)十億的纖程。在一些情況下,每個線程可以最初以同一個調(diào)度密鑰開始。在一個示例中,這種調(diào)度密鑰可以引用對3-D場景進行細(xì)分的加速結(jié)構(gòu)的第一元素的起始存儲地址??梢杂靡?guī)則的間隔將該結(jié)構(gòu)的元素存儲在存儲器中(例如,可以用四倍字長存儲每個元素)。如此,可以將某種纖程例程建立成具有一個默認(rèn)調(diào)度密鑰;例如,加速結(jié)構(gòu)遍歷纖程例程可以具有該加速結(jié)構(gòu)的頭元素作為默認(rèn)。因此,使這種纖程實例化的線程不需要顯式地對該位置進行標(biāo)識。加速結(jié)構(gòu)的示例包括但不限于包圍體積層次,如球體和矩形層次以及kD樹。例如,在均勻的球體層次中,這種結(jié)構(gòu)的元素為球體。如果該加速結(jié)構(gòu)是同構(gòu)的,則該結(jié)構(gòu)中的葉節(jié)點包圍圖元;異構(gòu)結(jié)構(gòu)可以具有包圍其他加速結(jié)構(gòu)元素和圖元的元素。以上描繪和描述了各種結(jié)構(gòu)、設(shè)備、組件和其他組成元件,并且相互關(guān)系允許數(shù)據(jù)和其他信息在它們兩者之間和兩者以上之間流動,并且描述了它們的功能和用途。這些是用于執(zhí)行本披露中歸屬與它們的功能和用途的裝置。任何方法的代碼可以存儲在非瞬態(tài)計算機可讀介質(zhì)(如固態(tài)驅(qū)動器、硬盤驅(qū)動器、CD-ROM和其他光存儲裝置)中和瞬態(tài)地存儲在非易失性存儲器中。計算機可讀介質(zhì)還可以包括通信信號。當(dāng)這種代碼體現(xiàn)在通信信號中并且由計算機讀取和處理該信號時,計算機將該信號及其物理介質(zhì)用作計算機可讀介質(zhì)。計算機可執(zhí)行指令包括例如指令和數(shù)據(jù),其致使或以另外的方式配置通用計算機、專用計算機或?qū)S锰幚碓O(shè)備執(zhí)行某個功能或功能的組合。這些計算機可執(zhí)行指令可以是例如二進制指令、中間格式指令(如匯編語言或源代碼)。在此描述的API的一些方面可以被實現(xiàn)作為程序、函數(shù)、或?qū)@種程序和函數(shù)的調(diào)用。本說明書暗示對可以用于實現(xiàn)或提供被描述為通過這些程序或函數(shù)可用的功能性的編程方法學(xué)沒有限制,只要軟件、硬件或其混合物為程序員提供通過因此提供的接口訪問這種函數(shù)性的能力。關(guān)于實現(xiàn)方式中需要調(diào)用執(zhí)行這些函數(shù)的什么代碼,這些名稱沒有暗示任何要求。在一些示例中,用于執(zhí)行線程和纖程的計算資源可以大部分是無差別的。相反,可以通過中央控制器實現(xiàn)在此描述的纖程計算特征中的許多特征,該中央控制器對纖程進行分組以便在提供這些計算資源的計算資源輸入隊列之間發(fā)送和分散,并且需要給定纖程存儲元素的纖程的協(xié)調(diào)和計數(shù)仍然存在。如從這些披露中認(rèn)識到的,其中可以使用纖程計算的一種示例情況是這樣一種情況:大量第一類型數(shù)據(jù)元素(其不全都已知為先驗知識)需要與大的且預(yù)先確定的數(shù)據(jù)集一起處理或使用。在一些示例情況下,一些第一類型數(shù)據(jù)元素與所預(yù)先確定的數(shù)據(jù)集的一部分一起的處理影響那些第一類型數(shù)據(jù)元素與所預(yù)先確定的數(shù)據(jù)集的其他部分一起處理的程度。所預(yù)先確定的數(shù)據(jù)集也可以不同,如相對不頻繁地被更新。在一個示例圖形應(yīng)用程序中,可以一秒更新所預(yù)先確定的數(shù)據(jù)集幾百次并且其可以包括數(shù)以百萬計的項目,其一秒可以被訪問數(shù)百萬或數(shù)十億次。通常,用于線程計算的集中調(diào)度器可以基于所期望的計算吞吐量的最大化而不是基于明確提供任何具體纖程的優(yōu)先化來對纖程收集進行調(diào)度。以上描述的各種示例僅出于說明目的而進行提供,并且不應(yīng)當(dāng)被解釋為限制性的。例如,僅呈現(xiàn)了光線追蹤行為的限制示例,并且應(yīng)理解到實際實現(xiàn)方式涉及到許多更多的光線以及光線的經(jīng)常更加并發(fā)的處理。可以從該角度采用和理解在此的披露。此外,分離開的盒或所展示系統(tǒng)的功能元件的所展示的分離暗示不要求這種功能的物理分離,因為可以通過消息發(fā)送、函數(shù)調(diào)用、共享存儲器空間等進行這種元件之間的通信,而沒有任何這種物理分離。更普遍地,普通技術(shù)人員將能夠?qū)⑴c編程語義相關(guān)的披露適配用于各種其他光線追蹤/光線著色實現(xiàn)方式,并且沒有暗示對從系統(tǒng)、方法和用于解釋其示例的其他披露存在的其應(yīng)用的限制。附錄