多處理器上的并行運行時執(zhí)行的制作方法
【專利摘要】多處理器上的并行運行時執(zhí)行。對調(diào)度隊列中的多個可執(zhí)行體進(jìn)行調(diào)度以在諸如CPU或GPU之類的一個或多個物理計算裝置中并發(fā)地執(zhí)行的方法和設(shè)備。對與所述一個或多個物理計算裝置不同的一種類型的物理計算裝置,從具有現(xiàn)有可執(zhí)行體的源在線編譯一個或多個可執(zhí)行體。判斷與所調(diào)度的可執(zhí)行體相應(yīng)的元素之間的依賴關(guān)系來選擇在多于一個的物理計算裝置中通過多個線程所要并發(fā)地執(zhí)行的可執(zhí)行體。如果GPU忙于圖形處理線程,則被初始化用于在物理計算裝置的GPU中執(zhí)行可執(zhí)行體的線程被初始化用于在物理計算裝置中的另一CPU中的執(zhí)行。API函數(shù)的現(xiàn)有可執(zhí)行體和源被存儲在API庫中以在多個物理計算裝置中執(zhí)行包括現(xiàn)有可執(zhí)行體和從源在線編譯出的可執(zhí)行體的多個可執(zhí)行體。
【專利說明】多處理器上的并行運行時執(zhí)行
[0001]本申請是申請日為2008年4月9日、申請?zhí)枮?00880011684.8的中國專利申請“多處理器上的并行運行時執(zhí)行”的分案申請。
[0002]相關(guān)申請的交叉引用
[0003]本申請與Aaftab Munshi等在2007年4月11日提交的標(biāo)題為“DATA PARALLELCOMPUTING ON MULTIPLE PROCESSORS”(多處理器上的數(shù)據(jù)并行計算)的美國臨時專利申請N0.60/923,030 和 Aaftab Munshi 在 2007 年 4 月 20 日提交的標(biāo)題為 “PARALLEL RUNTIMEEXECUTION ON MULTIPLE PROCESSORS”(多處理器上的并行運行時執(zhí)行)的美國臨時專利申請N0.60/925,620相關(guān),并且要求這兩者的權(quán)益,這兩者通過引用被結(jié)合于此。
【技術(shù)領(lǐng)域】
[0004]本發(fā)明一般地涉及數(shù)據(jù)并行計算,更具體而言,本發(fā)明涉及跨CPU(中央處理單元)和GPU(圖形處理單元)兩者的數(shù)據(jù)并行運行時執(zhí)行。
【背景技術(shù)】
[0005]隨著GPU繼續(xù)演進(jìn)成高性能并行計算裝置,越來越多的應(yīng)用被寫入以在與通用計算裝置類似的GPU中執(zhí)行數(shù)據(jù)并行計算。如今,這些應(yīng)用被設(shè)計成在使用供應(yīng)商特定接口的特定GPU上運行。因此,它們既不能在數(shù)據(jù)處理系統(tǒng)具有GPU和CPU兩者時平衡(leverage) CPU,也不能在這樣的應(yīng)用正運行在來自不同供應(yīng)商的GPU上時被平衡。
[0006]然而,隨著越來越多的CPU包括多個核心來執(zhí)行數(shù)據(jù)并行模型的計算,通過可用的CPU和/或GPU的任一者可以支持越來越多的處理任務(wù)。傳統(tǒng)上,GPU和CPU是通過相互不兼容的分開的編程環(huán)境來配置的。大多數(shù)GPU需要供應(yīng)商特定的專用程序。結(jié)果,應(yīng)用很難在處理資源方面平衡CPU和GPU兩者,例如具有數(shù)據(jù)并行計算能力的GPU連同多核CPU。
[0007]因此,需要現(xiàn)代的數(shù)據(jù)處理系統(tǒng)來克服以上問題以允許應(yīng)用在能夠執(zhí)行任務(wù)的任何可用處理資源(例如CPU或一個或多個GPU)中執(zhí)行該任務(wù)。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的一個實施例包括響應(yīng)于來自主處理單元中運行的應(yīng)用的API請求,加載用于該應(yīng)用的數(shù)據(jù)處理任務(wù)的一個或多個可執(zhí)行體的方法和設(shè)備。響應(yīng)于來自該應(yīng)用的另一 API請求,所加載的可執(zhí)行體中的一個被選擇以在附接到該主處理單元的諸如CPU或GPU之類的另一處理單元中被執(zhí)行。
[0009]在一個可替換實施例中,主處理單元中運行的應(yīng)用程序生成API請求,以用來加載用于數(shù)據(jù)處理任務(wù)的一個或多個可執(zhí)行體。然后,由該應(yīng)用程序生成第二 API,用來選擇所加載的可執(zhí)行體中的一個以用于在附接到該主處理單元的諸如CPU或GPU之類的另一處理單元中執(zhí)行。
[0010]在一個可替換實施例中,用于目標(biāo)處理單元的源在運行時期間基于加載到處理單元的可執(zhí)行體被編譯。處理單元和目標(biāo)處理單元可以是中央處理單元(CPU)或圖形處理單元(GPU)。處理單元和目標(biāo)處理單元之間的差異被檢測以從所加載的可執(zhí)行體取出源。
[0011 ] 在一個可替換實施例中,響應(yīng)于來自應(yīng)用的API請求,利用包括多個可執(zhí)行體的新任務(wù)來更新與諸如CPU或GPU之類的多個處理單元相關(guān)聯(lián)的任務(wù)隊列。判斷對在多個處理單元中執(zhí)行來自隊列的新任務(wù)進(jìn)行調(diào)度的條件?;谒袛喑龅臈l件,選擇與新任務(wù)相關(guān)聯(lián)的多個可執(zhí)行體中的一個以用于執(zhí)行。
[0012]在一個可替換實施例中,響應(yīng)于來自應(yīng)用的API請求,從該應(yīng)用加載用于執(zhí)行數(shù)據(jù)處理功能的源,以在諸如CPU或GPU之類的多個目標(biāo)數(shù)據(jù)處理單元的一個或多個中執(zhí)行可執(zhí)行體。自動確定多種類型的目標(biāo)數(shù)據(jù)處理單元?;谀繕?biāo)處理單元的一個或多個中所要執(zhí)行的所確定的類型來編譯可執(zhí)行體。
[0013]在一個可替換實施例中,源和針對多個處理單元編譯出的一個或多個相應(yīng)的可執(zhí)行體被存儲在API庫中來實現(xiàn)API函數(shù)。響應(yīng)于從主處理器(host processor)中運行的應(yīng)用對API庫的請求,從API庫中取出該源和該API函數(shù)的一個或多個相應(yīng)可執(zhí)行體。針對這多個單元中未包括的附加處理單元,從所取出的源在線編譯出附加可執(zhí)行體。根據(jù)API函數(shù),在附加處理單元中和一個或多個處理單元中一起并發(fā)地執(zhí)行附加可執(zhí)行體和一個或多個所取出的可執(zhí)行體。
[0014]在一個可替換實施例中,在主處理器上接收API調(diào)用來執(zhí)行應(yīng)用,該應(yīng)用具有多個用于執(zhí)行的線程。主處理器耦合CPU和GPU。這多個線程被異步調(diào)度以用于CPU和GPU上的并行執(zhí)行。如果GPU忙于圖形處理線程,則被調(diào)度要在GPU上執(zhí)行的線程可以在CPU中被執(zhí)行。
[0015]在一個可替換實施例中,在主處理器上接收API調(diào)用來執(zhí)行應(yīng)用,該應(yīng)用具有多個用于執(zhí)行的線程。主處理器耦合到CPU和GPU。這多個線程被異步初始化以用于CPU和GTO上的并行執(zhí)行。如果GPU忙于圖形處理線程,則被初始化要在GPU上執(zhí)行的線程可以在CPU中被執(zhí)行。
[0016]從附圖和以下詳細(xì)描述中,本發(fā)明的其他特征將顯而易見。
【專利附圖】
【附圖說明】
[0017]在附圖的示圖中通過示例而非限制來圖示本發(fā)明,相似的標(biāo)號表示相似的元素,附圖中:
[0018]圖1是圖示出用于配置包括CPU和/或GPU的計算裝置來執(zhí)行應(yīng)用的數(shù)據(jù)并行計算的系統(tǒng)的一個實施例的框圖;
[0019]圖2是圖示出具有多個并行操作來并發(fā)地執(zhí)行多個線程的計算處理器的計算裝置的示例的框圖;
[0020]圖3是圖示出經(jīng)由計算裝置標(biāo)識符被配置為邏輯計算裝置的多個物理計算裝置的一個實施例的框圖;
[0021]圖4是圖示出通過匹配從應(yīng)用接收到的能力需求來利用計算裝置標(biāo)識符配置多個物理計算裝置的處理的一個實施例的流程圖;
[0022]圖5是圖示出在邏輯計算裝置中執(zhí)行計算可執(zhí)行體的處理的一個實施例的流程圖;[0023]圖6是圖示出加載可執(zhí)行體的運行時處理的一個實施例的流程圖,該處理包括針對被確定來執(zhí)行該可執(zhí)行體的一個或多個物理計算裝置來編譯源;
[0024]圖7是圖示出從執(zhí)行隊列中選擇計算內(nèi)核執(zhí)行實例以在與和該執(zhí)行實例相關(guān)聯(lián)的邏輯計算裝置相對應(yīng)的一個或多個物理計算裝置中執(zhí)行的處理的一個實施例的流程圖;
[0025]圖8A是圖示出建立API (應(yīng)用編程接口 )庫的處理的一個實施例的流程圖,該處理根據(jù)多個物理計算裝置將用于一個或多個API的多個可執(zhí)行體和源存儲在庫中;
[0026]圖8B是圖示出應(yīng)用執(zhí)行多個可執(zhí)行體中的一個和基于API請求從API庫所取出的相應(yīng)源的處理的一個實施例的流程圖;
[0027]圖9是圖示出多個物理計算裝置中所要執(zhí)行的計算內(nèi)核可執(zhí)行體的計算內(nèi)核源的示例的樣本源代碼;
[0028]圖10是圖示出通過調(diào)用API來配置用于在多個物理計算裝置中執(zhí)行多個可執(zhí)行體中的一個的邏輯計算裝置的示例的樣本源代碼;
[0029]圖11圖示出可以與在此所述的實施例結(jié)合使用的、具有多個CPU和GPU(圖形處理單元)的典型計算機(jī)系統(tǒng)的一個示例。
【具體實施方式】
[0030]在此描述用于多處理器上的數(shù)據(jù)并行計算的方法和設(shè)備。在以下描述中,闡述了大量特定細(xì)節(jié)以提供對本發(fā)明實施例的透徹說明。然而,對于本領(lǐng)域技術(shù)人員顯而易見的是,可以實行本發(fā)明實施例而不用這些特定細(xì)節(jié)。在其它實例中,沒有詳細(xì)示出公知的組件、結(jié)構(gòu)和技術(shù)以免使對本描述的理解模糊。
[0031]在說明書中,提及“一個實施例”或“實施例”意味著結(jié)合該實施例描述的具體特征、結(jié)構(gòu)或特征可以包括在本發(fā)明的至少一個實施例中。在說明書中的各個地方出現(xiàn)的短語“在一個實施例中”不一定涉及同一個實施例。
[0032]通過包括硬件(例如,電路、專用邏輯等)、軟件(例如在通用計算機(jī)系統(tǒng)或?qū)S脵C(jī)器上運行的軟件)或這兩者的組合的處理邏輯來執(zhí)行以下示圖中所描述的處理。盡管以下根據(jù)某些順序操作來描述處理,但是應(yīng)當(dāng)明白,可以以不同的順序來執(zhí)行所述操作中的某些操作。并且,可以并行地而不是順序地執(zhí)行某些操作。
[0033]圖形處理單元(GPU)可以是執(zhí)行諸如2D、3D圖形操作之類的高效圖形操作和/或數(shù)字視頻相關(guān)功能的專用圖形處理器。GPU可以包括用來執(zhí)行諸如位塊傳輸(blitter)操作、紋理映射、多邊形渲染(rendering)、像素著色(shading)和頂點著色之類的圖形操作的專門的(可編程的)硬件。已知GPU從幀緩沖器中獲取數(shù)據(jù)并且將像素混合到一起來將圖像背景渲染到該幀緩沖器中以用于顯示。GPU還可以控制該幀緩沖器并且允許該幀緩沖器被用來刷新諸如CRT或LCD顯示器之類的顯示器,CRT或LCD顯示器是需要至少20Hz的速率的刷新(例如,每1/30秒,利用來自幀緩沖器的數(shù)據(jù)刷新該顯示器)的短存留顯示器。通常,GPU可以從與GPU耦合的(PU獲取圖形處理任務(wù),通過顯示控制器向顯示裝置輸出光柵圖形圖像。在本說明書中提及的“GPU”可以是如Lindholdm等的美國專利 N0.7015913 “Method and Apparatus for Multitheraded Processing of Data In aProgrammable Graphics Processor”(用于可編程圖形處理器中的數(shù)據(jù)的多線程處理的方法和設(shè)備)和 Swan 等的美國專利 N0.6970206 “Method for Deinterlacing InterlacedVideo by A Graphics Processor”(用于通過圖形處理器對交織后的視頻進(jìn)行去交織的方法)中所描述的圖像處理器或可編程圖形處理器,這兩個專利被通過引用結(jié)合于此。
[0034]在一個實施例中,多個不同類型的處理器(例如CPU或GPU)可以并發(fā)地執(zhí)行一個或多個應(yīng)用的數(shù)據(jù)并行處理任務(wù)來增大數(shù)據(jù)處理系統(tǒng)中可用處理資源的利用效率。數(shù)據(jù)處理系統(tǒng)的處理資源可以是基于多個物理計算裝置的。物理計算裝置可以是CPU或GPU。在一個實施例中,數(shù)據(jù)并行處理任務(wù)可以委托給多種類型的處理器,例如能夠執(zhí)行該任務(wù)的CPU或GPU。數(shù)據(jù)處理任務(wù)可以從處理器要求某些特定處理能力。處理能力例如可以是專用紋理(texturing)硬件支持、雙精度浮點運算、專用本地存儲器、流數(shù)據(jù)緩存或同步原語(synchronization primitives)。不同類型的處理器可以提供不同但是重疊的處理能力集。例如,CPU和GPU兩者都能執(zhí)行雙精度浮點計算。在一個實施例中,應(yīng)用能夠平衡可用的CPU或GPU中的任一者來執(zhí)行數(shù)據(jù)并行處理任務(wù)。
[0035]在另一實施例中,可以在運行時期間自動執(zhí)行對用于數(shù)據(jù)并行處理任務(wù)的多種不同類型的處理資源的選擇和分配。應(yīng)用可以通過API (應(yīng)用程序接口)向數(shù)據(jù)處理系統(tǒng)的運行時平臺發(fā)送包括數(shù)據(jù)處理任務(wù)所希望的能力需求列表的提示。相應(yīng)地,運行時平臺可以確定多個當(dāng)前可用的、具有與所接收到的提示相匹配的能力的CPU和/或GPU來委托該應(yīng)用的數(shù)據(jù)處理任務(wù)。在一個實施例中,該能力需求列表可以依賴于基礎(chǔ)的數(shù)據(jù)處理任務(wù)。能力需求列表可以適用例如包括來自不同供應(yīng)商的具有不同版本的GPU和多核CPU的不同處理器集合。因此,可以防止應(yīng)用提供以特定類型CPU或GPU為目標(biāo)的程序。
[0036]圖1是圖示出用于配置包括CPU和/或GPU的計算裝置來執(zhí)行應(yīng)用的數(shù)據(jù)并行計算的系統(tǒng)的一個實施例的框圖。系統(tǒng)100可以實現(xiàn)并行計算體系結(jié)構(gòu)。在一個實施例中,系統(tǒng)100可以是包括一個或多個主處理器的圖形系統(tǒng),這些主處理器通過數(shù)據(jù)總線113與一個或多個中央處理器117和諸如媒體處理器115之類的一個或多個其它處理器耦合。多個主處理器可以在托管系統(tǒng)(hosting system) 101中被連到一起。這多個中央處理器117可以包括來自不同供應(yīng)商的多核CPU。媒體處理器可以是具有專用紋理渲染硬件的GPU。另一媒體處理器可以是支持專用紋理渲染硬件和雙精度浮點體系結(jié)構(gòu)兩者的GPU。多個GPU可以連接到一起以用于可擴(kuò)縮連接接口(SLI)或CrossFire配置。
[0037]在一個實施例中,托管系統(tǒng)101可以支持軟件棧,軟件棧包括軟件棧組件,例如應(yīng)用103、計算平臺層111、計算運行時層109、計算編譯器107和計算應(yīng)用庫105。應(yīng)用103可以通過API (應(yīng)用程序接口)調(diào)用與其它棧組件連接??梢詾橥泄芟到y(tǒng)101中的應(yīng)用103并發(fā)地運行一個或多個線程。計算平臺層111可以維護(hù)數(shù)據(jù)結(jié)構(gòu)、或計算裝置數(shù)據(jù)結(jié)構(gòu),存儲每個附接的物理計算裝置的處理能力。在一個實施例中,應(yīng)用可以通過計算平臺層111來取出有關(guān)托管系統(tǒng)101的可用處理資源的信息。應(yīng)用可以通過計算平臺層111來選擇和指定用于執(zhí)行處理任務(wù)的能力需求。因此,計算平臺層111可以針對該處理任務(wù)來確定物理計算裝置的配置以從所附接的CPU117和/或GPU115中分配和初始化處理資源。在一個實施例中,計算平臺層111可以針對與所配置的一個或多個實際的物理計算裝置相對應(yīng)的應(yīng)用來生成一個或多個邏輯計算裝置。
[0038]計算運行時層109可以根據(jù)所配置的用于應(yīng)用103的處理資源,例如一個或多個邏輯計算裝置來管理處理任務(wù)的執(zhí)行。在一個實施例中,執(zhí)行處理任務(wù)可以包括創(chuàng)建代表處理任務(wù)的計算內(nèi)核對象和分配例如保存可執(zhí)行體、輸入/輸出數(shù)據(jù)等的存儲資源。被加載用于計算內(nèi)核對象的可執(zhí)行體可以是計算內(nèi)核對象。計算可執(zhí)行體可以被包括在諸如CPU或GPU之類的計算處理器中所要執(zhí)行的計算內(nèi)核對象中。計算運行時層109可以與所分配的物理裝置進(jìn)行交互來執(zhí)行處理任務(wù)的實際執(zhí)行。在一個實施例中,計算運行時層109可以根據(jù)針對處理任務(wù)而配置的每個處理器(例如,CPU或GPU)的運行時狀態(tài)來協(xié)調(diào)執(zhí)行來自不同應(yīng)用的多個處理任務(wù)。計算運行時層109可以基于運行時狀態(tài)從被配置來執(zhí)行處理任務(wù)的物理裝置中選擇一個或多個處理器。執(zhí)行處理任務(wù)可以包括并發(fā)地在多個物理處理裝置中執(zhí)行一個或多個可執(zhí)行體的多個線程。在一個實施例中,計算運行時層109可以通過監(jiān)視每個處理器的運行時執(zhí)行狀況來跟蹤所執(zhí)行的每個處理任務(wù)的狀況。
[0039]運行時層可以從應(yīng)用103加載與處理任務(wù)相對應(yīng)的一個或多個可執(zhí)行體。在一個實施例中,計算運行時層109自動地從計算應(yīng)用庫105加載執(zhí)行處理任務(wù)所需要的附加可執(zhí)行體。計算運行時層109可以從應(yīng)用103或計算應(yīng)用庫105中加載計算內(nèi)核對象的可執(zhí)行體及其相應(yīng)的源程序兩者。計算內(nèi)核對象的源程序可以是計算內(nèi)核程序。根據(jù)被配置為包括多種類型和/或不同版本的物理計算裝置的邏輯計算裝置,可以基于單個源程序來加載多個可執(zhí)行體。在一個實施例中,計算運行時層109可以激活計算編譯器107來將所加載的源程序在線編譯成最優(yōu)用于被配置來執(zhí)行可執(zhí)行體的目標(biāo)處理器(例如,CPU或GPU)的可執(zhí)行體。
[0040]除了根據(jù)相應(yīng)源程序的現(xiàn)有可執(zhí)行體以外,在線編譯出的可執(zhí)行體還可以被存儲以用于將來的調(diào)用。此外,計算可執(zhí)行體可以被離線編譯并且經(jīng)由API調(diào)用被加載到計算運行時109。計算應(yīng)用庫105和/或應(yīng)用103可以響應(yīng)于來自應(yīng)用的庫API請求來加載相關(guān)聯(lián)的可執(zhí)行體。可以為計算應(yīng)用庫105或應(yīng)用103動態(tài)更新新編譯出的可執(zhí)行體。在一個實施例中,計算運行時109可以用通過新升級版本的計算裝置的計算編譯器107在線編譯出的新可執(zhí)行體來替換應(yīng)用中的現(xiàn)有計算可執(zhí)行體。計算運行時109可以插入在線編譯出的新可執(zhí)行體來更新計算應(yīng)用庫105。在一個實施例中,計算運行時109可以在加載處理任務(wù)的可執(zhí)行體時調(diào)用計算編譯器107。在另一個實施例中,計算編譯器107可以被離線調(diào)用來建立用于計算應(yīng)用庫105的可執(zhí)行體。計算編譯器107可以編譯并且鏈接計算內(nèi)核程序來生成計算內(nèi)核可執(zhí)行體。在一個實施例中,計算應(yīng)用庫105可以包括多個用來支持例如開發(fā)工具箱和/或圖像處理的函數(shù)。每個庫函數(shù)可以對應(yīng)于針對多個物理計算裝置的計算應(yīng)用庫105中所存儲的計算源程序和一個或多個可執(zhí)行體。
[0041]圖2是圖示出具有多個計算處理器的計算裝置的示例的框圖,這多個計算處理器并行地進(jìn)行操作來并發(fā)地執(zhí)行多個線程。每個計算處理器可以并行地(或并發(fā)地)執(zhí)行多個線程??梢圆⑿袌?zhí)行的線程可以稱為線程塊。計算裝置可以具有能被并行執(zhí)行的多個線程塊。例如,示出在計算裝置205中,M個線程作為一個線程塊執(zhí)行。多個線程塊中的線程,例如,計算處理器_1205的線程I和計算處理器_L203的線程N,可以在一個計算裝置上分別的計算處理器上或在多個計算裝置上并行地執(zhí)行。在多個計算處理器上的多個線程塊可以并行地執(zhí)行計算內(nèi)核可執(zhí)行體。多于一個計算處理器可以是基于例如ASIC(專用集成電路)裝置的單個芯片的。在一個實施例中,可以在跨越多個芯片的多于一個的計算處理器上并發(fā)地執(zhí)行來自應(yīng)用的多個線程。
[0042]計算裝置可以包括一個或多個計算處理器,例如計算處理器_1205和計算處理器_L203。本地存儲器可以與計算處理器耦合??梢杂膳c計算處理器耦合的本地存儲器來支持在計算處理器中運行的單個線程塊中線程之間的共享存儲器??缭讲煌木€程塊的多個線程,例如線程1213和線程N209可以共享與計算裝置201耦合的流存儲器217中所存儲的流。流可以是計算內(nèi)核可執(zhí)行體能夠?qū)ζ溥M(jìn)行操作的元素的集合,例如圖像流或變量流。變量流可以被分配用于存儲處理任務(wù)期間對其進(jìn)行操作的全局變量。圖像流可以是可用于圖像緩沖、紋理緩沖或幀緩沖的緩沖器。
[0043]在一個實施例中,計算處理器的本地存儲器可以實現(xiàn)為專用本地存儲裝置,例如處理器_1的本地共享存儲器219和處理器立的本地共享存儲器211。在另一實施例中,計算處理器的本地存儲器可以實現(xiàn)為用于計算裝置的一個或多個計算處理器2的流存儲器的流讀-寫緩存,例如用于計算裝置201中的計算處理器205203的流數(shù)據(jù)緩存215。在另一實施例中,本地存儲器可以實現(xiàn)在與本地存儲器耦合的計算處理器中運行的線程塊中的線程之間共享的專用本地存儲裝置,例如與計算處理器_1205耦合的本地共享存儲器219。專用本地存儲裝置可以不被跨越不同線程塊的線程共享。如果計算處理器(例如處理器_1205m)的本地存儲器被實現(xiàn)為流讀-寫緩存(例如,流數(shù)據(jù)緩存215),則在本地存儲器中聲明的變量可以被從流存儲器217中分配并且被存儲到所實現(xiàn)的實現(xiàn)本地存儲器的流讀-寫緩存(例如,流數(shù)據(jù)緩存215)中。當(dāng)例如流讀-寫緩存和專用本地存儲裝置對于相應(yīng)的計算裝置都不可用時,線程塊內(nèi)的線程可以共享流存儲器217中所分配的本地變量。在一個實施例中,每個線程與私有(private)存儲器相關(guān)聯(lián),私有存儲器用來存儲由線程中所調(diào)用的函數(shù)使用的線程私有變量。例如,私有存儲器1211可以只被線程1213訪問。
[0044]圖3是圖示出經(jīng)由計算裝置標(biāo)識符而被配置為邏輯計算裝置的多個物理計算裝置的一個實施例的框圖。在一個實施例中,應(yīng)用303和平臺層305可以在主CPU301中運行。應(yīng)用303可以是圖1的應(yīng)用103中的一個。托管系統(tǒng)101可以包括主CPU301。物理計算裝置 Physical_Compute_Device_1305...Physical_Compute_Device-N311 中的每一個可以是圖1的CPU117或GPU115中的一個。在一個實施例中,計算平臺層111可以響應(yīng)于來自應(yīng)用303的API請求來生成計算裝置標(biāo)識符307,以用于根據(jù)API請求中所包括的能力需求的列表來配置數(shù)據(jù)并行處理資源。計算裝置標(biāo)識符307可以涉及根據(jù)計算平臺層111進(jìn)行的配置來選擇實際的物理計算裝置 Physical_Compute_Device_1305...Physical_Compute_Device-N311。在一個實施例中,邏輯計算裝置309可以代表與主CPU301分離的一組所選擇的實際物理計算裝置。
[0045]圖4是圖示出用于通過匹配從應(yīng)用接收到的能力需求、利用計算裝置標(biāo)識符來配置多個物理計算裝置的處理的實施例的流程圖??梢愿鶕?jù)圖1的系統(tǒng)100,在由托管系統(tǒng)101托管的數(shù)據(jù)處理系統(tǒng)中執(zhí)行處理400。數(shù)據(jù)處理系統(tǒng)可以包括托管平臺層(例如圖1的計算平臺層111)的主處理器和多個附接到主處理器的物理計算裝置(例如,圖1的CPU117和 GPUl15)。
[0046]在塊401中,在一個實施例中,處理400可以建立代表與一種或多種相應(yīng)的能力相關(guān)聯(lián)的多個物理計算裝置的數(shù)據(jù)結(jié)構(gòu)(或計算裝置數(shù)據(jù)結(jié)構(gòu))。各個物理計算裝置可以附接到執(zhí)行處理400的處理系統(tǒng)。諸如CPU或GPU之類的物理計算裝置的能力或計算能力可以包括物理計算裝置是否支持處理特征、存儲器訪問機(jī)制或指定擴(kuò)展。處理特征可以與專用紋理硬件支持、雙精度浮點運算或同步支持(例如互斥)有關(guān)。物理處理裝置的存儲器訪問機(jī)制可以與變量流緩存的類型、圖像流緩存的類型或?qū)S帽镜卮鎯ζ髦С钟嘘P(guān)。數(shù)據(jù)處理系統(tǒng)的系統(tǒng)應(yīng)用可以響應(yīng)于將新的物理計算裝置附接到數(shù)據(jù)處理系統(tǒng)來更新數(shù)據(jù)結(jié)構(gòu)。在一個實施例中,可以預(yù)先確定物理計算裝置的能力。在另一實施例中,數(shù)據(jù)處理系統(tǒng)的系統(tǒng)應(yīng)用可以在運行時期間發(fā)現(xiàn)新附接的物理處理裝置。該系統(tǒng)應(yīng)用可以取出新發(fā)現(xiàn)的物理計算裝置的能力,來更新代表所附接的物理計算裝置及它們的相應(yīng)能力的數(shù)據(jù)結(jié)構(gòu)。
[0047]根據(jù)一個實施例,在塊403,處理400可以接收來自應(yīng)用的計算能力需求。該應(yīng)用可以通過調(diào)用API向系統(tǒng)應(yīng)用發(fā)送計算能力需求。該系統(tǒng)應(yīng)用可以與該應(yīng)用的托管系統(tǒng)中的軟件棧的平臺層相對應(yīng)。在一個實施例中,計算能力需求可以標(biāo)識用于請求處理資源來執(zhí)行該應(yīng)用的任務(wù)的所需能力的列表。在一個實施例中,該應(yīng)用可以要求所請求的資源在多個線程中并發(fā)地執(zhí)行任務(wù)。作為響應(yīng),在塊405,處理400可以從所附接的物理計算裝置中選擇一組物理計算裝置??梢曰谟嬎隳芰π枨笈c能力數(shù)據(jù)結(jié)構(gòu)中所存儲的計算能力之間的匹配來確定選擇。在一個實施例中,處理400可以根據(jù)通過能力需求提供的提示來執(zhí)行匹配。
[0048]處理400可以根據(jù)物理計算裝置和計算能力需求之間所匹配的計算能力的數(shù)目來確定匹配評分。在一個實施例中,處理400可以選擇具有最高匹配評分的多個物理計算裝置。在另一實施例中,如果能力需求中的每個能力都被匹配,則處理400可以選擇物理計算裝置。處理400可以在塊405,確定多組匹配物理計算裝置。在一個實施例中,根據(jù)負(fù)載均衡能力來選擇每組匹配物理裝置。在一個實施例中,在塊407,處理400可以為塊405處所選擇的每組物理計算裝置生成計算裝置標(biāo)識符。處理400可以通過調(diào)用API向應(yīng)用返回所生成的一個或多個計算裝置標(biāo)識符。應(yīng)用可以根據(jù)計算裝置標(biāo)識符來選擇采用哪些處理資源來執(zhí)行任務(wù)。在一個實施例中,處理400在塊407可以為所接收到的每個能力需求生成最多一個計算裝置標(biāo)識符。
[0049]在一個實施例中,在塊409,處理400可以根據(jù)相應(yīng)的計算裝置標(biāo)識符來分配用于初始化塊405處所選擇的一組物理計算裝置的邏輯計算裝置的資源。處理400可以根據(jù)塊405處的選擇,響應(yīng)于來自已經(jīng)接收到一個或多個計算裝置標(biāo)識符的應(yīng)用的API請求來執(zhí)行對邏輯計算裝置的初始化。處理400可以在該應(yīng)用的邏輯計算裝置上創(chuàng)建上下文對象。在一個實施例中,上下文對象與該應(yīng)用上運行的托管系統(tǒng)中的一個應(yīng)用線程相關(guān)聯(lián)。并發(fā)地執(zhí)行一個邏輯計算裝置中或跨越不同的邏輯計算裝置的處理任務(wù)的多個線程可以基于分開的上下文對象。
[0050]在一個實施例中,處理400可以基于包括cuCreateContext、cuRetainContext和cuReleaseContext的多個API。API cuCreateContext創(chuàng)建計算上下文。計算上下文可以對應(yīng)于計算上下文對象。API cuRetainContext使用由上下文標(biāo)識的具體計算上下文作為cuRetainContext的輸入自變量來遞增實例的數(shù)目。API cuCreateContext進(jìn)行隱式保留。這對于通常獲得由應(yīng)用傳遞給它們的上下文的第三方庫很有幫助。然而,有可能該應(yīng)用會刪除上下文而不通知庫。允許多個實例附接到上下文并且從上下文釋放解決了由庫使用的計算上下文不再有效的問題。如果cuRetainContext的輸入自變量與有效計算上下文對象不相對應(yīng),則 cuRetainContext 返回 CU_INVALID_C0NTEXT。API cuReleaseContext 從有效計算上下文中釋放實例。如果cuReleaseContext的輸入自變量與有效的計算上下文對象不相對應(yīng),則 cuReleaseContext 返回 CU_INVALID_C0NTEXT。[0051]圖5是圖示出在邏輯計算裝置中執(zhí)行計算可執(zhí)行體的處理的實施例的流程圖。在一個實施例中,可以由數(shù)據(jù)處理系統(tǒng)中的運行時層(例如,圖1的計算運行時層109)來執(zhí)行處理500。在塊501處,處理500可以為邏輯計算裝置上要運行的計算可執(zhí)行體分配一個或多個流。處理任務(wù)可以由對流進(jìn)行操作的計算可執(zhí)行體來執(zhí)行。在一個實施例中,處理任務(wù)可以包括輸入流和輸出流。處理500可以將所分配的流存儲器映射到應(yīng)用的邏輯地址或從其映射到所分配的流存儲器。在一個實施例中,處理500可以基于來自應(yīng)用的API請求來執(zhí)行塊501的操作。
[0052]在塊503處,根據(jù)一個實施例,處理500可以創(chuàng)建邏輯計算裝置的計算內(nèi)核對象。計算內(nèi)核對象可以是針對用于執(zhí)行函數(shù)的相應(yīng)處理任務(wù)的相關(guān)聯(lián)的流和可執(zhí)行體而創(chuàng)建的對象。處理500可以在塊505為計算內(nèi)核對象建立函數(shù)自變量。函數(shù)自變量可以包括為函數(shù)輸入或輸出分配的流,例如塊501處分配的流。處理500可以在塊507處將計算內(nèi)核可執(zhí)行體和/或計算內(nèi)核源加載到計算內(nèi)核對象中。計算內(nèi)核可執(zhí)行體可以是根據(jù)邏輯計算裝置要被執(zhí)行用于執(zhí)行與內(nèi)核對象相關(guān)聯(lián)的相應(yīng)處理任務(wù)的可執(zhí)行體。在一個實施例中,計算內(nèi)核可執(zhí)行體可以包括例如與目標(biāo)物理計算裝置的類型、版本和/或編譯選項相關(guān)聯(lián)的描述數(shù)據(jù)。計算內(nèi)核源可以是從其編譯出計算內(nèi)核可執(zhí)行體的源代碼。處理500可以在塊507加載與計算內(nèi)核源相對應(yīng)的多個計算內(nèi)核可執(zhí)行體。處理500可以從應(yīng)用或通過諸如圖1的計算應(yīng)用庫105之類的計算庫來加載計算內(nèi)核可執(zhí)行體。計算內(nèi)核可執(zhí)行體可以利用相應(yīng)計算內(nèi)核源來加載。在一個實施例中,處理500可以根據(jù)來自應(yīng)用的API請求執(zhí)行塊503、505和507處的操作。
[0053]在塊511,處理500可以更新執(zhí)行隊列來利用邏輯計算裝置執(zhí)行計算機(jī)內(nèi)核對象。處理500可以利用計算運行時(例如,圖1的計算運行時109)的合適的自變量、響應(yīng)于來自應(yīng)用或計算應(yīng)用庫(例如,圖1的應(yīng)用103或計算應(yīng)用庫105)的API調(diào)用來執(zhí)行計算內(nèi)核。在一個實施例中,處理500可以生成執(zhí)行計算內(nèi)核的計算內(nèi)核執(zhí)行實例。對用于執(zhí)行計算內(nèi)核的計算運行時(例如圖1的計算運行時109)的API調(diào)用本身實際上可以是異步的。執(zhí)行實例可以由可由計算運行時(例如,圖1的計算運行時109)返回的計算事件對象來標(biāo)識。計算內(nèi)核執(zhí)行實例可以被添加到用于執(zhí)行計算內(nèi)核實例的執(zhí)行隊列。在一個實施例中,對用于執(zhí)行計算內(nèi)核實例的執(zhí)行隊列的API調(diào)用可以包括計算處理器上同時并行執(zhí)行的線程的數(shù)目和要使用的計算處理器的數(shù)目。計算內(nèi)核執(zhí)行實例可以包括指示所希望的用于執(zhí)行相應(yīng)計算內(nèi)核對象的優(yōu)先順序的優(yōu)先值。計算內(nèi)核執(zhí)行實例也可以包括標(biāo)識之前的執(zhí)行實例的事件對象和/或用于執(zhí)行該執(zhí)行的預(yù)期數(shù)目的線程和預(yù)期數(shù)目的線程塊??梢栽贏PI調(diào)用中指定線程塊的數(shù)目和線程的數(shù)目。在一個實施例中,事件對象可以指示包括該事件對象的執(zhí)行實例與由事件對象標(biāo)識的另一執(zhí)行實例之間的執(zhí)行順序關(guān)系。可以要求包括事件對象的執(zhí)行實例在由該事件對象標(biāo)識的另一執(zhí)行實例完成執(zhí)行之后被執(zhí)行。事件對象可以稱為queue_after_event_object。在一個實施例中,執(zhí)行隊列可以包括多個用于執(zhí)行相應(yīng)的計算內(nèi)核對象的計算內(nèi)核執(zhí)行實例。用于一個計算內(nèi)核對象的一個或多個計算內(nèi)核執(zhí)行實例可以被調(diào)度用于執(zhí)行隊列中的執(zhí)行。在一個實施例中,處理500可以響應(yīng)于來自應(yīng)用的API請求來更新該執(zhí)行隊列。該執(zhí)行隊列可以由該應(yīng)用所運行于的托管數(shù)據(jù)系統(tǒng)來托管。
[0054]在塊513,處理500可以從用于執(zhí)行的執(zhí)行隊列中選擇計算內(nèi)核執(zhí)行實例。在一個實施例中,處理500可以根據(jù)相應(yīng)邏輯計算裝置來選擇多于一個要被并發(fā)執(zhí)行的計算內(nèi)核執(zhí)行實例。處理500可以判斷:是否基于計算內(nèi)核執(zhí)行實例與執(zhí)行隊列中其他執(zhí)行實例相關(guān)聯(lián)的優(yōu)先順序和依賴關(guān)系而從執(zhí)行隊列中選擇了計算內(nèi)核執(zhí)行實例。可以通過根據(jù)加載到相應(yīng)計算內(nèi)核對象的可執(zhí)行體來執(zhí)行該計算內(nèi)核對象,從而執(zhí)行計算內(nèi)核執(zhí)行實例。
[0055]在塊517,在一個實施例中,處理500可以選擇加載到與所選擇的計算內(nèi)核實例相對應(yīng)的計算內(nèi)核對象的多個可執(zhí)行體中的一個可執(zhí)行體,以用于在與該計算內(nèi)核對象的邏輯計算裝置相關(guān)聯(lián)的物理計算裝置中執(zhí)行。處理500可以針對一個計算內(nèi)核執(zhí)行實例選擇要在多于一個物理計算裝置中并行執(zhí)行的多于一個可執(zhí)行體。該選擇可以基于與和所選擇的計算內(nèi)核實例相關(guān)聯(lián)的邏輯計算裝置相對應(yīng)的物理計算裝置的當(dāng)前執(zhí)行狀況。物理計算裝置的執(zhí)行狀況可以包括運行的線程的數(shù)目、本地存儲器利用水平和處理器利用水平(例如,每單位時間的操作的峰值數(shù)目)等。在一個實施例中,該選擇可以是基于預(yù)定的利用水平的。在另一個實施例中,該選擇可以是基于與計算內(nèi)核執(zhí)行實例相關(guān)聯(lián)的線程的數(shù)目和線程塊的數(shù)目。處理500可以從物理計算裝置取出執(zhí)行狀況。在一個實施例中,處理500可以執(zhí)行用于從執(zhí)行隊列中選擇計算內(nèi)核執(zhí)行實例的操作,以在塊513517處與托管系統(tǒng)中運行的應(yīng)用異步地執(zhí)行。
[0056]在塊519,處理500可以檢查被調(diào)度用于該執(zhí)行隊列中的執(zhí)行的計算內(nèi)核執(zhí)行實例的狀況。可以由唯一的計算事件對象來標(biāo)識各個執(zhí)行實例。當(dāng)相應(yīng)的計算內(nèi)核執(zhí)行實例根據(jù)計算運行時(例如,圖1的運行時109)被排隊時,事件對象可以被返回給調(diào)用用于執(zhí)行該執(zhí)行實例的API的應(yīng)用或計算應(yīng)用庫(例如,圖5的應(yīng)用103或計算應(yīng)用庫105)。在一個實施例中,處理500可以響應(yīng)于來自應(yīng)用的API請求來進(jìn)行執(zhí)行狀況檢查。處理500可以通過查詢標(biāo)識該計算內(nèi)核執(zhí)行實例的計算事件對象的狀況來確定執(zhí)行計算內(nèi)核執(zhí)行實例的完成。處理500可以等待直到計算內(nèi)核執(zhí)行實例的執(zhí)行被完成為止,以返回來自應(yīng)用的API調(diào)用。處理500可以基于事件對象來控制從各種流的處理執(zhí)行實例讀和/或?qū)憽?br>
[0057]在塊521,根據(jù)一個實施例,處理500可以取出執(zhí)行計算內(nèi)核執(zhí)行實例的結(jié)果。隨后,處理500可以清理被分配用于執(zhí)行該計算內(nèi)核執(zhí)行實例的處理資源。在一個實施例中,處理500可以將保存執(zhí)行計算內(nèi)核可執(zhí)行體的結(jié)果的流存儲器拷貝到本地存儲器中。處理500可以刪除在塊501處所分配的變量流或圖像流。處理500可以刪除用于在計算內(nèi)核執(zhí)行被完成時刪除的內(nèi)核事件對象。如果與特定計算內(nèi)核對象相關(guān)聯(lián)的各個計算內(nèi)核執(zhí)行實例已經(jīng)被完整執(zhí)行,則處理500可以刪除特定計算內(nèi)核對象。在一個實施例中,處理500可以基于由應(yīng)用發(fā)起的API請求來執(zhí)行塊521處的操作。
[0058]圖6是圖示出加載可執(zhí)行體的運行時處理的實施例的流程圖,該運行時處理包括將源編譯用于被確定來執(zhí)行該可執(zhí)行體的一個或多個物理計算裝置。處理600可以作為圖5的塊507處的處理500的一部分而被執(zhí)行。在一個實施例中,處理600可以在塊601處為各個與邏輯計算裝置相關(guān)聯(lián)的物理計算裝置選擇一個或多個與該物理計算裝置相兼容的現(xiàn)有計算內(nèi)核可執(zhí)行體。計算內(nèi)核可執(zhí)行體可以在相兼容的物理計算裝置中被執(zhí)行。該現(xiàn)有計算內(nèi)核可執(zhí)行體可以從應(yīng)用或通過例如圖1的計算應(yīng)用庫105的計算庫獲得。所選擇的計算內(nèi)核可執(zhí)行體中的每一個計算內(nèi)核可執(zhí)行體可以由至少一個物理計算裝置執(zhí)行。在一個實施例中,該選擇可以是基于與現(xiàn)有計算內(nèi)核可執(zhí)行體相關(guān)聯(lián)的描述數(shù)據(jù)的。
[0059]如果存在被選擇的現(xiàn)有計算內(nèi)核對象,則處理600可以在塊603處判斷所選擇的計算內(nèi)核可執(zhí)行體中的任何一者是否對于物理計算裝置是最優(yōu)的。該判斷例如可以是基于物理計算裝置的版本的。在一個實施例中,如果描述數(shù)據(jù)中的目標(biāo)物理計算裝置的版本與物理計算裝置的版本相匹配,則處理600可以判斷出現(xiàn)有計算內(nèi)核可執(zhí)行體對于該物理計算裝置是最優(yōu)的。
[0060]在塊605,在一個實施例中,處理600可以使用在線編譯器(例如圖1的計算編譯器107)來從相應(yīng)的計算機(jī)內(nèi)核源建立對于物理計算裝置最優(yōu)的新的計算內(nèi)核可執(zhí)行體。如果在塊603處發(fā)現(xiàn)所選擇的計算內(nèi)核可執(zhí)行體中沒有計算內(nèi)核可執(zhí)行體對于物理計算裝置是最優(yōu)的,則處理600可以執(zhí)行在線建立。在一個實施例中,如果在塊601處發(fā)現(xiàn)現(xiàn)有計算內(nèi)核可執(zhí)行體中沒有計算內(nèi)核可執(zhí)行體與物理計算裝置相兼容,則處理600可以執(zhí)行在線建立。計算內(nèi)核源可以從應(yīng)用或通過諸如圖1的計算應(yīng)用庫105之類的計算庫來獲得。
[0061]如果塊605處的建立是成功的,則在一個實施例中,處理600可以在塊607處將新建立的計算內(nèi)核可執(zhí)行體加載到相應(yīng)的計算內(nèi)核對象中。否則,處理600可以在塊609處將所選擇的計算內(nèi)核可執(zhí)行體加載到內(nèi)核對象。在一個實施例中,如果計算內(nèi)核可執(zhí)行體還未被加載,則處理600可以將計算內(nèi)核可執(zhí)行體加載到計算內(nèi)核對象。在另一實施例中,如果計算內(nèi)核對象的現(xiàn)有計算內(nèi)核可執(zhí)行體中沒有與物理計算裝置相兼容的計算內(nèi)核可執(zhí)行體,并且相應(yīng)計算內(nèi)核源不可獲得,則處理600可以生成錯誤消息。
[0062]圖7是圖示出從執(zhí)行隊列中選擇計算內(nèi)核執(zhí)行實例以在與和該執(zhí)行實例相關(guān)聯(lián)的邏輯計算裝置相對應(yīng)的一個或多個物理計算裝置中執(zhí)行的處理的一個實施例的流程圖。處理700可以作為圖5的塊513處的處理500的一部分被執(zhí)行。在一個實施例中,處理700可以在塊701處標(biāo)識執(zhí)行隊列中當(dāng)前所調(diào)度的計算內(nèi)核執(zhí)行實例之間的依賴條件。計算內(nèi)核執(zhí)行實例的依賴條件可以防止計算內(nèi)核執(zhí)行實例的執(zhí)行,如果該條件未完成的話。在一個實施例中,依賴關(guān)系可以是基于由輸出流饋送的輸入流之間的關(guān)系的。在一個實施例中,處理700可以根據(jù)執(zhí)行實例的相應(yīng)函數(shù)的輸入流和輸出流來檢測執(zhí)行實例之間的依賴關(guān)系。在另一個實施例中,具有較低優(yōu)先級的執(zhí)行實例可以與具有高優(yōu)先級的另一執(zhí)行具有依賴關(guān)系。
[0063]在塊703,在一個實施例中,處理700可以從多個被調(diào)度的計算內(nèi)核執(zhí)行實例中選擇沒有任何未完成的依賴條件的計算內(nèi)核執(zhí)行實例用于執(zhí)行。該選擇可以是基于被指派給執(zhí)行實例的優(yōu)先級的。在一個實施例中,所選擇的計算內(nèi)核執(zhí)行實例可以與多個計算內(nèi)核執(zhí)行實例中的最高優(yōu)先級相關(guān)聯(lián)而沒有未完成的依賴條件。在塊705,處理700可以取出與所選擇的計算內(nèi)核執(zhí)行實例相對應(yīng)的物理計算裝置的當(dāng)前執(zhí)行狀況。在一個實施例中,物理計算裝置的執(zhí)行狀況可以是從預(yù)定的存儲位置中取出的。在另一實施例中,處理700可以向物理計算裝置發(fā)送狀況請求來接收執(zhí)行狀況報告。處理700可以在塊707處基于所取出的執(zhí)行狀況,指派物理計算裝置中的一個或多個來執(zhí)行所選擇的計算內(nèi)核執(zhí)行實例。在一個實施例中,物理計算裝置可以根據(jù)與其他物理計算裝置的負(fù)載均衡而被指派用于執(zhí)行。所選擇的物理計算裝置可以與滿足預(yù)定標(biāo)準(zhǔn)(例如,在預(yù)定處理器利用水平和/或存儲器利用水平以下)的執(zhí)行狀況相關(guān)聯(lián)。在一個實施例中,預(yù)定標(biāo)準(zhǔn)可以依賴于與所選擇的計算內(nèi)核執(zhí)行實例相關(guān)聯(lián)的線程的數(shù)目和線程塊的數(shù)目。處理700可以將用于相同的執(zhí)行實例或多個實例的分開的計算內(nèi)核可執(zhí)行體加載到一個或多個所指派的物理計算裝置,以在多個線程中并行執(zhí)行。[0064]圖8A是圖示出建立API (應(yīng)用編程接口)庫的處理的一個實施例的流程圖,該處理根據(jù)多個物理計算裝置將用于一個或多個API的多個可執(zhí)行體和源存儲在庫中。處理800A可以在塊801處被離線執(zhí)行以將API函數(shù)的源代碼加載到數(shù)據(jù)處理系統(tǒng)中。源代碼可以是在一個或多個物理計算裝置中所要執(zhí)行的計算內(nèi)核源。在一個實施例中,處理800A可以在塊803處針對API函數(shù)指派多個目標(biāo)物理計算裝置。可以根據(jù)類型(例如,CPU或GPU)、版本或供應(yīng)商來指派目標(biāo)物理計算裝置。處理800A可以在塊805處針對各個所指派的目標(biāo)物理計算裝置將源代碼編譯成可執(zhí)行體,例如,計算內(nèi)核可執(zhí)行體。在一個實施例中,處理800A可以基于在線編譯器(例如圖1的計算編譯器107)來離線執(zhí)行編譯。在塊807,處理800A可以將API函數(shù)的源代碼與針對所指派的目標(biāo)物理計算裝置所編譯出的相應(yīng)可執(zhí)行體存儲到API庫中。在一個實施例中,可以存儲各個可執(zhí)行體與描述數(shù)據(jù),描述數(shù)據(jù)例如包括目標(biāo)物理計算裝置的類型、版本和供應(yīng)商和/或編譯選項。通過運行時期間的處理(例如,圖5的處理500)可以取出描述數(shù)據(jù)。
[0065]圖SB是圖示出應(yīng)用執(zhí)行多個可執(zhí)行體中的一個和基于API請求從API庫所取出的相應(yīng)源的處理的一個實施例的流程圖。在一個實施例中,處理800B在包括API庫(例如,圖1的計算應(yīng)用庫105)的數(shù)據(jù)處理系統(tǒng)中(例如,圖1的托管系統(tǒng)101中)運行應(yīng)用程序(例如,圖1的應(yīng)用103)。在塊811處,處理800B可以基于API請求從API庫中取出源(例如,計算內(nèi)核源)和一個或多個相應(yīng)可執(zhí)行體(例如,計算內(nèi)核可執(zhí)行體),例如圖5的塊507處的處理500。各個可執(zhí)行體可以與一個或多個目標(biāo)物理計算裝置相關(guān)聯(lián)。在一個實施例中,計算內(nèi)核可執(zhí)行體可以與多種版本的物理計算裝置后向兼容。在塊813處,處理800B可以在多個物理計算裝置中執(zhí)行基于API請求所取出的可執(zhí)行體中的一個來執(zhí)行相關(guān)聯(lián)的API函數(shù),例如圖5的塊517處的處理500。處理800B可以與在塊813處執(zhí)行API函數(shù)異步地在塊809處執(zhí)行應(yīng)用。
[0066]圖9是圖示出多個物理計算裝置中所要執(zhí)行的計算內(nèi)核可執(zhí)行體的計算內(nèi)核源的示例的樣本源代碼。示例900可以是具有包括變量901和流903的自變量(arguments)的API函數(shù)。示例900可以是基于諸如圖1的系統(tǒng)101之類的并行計算環(huán)境的編程語言。在一個實施例中,可以利用被設(shè)計來實現(xiàn)在此所述實施例中的一個或多個實施例的附加擴(kuò)展和限制,根據(jù)ANSI (美國國家標(biāo)準(zhǔn)學(xué)會)C標(biāo)準(zhǔn)來指定并行編程語言。這些擴(kuò)展可以包括用來指定計算裝置中所要執(zhí)行的計算內(nèi)核函數(shù)的函數(shù)限定符(qualifier),例如限定符905。計算內(nèi)核函數(shù)可以不由其它計算內(nèi)核函數(shù)調(diào)用。在一個實施例中,可以由并行程序語言的主函數(shù)(host function)來調(diào)用計算內(nèi)核函數(shù)。主函數(shù)可以是常規(guī)的ANSI C函數(shù)。主函數(shù)可以在與執(zhí)行計算內(nèi)核函數(shù)的計算裝置相分離的主處理器中被執(zhí)行。在一個實施例中,這些擴(kuò)展可以包括本地限制符,以描述需要被分配到與由線程塊的所有線程共享的計算裝置相關(guān)聯(lián)的本地存儲器中的變量??梢栽谟嬎銉?nèi)核函數(shù)內(nèi)部聲明本地限制符。對并行編程語言的限制可以在編譯器時間或運行時間期間被增強以在這些限制被違反時,生成錯誤狀況,例如,輸出錯誤消息或退出執(zhí)行。
[0067]圖10是圖示出通過調(diào)用API來配置用于在多個物理計算裝置中計算多個可執(zhí)行體中的一個的邏輯計算裝置的示例的樣本源代碼。示例1000可以由附接了多個物理計算裝置的主機(jī)系統(tǒng)(例如,圖1的托管系統(tǒng)101)中運行的應(yīng)用來執(zhí)行。示例1000可以指定并行編程語言的主函數(shù)。示例1000中的處理操作可以通過諸如圖5的處理500之類的處理、作為API調(diào)用被執(zhí)行。分配流1001和加載流圖像1003的處理操作可以通過圖5的塊501處的處理500被執(zhí)行。創(chuàng)建計算內(nèi)核對象1005的處理操作可以通過圖5的塊503處的處理500被執(zhí)行。處理操作1007可以將諸如圖9的示例900之類的計算內(nèi)核源加載到所創(chuàng)建出的計算內(nèi)核對象。處理操作1009可以從所加載的計算內(nèi)核源中顯式地建立計算內(nèi)核可執(zhí)行體。在一個實施例中,處理操作1009可以將所建立的計算內(nèi)核可執(zhí)行體加載到所創(chuàng)建的計算內(nèi)核對象。隨后,處理操作1011可以顯式地選擇所建立的計算內(nèi)核可執(zhí)行體以用于執(zhí)行所創(chuàng)建的計算內(nèi)核對象。
[0068]在一個實施例中,處理操作1013可以附加變量和流作為所創(chuàng)建的計算內(nèi)核對象的函數(shù)自變量。處理操作1013可以通過圖5的框505處的處理500被執(zhí)行。處理操作1015可以執(zhí)行所創(chuàng)建的計算內(nèi)核對象。在一個實施例中,處理操作1015可以通過圖5的塊511處的處理500被執(zhí)行。處理操作1015可以使得執(zhí)行隊列被利用與所創(chuàng)建的計算內(nèi)核對象相應(yīng)的計算內(nèi)核執(zhí)行實例而被更新。處理操作1017可以同步地等待所創(chuàng)建的計算內(nèi)核對象的執(zhí)行的完成。在一個實施例中,處理操作1019可以從計算內(nèi)核對象的執(zhí)行中取出結(jié)果。隨后,處理操作1021可以清理所分配的用于執(zhí)行計算內(nèi)核對象的資源,例如事件對象、所創(chuàng)建的計算內(nèi)核對象和所分配的存儲器。在一個實施例中,處理操作1017可以基于內(nèi)核事件對象是否被設(shè)置。處理操作1017可以通過圖5的塊519處的處理500被執(zhí)行。
[0069]圖11示出可以與本發(fā)明一個實施例一起使用的計算機(jī)系統(tǒng)的一個示例。首先,系統(tǒng)1100可以被實現(xiàn)為圖1中所示的系統(tǒng)的一部分。注意,盡管圖11圖示出計算機(jī)系統(tǒng)的各種組件,但是其不意圖代表互連這些組件的任何具體的體系結(jié)構(gòu)或方式,因為這些細(xì)節(jié)對于本發(fā)明并沒有密切的關(guān)系。還要明白,還可以與具有更少組件或可能更多組件的網(wǎng)絡(luò)計算機(jī)和其他數(shù)據(jù)處理系統(tǒng)(例如,手持計算機(jī)、個人數(shù)字助理(PDA)、蜂窩電話、娛樂系統(tǒng)、消費電子設(shè)備等)一起來實現(xiàn)本發(fā)明的一個或多個實施例。
[0070]如圖11中所示,作為一種形式的數(shù)據(jù)處理系統(tǒng)的計算機(jī)系統(tǒng)1101包括:耦合到諸如CPU和/或GPU之類的(一個或多個)微處理器1105的總線1103、ROM(只讀存儲器)1107、易失性狀111109和非易失性存儲器1111。微處理器1103可以從存儲器1107、1109,1111取出指令并且執(zhí)行這些指令來執(zhí)行上述操作??偩€1103將這各種組件互連到一起,并且還將這些組件1105、1107、1109和1111與顯示控制器和顯示裝置1113以及外圍裝置互連,外圍裝置例如是可以是鼠標(biāo)、鍵盤、調(diào)制解調(diào)器、網(wǎng)絡(luò)接口、打印機(jī)的輸入/輸出(I/O)裝置和本領(lǐng)域公知的其他裝置。通常輸入/輸出裝置915通過輸入/輸出控制器1117耦合到該系統(tǒng)。易失性RAM(隨機(jī)存取存儲器)1109通常被實現(xiàn)為持續(xù)地需要電力以刷新或維護(hù)存儲器中的數(shù)據(jù)的動態(tài)RAM (DRAM)。與顯示裝置1108耦合的顯示控制器可以可選地包括一個或多個GPU來處理顯示數(shù)據(jù)。可選地,可以提供GPU存儲器1111來支持顯示裝置1108中所包括的GPU。
[0071]海量存儲裝置1111通常是在即使電力被從系統(tǒng)移除后仍然能夠維護(hù)數(shù)據(jù)(例如,大量數(shù)據(jù))的磁硬盤驅(qū)動器或磁光驅(qū)或光驅(qū)或DVD RAM或閃存或其它類型的存儲系統(tǒng)。通常,海量存儲裝置1111也將可以是隨機(jī)存取存儲器,盡管這不被要求。盡管圖11示出海量存儲裝置1111是直接耦合到數(shù)據(jù)處理系統(tǒng)中的其余組件的本地裝置,然而,將明白,本發(fā)明可以利用遠(yuǎn)離該系統(tǒng)的非易失性存儲器,例如通過諸如調(diào)制解調(diào)器或以太網(wǎng)接口或無線連網(wǎng)接口之類的網(wǎng)絡(luò)接口耦合到數(shù)據(jù)處理系統(tǒng)的網(wǎng)絡(luò)存儲裝置??偩€1103可以包括通過本領(lǐng)域公知的各種橋接器、控制器和/或適配器相互連接的一個或多個總線。
[0072]可以利用諸如專用邏輯電路之類的邏輯電路或利用微控制器或執(zhí)行程序代碼指令的其他形式的處理核心來實現(xiàn)上述內(nèi)容的部分。因此,可以利用諸如機(jī)器可執(zhí)行指令之類的程序代碼來執(zhí)行通過上述討論所教導(dǎo)的處理,機(jī)器可執(zhí)行指令使得執(zhí)行這些指令的機(jī)器執(zhí)行某些功能。在該上下文中,“機(jī)器”可以是將中間形式(或“抽象”)指令轉(zhuǎn)換成處理器指定指令(例如,諸如“虛擬機(jī)”(例如,Java虛擬機(jī))、解釋程序、共通語言運行時(CommonLanguage Runtime)、高級語言虛擬機(jī)等的抽象執(zhí)行環(huán)境)和/或被設(shè)計來執(zhí)行指令的半導(dǎo)體芯片(例如,用晶體管實現(xiàn)的“邏輯電路”)上所部署的電子電路,例如專用處理器和/或通用處理器。通過以上討論所教導(dǎo)的處理還可以由被設(shè)計來執(zhí)行這些處理(或這些處理的一部分)的電子電路(代替機(jī)器或與機(jī)器結(jié)合)來執(zhí)行,而不用執(zhí)行程序代碼。
[0073]制造品可以被用來存儲程序代碼。存儲程序代碼的制造品可以被實現(xiàn)為,但不限于,適于存儲電子指令的一個或多個存儲器(例如,一個或多個閃存、隨機(jī)存取存儲器(靜態(tài)、動態(tài)或其它))、光盤、CD-ROM、DVD R0M、EPR0M、EEPR0M、磁的或光的卡或其它類型的機(jī)器可讀介質(zhì)。也可以(例如經(jīng)由通信鏈路(例如,網(wǎng)絡(luò)連接))通過傳播介質(zhì)中所實現(xiàn)的數(shù)據(jù)信號來從遠(yuǎn)程計算機(jī)(例如,服務(wù)器)將程序代碼下載到請求計算機(jī)(例如,客戶端)。
[0074]按照對計算機(jī)存儲器內(nèi)的數(shù)據(jù)比特的操作的算法和符號表述表示了先前的詳細(xì)描述。這些算法描述和表述是數(shù)據(jù)處理領(lǐng)域中的那些技術(shù)人員向本領(lǐng)域其它技術(shù)人員最有效地傳達(dá)它們工作的基本內(nèi)容所使用工具。這里,算法一般被設(shè)想為導(dǎo)致所希望的結(jié)果的自洽操作序列。這些操作是需要對物理量的物理操作的那些操作。通常,但不一定是必須的,這些量采用能夠被存儲、被轉(zhuǎn)送、被組合、被比較或以其他方式被操作的電信號或磁信號的形式。有時候,特別是為了共同使用的原由,已被證實將這些信號提作比特、值、元素、符號、字符、術(shù)語、數(shù)字等是方便的。
[0075]然而,應(yīng)該注意的是,所有這些以及相似的術(shù)語中的全部術(shù)語與適當(dāng)?shù)匚锢砹肯嚓P(guān)聯(lián)并且僅僅是適用這些量的方便標(biāo)簽。除非特別指明或者以其他方式從以上討論顯而易見,可以明白,在整個說明書中,利用諸如“處理”或“計算”或“判斷”或“顯示”等的術(shù)語的討論,涉及計算機(jī)系統(tǒng)或類似的電子計算裝置的動作和處理,計算機(jī)系統(tǒng)或類似的電子計算裝置操作被表示為計算機(jī)系統(tǒng)的寄存器和存儲器內(nèi)的物理(電子)量的數(shù)據(jù)并且將它們變換成被類似地表示為計算機(jī)系統(tǒng)存儲器或寄存器或其它這樣的信息存儲裝置、發(fā)送或顯示裝置內(nèi)的物理量的數(shù)據(jù)。
[0076]本發(fā)明還涉及用于執(zhí)行在此所述的操作的設(shè)備。該設(shè)備可以被特別構(gòu)建用于所需要的目的,或其可以包括被計算機(jī)內(nèi)所存儲的計算機(jī)程序有選擇地激活或重新配置的通用計算機(jī)。這樣的計算機(jī)程序可以被存儲在計算機(jī)可讀存儲介質(zhì)中,計算機(jī)可讀存儲介質(zhì)例如是但不限于任何類型的盤(包括軟盤、光盤、CD-ROM和磁光盤、只讀存儲器(ROM)、RAM、EPROM、EEPR0M、磁卡或光卡)或適于存儲電子指令的任何類型的介質(zhì),并且它們各自耦合到計算機(jī)系統(tǒng)總線。
[0077]這里表示的處理和顯示不是固有地與任何具體計算機(jī)或其它設(shè)備有關(guān)。各自通用系統(tǒng)可以與根據(jù)在此的教導(dǎo)的程序一起使用,或者可以證實構(gòu)建更加專門的設(shè)備來執(zhí)行所述操作是方便的。從以下描述中,用于各種這樣的系統(tǒng)的所需要的結(jié)構(gòu)是明顯的。此外,本發(fā)明并不是關(guān)于任何具體編程語言來描述的??梢岳斫猓鞣N編程語言都可以用來實現(xiàn)如在這里所述的發(fā)明的教導(dǎo)。
[0078]以上討論僅僅描述了本發(fā)明的某些示例性實施例。本領(lǐng)域技術(shù)人員將容易從這樣的討論認(rèn)識到,可以對附圖和權(quán)利要求進(jìn)行各種修改而不偏離本發(fā)明的精神和范圍。
【權(quán)利要求】
1.一種計算機(jī)實現(xiàn)的方法,包括: 在第一處理單元中的應(yīng)用程序的運行時期間,響應(yīng)于從所述應(yīng)用程序接收到的第二API請求,加載所述應(yīng)用程序的數(shù)據(jù)處理任務(wù)的一個或者多個可執(zhí)行體,其中,所述一個或者多個可執(zhí)行體與由所述應(yīng)用程序在所述第二 API請求中指定的計算設(shè)備標(biāo)識符所標(biāo)識的第二處理單元兼容,所述計算設(shè)備標(biāo)識符與匹配由所述應(yīng)用程序在運行時期間通過第一API請求先前指定的一個或多個需求的處理單元相關(guān)聯(lián);以及 響應(yīng)于在所述運行時期間從所述應(yīng)用程序接收到的第三API請求,為所述第二處理單元選擇所述一個或多個可執(zhí)行體中的一個可執(zhí)行體。
2.根據(jù)權(quán)利要求1所述的計算機(jī)實現(xiàn)的方法,其中所述第一處理單元和所述第二處理單元是中央處理單元(CPU)或圖形處理單元(GPU)。
3.根據(jù)權(quán)利要求1所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體中的所選擇的一個可執(zhí)行體與所述第三API請求相關(guān)聯(lián)。
4.根據(jù)權(quán)利要求1所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體包括所述一個或多個可執(zhí)行體中的至少一個可執(zhí)行體的描述數(shù)據(jù),所述描述數(shù)據(jù)包括所支持的處理單元的版本和類型。
5.根據(jù)權(quán)利要求1所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體包括源,所述源被編譯來生成所述 一個或多個可執(zhí)行體。
6.根據(jù)權(quán)利要求5所述的計算機(jī)實現(xiàn)的方法,其中所述源是經(jīng)由所述第二API從所述應(yīng)用程序加載的。
7.根據(jù)權(quán)利要求5所述的計算機(jī)實現(xiàn)的方法,其中所述源是從與所述一個或多個可執(zhí)行體相關(guān)聯(lián)的庫加載的。
8.根據(jù)權(quán)利要求5所述的計算機(jī)實現(xiàn)的方法,其中所述加載包括: 比較所述描述數(shù)據(jù)和所述第二處理單元的信息;以及 為所述第二處理單元,從所述源在線編譯出所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體。
9.根據(jù)權(quán)利要求8所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體與所述第二 API請求相關(guān)聯(lián)。
10.根據(jù)權(quán)利要求8所述的計算機(jī)實現(xiàn)的方法,其中所述編譯基于:所述比較指示所述一個或多個可執(zhí)行體中的至少一個可執(zhí)行體對于所述第二處理單元并非是最優(yōu)的。
11.根據(jù)權(quán)利要求8所述的計算機(jī)實現(xiàn)的方法,其中所述編譯基于:所述比較指示所述一個或多個可執(zhí)行體中的至少一個可執(zhí)行體不支持所述第二處理單元。
12.根據(jù)權(quán)利要求8所述的計算機(jī)實現(xiàn)的方法,其中所述編譯包括: 生成所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體的更新后的描述數(shù)據(jù);以及 存儲所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體,所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體包括所述更新后的描述數(shù)據(jù)。
13.根據(jù)權(quán)利要求12所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體被存儲來替換所述一個或多個可執(zhí)行體中的至少一個可執(zhí)行體。
14.根據(jù)權(quán)利要求1所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體包括所述一個或多個可執(zhí)行體中的所述一個可執(zhí)行體的描述數(shù)據(jù),并且其中,所述選擇是基于所述描述數(shù)據(jù)的。
15.根據(jù)權(quán)利要求14所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體中所選擇的一個可執(zhí)行體基于所述描述數(shù)據(jù)而與用于所述第二處理單元的所述一個或多個可執(zhí)行體中最新的版本相關(guān)聯(lián)。
16.根據(jù)權(quán)利要求14所述的計算機(jī)實現(xiàn)的方法,其中所述一個或多個可執(zhí)行體中所選擇的一個可執(zhí)行體基于所述描述數(shù)據(jù)指示的執(zhí)行順序關(guān)系而相關(guān)聯(lián)。
17.—種計算機(jī)實現(xiàn)的方法,包括: 由在第一處理單元中的應(yīng)用程序在運行時期間產(chǎn)生第一 API請求,所述第一 API請求指定第二處理單元的一個或者多個需求; 由所述應(yīng)用程序在運行時期間產(chǎn)生第二 API請求,以加載所述應(yīng)用程序的數(shù)據(jù)處理任務(wù)的一個或者多個可執(zhí)行體,其中,所述一個或者多個可執(zhí)行體與由所述應(yīng)用程序在所述第二 API請求中指定的計算設(shè)備標(biāo)識符所標(biāo)識的所述第二處理單元兼容,所述計算設(shè)備標(biāo)識符與匹配由所述應(yīng)用程序在所述第一 API請求中先前指定的一個或多個需求的處理單元相關(guān)聯(lián);以及 由所述應(yīng)用程序在運行時期間產(chǎn)生第三API請求,以從所述一個或者多個可執(zhí)行體中選擇可執(zhí)行體用以在所述第二處理單元中執(zhí)行。
18.根據(jù)權(quán)利要求17所述的計算機(jī)實現(xiàn)的方法,其中所述第一處理單元和所述第二處理單元是中央處理單元(CPU)或圖形處理單元(GPU)。
19.根據(jù)權(quán)利要求17所述的計算機(jī)實現(xiàn)的方法,其中所述第二API請求與從中編譯出所述一個或多個可執(zhí)行體的源相關(guān)聯(lián)。
20.根據(jù)權(quán)利要求19所述的計算機(jī)實現(xiàn)的方法,其中所選擇的可執(zhí)行體是從所述源離線編譯的。
21.一種數(shù)據(jù)處理系統(tǒng),包括: 用于在第一處理單元中的應(yīng)用程序的運行時期間,響應(yīng)于從所述應(yīng)用程序接收到的第二 API請求,加載所述應(yīng)用程序的數(shù)據(jù)處理任務(wù)的一個或者多個可執(zhí)行體的裝置,其中,所述一個或者多個可執(zhí)行體與由所述應(yīng)用程序在所述第二 API請求中指定的計算設(shè)備標(biāo)識符所標(biāo)識的第二處理單元兼容,所述計算設(shè)備標(biāo)識符與匹配由所述應(yīng)用程序在運行時期間通過第一 API請求先前指定的一個或多個需求的處理單元相關(guān)聯(lián);以及 用于響應(yīng)于在所述運行時期間從所述應(yīng)用程序接收到的第三API請求,為所述第二處理單元選擇所述一個或多個可執(zhí)行體中的一個可執(zhí)行體的裝置。
22.—種數(shù)據(jù)處理系統(tǒng),包括: 用于由在第一處理單元中的應(yīng)用程序在運行時期間產(chǎn)生第一 API請求的裝置,所述第一 API請求指定第二處理單元的一個或者多個需求; 用于由所述應(yīng)用程序在所述運行時期間產(chǎn)生第二 API請求,以加載所述應(yīng)用程序的數(shù)據(jù)處理任務(wù)的 一個或者多個可執(zhí)行體的裝置,其中,所述一個或者多個可執(zhí)行體與由所述應(yīng)用程序在所述第二 API請求中指定的計算設(shè)備標(biāo)識符所標(biāo)識的所述第二處理單元兼容,所述計算設(shè)備標(biāo)識符與匹配由所述應(yīng)用程序在所述第一 API請求中先前指定的一個或多個需求的處理單元相關(guān)聯(lián);以及 由所述應(yīng)用程序在運行時期間產(chǎn)生第三API請求,以從所述一個或者多個可執(zhí)行體中選擇可執(zhí)行體用 以在所述第二處理單元中執(zhí)行的裝置。
【文檔編號】G06F9/38GK103927150SQ201410187203
【公開日】2014年7月16日 申請日期:2008年4月9日 優(yōu)先權(quán)日:2007年4月11日
【發(fā)明者】阿夫泰伯·穆恩史, 杰里米·薩德梅爾 申請人:蘋果公司