專利名稱:在計(jì)算平臺(tái)中分布工作負(fù)荷的制作方法
技術(shù)領(lǐng)域:
本發(fā)明公開(kāi)涉及計(jì)算機(jī)處理器,更確切地來(lái)說(shuō),涉及在處理器之間分布工作負(fù)荷。
背景技術(shù):
為了提高計(jì)算性能,現(xiàn)代處理器實(shí)現(xiàn)多種技術(shù)來(lái)并發(fā)地執(zhí)行任務(wù)。例如,常常對(duì)處理器實(shí)現(xiàn)管線化和/或多線程。許多處理器還包括多核以進(jìn)一步提高性能。此外,可以將多個(gè)處理器與單個(gè)計(jì)算機(jī)系統(tǒng)包括在一起。可以將這些處理器的其中一些專用于各種任務(wù),如圖形處理器、數(shù)字信號(hào)處理器(DSP)等。在所有這些不同資源之間分布工作負(fù)荷可能成問(wèn)題,尤其是當(dāng)資源具有不同接口(例如,具有用于第一處理器的第一格式的代碼可能無(wú)法用于與第二處理器實(shí)現(xiàn)接口,因?yàn)榈诙幚砥餍枰哂械诙煌袷降拇a)時(shí)。希望在此類異構(gòu)計(jì)算平臺(tái)內(nèi)使用多種資源的開(kāi)發(fā)者因此必須常常編寫包含針對(duì)每種資源的特定支持的軟件。因此,開(kāi)發(fā)了若干“域相關(guān)的”(domain-specific)語(yǔ)言,以使程序員能夠編寫可幫助跨異構(gòu)計(jì)算平臺(tái)分布任務(wù)的軟件。此類語(yǔ)言包括OPENCL、CUDA、DIRECT COMPUTE等。然而,使用這些語(yǔ)言可能是繁瑣的。
發(fā)明內(nèi)容
公開(kāi)用于自動(dòng)地在處理器之間分布工作負(fù)荷的多種實(shí)施例。在一個(gè)實(shí)施例中,一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)其上存儲(chǔ)有程序指令,這些程序指令可在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行以便執(zhí)行接收第一組字節(jié)代碼,其中該第一組字節(jié)代碼指定第一組任務(wù)。這些程序指令還可執(zhí)行以執(zhí)行響應(yīng)于確定要將第一組任務(wù)卸載到計(jì)算機(jī)系統(tǒng)的第二處理器而促使用來(lái)執(zhí)行第一組任務(wù)的一組指令的生成。該組指令采用與第一組字節(jié)代碼的格式不同的格式,其中該格式被第二處理器支持。這些程序指令還可執(zhí)行以執(zhí)行促使該組指令被提供到第二處理器以供執(zhí)行。在一個(gè)實(shí)施例中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)包括源程序指令,這些源程序指令可被編譯器編譯以作為已編譯源代碼包含在已編譯代碼中。這些源程序指令包括對(duì)庫(kù)例行程序的應(yīng)用編程接口(API)調(diào)用,其中該API調(diào)用指定一組任務(wù)。該庫(kù)例行程序可被編譯器編譯以便作為已編譯庫(kù)例行程序包括在已編譯代碼中。已編譯源代碼可被計(jì)算系統(tǒng)的第一處理器的虛擬機(jī)解釋以將該組任務(wù)傳遞到已編譯庫(kù)例行程序。已編譯庫(kù)例行程序可被該虛擬機(jī)解釋以響應(yīng)于確定要將該組任務(wù)卸載到計(jì)算機(jī)系統(tǒng)的第二處理器而促使生成采用第二處理器的域相關(guān)語(yǔ)言格式的一組域相關(guān)指令,并促使該組域相關(guān)指令被提供到第二處理器。在一個(gè)實(shí)施例中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)包括庫(kù)例行程序的源程序指令,這些源程序指令可被編譯器編譯以作為已編譯庫(kù)例行程序包含在已編譯代碼中。該已編譯庫(kù)例行程序可在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行以執(zhí)行接收第一組字節(jié)代碼,其中該第一組字節(jié)代碼指定一組任務(wù)。已編譯庫(kù)例行程序還可執(zhí)行以執(zhí)行響應(yīng)于確定要將該組任務(wù)卸載到計(jì)算機(jī)系統(tǒng)的第二處理器而生成一組域相關(guān)指令來(lái)執(zhí)行該組任務(wù),并促使這些域相關(guān)指令被提供到第二處理器以供執(zhí)行。
在一個(gè)實(shí)施例中,一種方法包括接收第一組指令,其中該第一組指令指定一組任務(wù),并且其中接收由在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行的庫(kù)例行程序來(lái)執(zhí)行。該方法還包括庫(kù)例行程序確定是否要將該組任務(wù)卸載到計(jì)算機(jī)系統(tǒng)的第二處理器。該方法還包括響應(yīng)于確定要將該組任務(wù)卸載到第二處理器而促使生成用于執(zhí)行第一組任務(wù)的第二組指令,其中該第二組指令采用與第一組指令的格式不同的格式,其中該格式被第二處理器支持,以及促使第二組指令被提供到第二處理器以供執(zhí)行。在一個(gè)實(shí)施例中,一種方法包括計(jì)算機(jī)系統(tǒng)接收指定一組任務(wù)的第一組字節(jié)代碼。該方法還包括計(jì)算機(jī)系統(tǒng)響應(yīng)于確定要將該組任務(wù)從計(jì)算機(jī)系統(tǒng)的第一處理器卸載到計(jì)算機(jī)系統(tǒng)的第二處理器而生成用于執(zhí)行該組任務(wù)的一組域相關(guān)指令。該方法還包括計(jì)算機(jī)系統(tǒng)促使這些域相關(guān)指令被提供到第二處理器以供執(zhí)行?!?br>
圖I是圖示配置成將字節(jié)代碼轉(zhuǎn)換到域相關(guān)語(yǔ)言的異構(gòu)計(jì)算平臺(tái)的一個(gè)實(shí)施例的框圖。圖2是圖示可執(zhí)行以運(yùn)行可并行處理的指定任務(wù)的模塊的一個(gè)實(shí)施例的框圖。圖3是圖示提供域相關(guān)語(yǔ)言支持的驅(qū)動(dòng)程序的一個(gè)實(shí)施例的框圖。圖4是圖示可執(zhí)行以并行地運(yùn)行指定任務(wù)的模塊的確定單元的一個(gè)實(shí)施例的框圖。圖5是圖示可執(zhí)行以并行地運(yùn)行指定任務(wù)的模塊的優(yōu)化單元的一個(gè)實(shí)施例的框圖。圖6是圖示可執(zhí)行以并行地運(yùn)行指定任務(wù)的模塊的轉(zhuǎn)換單元的一個(gè)實(shí)施例的框圖。圖7是圖示用于在計(jì)算平臺(tái)中自動(dòng)地部署工作負(fù)荷的方法的一個(gè)實(shí)施例的流程圖。圖8是圖示用于在計(jì)算平臺(tái)中自動(dòng)地部署工作負(fù)荷的方法的另一個(gè)實(shí)施例的流程圖。圖9是圖示程序指令的示范編譯的一個(gè)實(shí)施例的框圖。圖10是圖示示范計(jì)算機(jī)系統(tǒng)的一個(gè)實(shí)施例的框圖。圖11是圖示示范計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的實(shí)施例的框圖。
具體實(shí)施例方式本說(shuō)明書包括對(duì)“一個(gè)實(shí)施例”或“實(shí)施例”的引述。本說(shuō)明書中出現(xiàn)的短語(yǔ)“在一個(gè)實(shí)施例中”或“在實(shí)施例中”不一定指同一實(shí)施例??梢耘c本發(fā)明公開(kāi)一致的任何適合方式將特定的特征、結(jié)構(gòu)或特性進(jìn)行組合。術(shù)語(yǔ)。以下段落提供本發(fā)明公開(kāi)(包括權(quán)利要求書)中出現(xiàn)的術(shù)語(yǔ)的定義和/或語(yǔ)境?!鞍?包含”。此術(shù)語(yǔ)是開(kāi)放性的。正如所附權(quán)利要求中所使用的,此術(shù)語(yǔ)不排除另外的結(jié)構(gòu)或步驟??紤]權(quán)利要求,其列舉“一種裝置,其包括一個(gè)或多個(gè)處理器單元…”此類權(quán)利要求不排除該裝置包括另外的組件(例如,網(wǎng)絡(luò)接口單元、圖形電路等)。
“配置成”??梢詫⒍喾N單元、電路或其他組件描述為或要求權(quán)利為“配置成”執(zhí)行一個(gè)或多個(gè)任務(wù)。在此類語(yǔ)境中,“配置成”用于通過(guò)指示單元/電路/組件包括在操作期間執(zhí)行這些一個(gè)或多個(gè)任務(wù)的結(jié)構(gòu)(例如電路)來(lái)暗含結(jié)構(gòu)。因此,即使指定的單元/電路/組件當(dāng)前未工作(例如,未開(kāi)啟),仍可以說(shuō)單元/電路/組件配置成執(zhí)行該任務(wù)。與“配置成”語(yǔ)言一起使用的單元/電路/組件包括硬件-例如,電路、存儲(chǔ)可執(zhí)行以執(zhí)行操作的程序指令的存儲(chǔ)器等。列舉單元/電路/組件“配置成”執(zhí)行一個(gè)或多個(gè)任務(wù)顯性地意味著不對(duì)該單元/電路/組件援用35U. S. C. § 112,第六段。此外,“配置成”還可以包括由軟件和/或固件(例如,F(xiàn)PGA或執(zhí)行軟件的通用處理器)操控以通過(guò)能夠執(zhí)行涉及的任務(wù)的方式工作的通用結(jié)構(gòu)(例如,通用電路)?!翱蓤?zhí)行”。正如本文所使用的,此術(shù)語(yǔ)不僅是指采用與特定和處理器關(guān)聯(lián)的格式的指令(例如,對(duì)于該處理器的指令集體系結(jié)構(gòu)(ISA)是可執(zhí)行或可在從文件轉(zhuǎn)換的存儲(chǔ)器序列執(zhí)行的文件格式,其中該轉(zhuǎn)換是從一個(gè)平臺(tái)到另一個(gè)平臺(tái)而不將文件寫入到另一個(gè)平臺(tái)),而且還指采用能夠被控制程序(例如,JAVA虛擬機(jī))解釋以產(chǎn)生用于該處理器的ISA的指令的中間(即,非源代碼)格式。因此,術(shù)語(yǔ)“可執(zhí)行”涵蓋如本文使用的術(shù)語(yǔ)“可解釋”。但是,當(dāng)稱處理器稱“執(zhí)行”或“運(yùn)行”程序或指令時(shí),此術(shù)語(yǔ)用于實(shí)際表示在ISA內(nèi)執(zhí)行一 組指令的操作以生成任何相關(guān)結(jié)果(例如,發(fā)布、解碼、執(zhí)行和完成該組指令-該術(shù)語(yǔ)不限于例如處理器的管線的“執(zhí)行”階段)。“異構(gòu)計(jì)算平臺(tái)”。此術(shù)語(yǔ)具有本領(lǐng)域中的常規(guī)且公認(rèn)的含義,并且包括含不同類型的計(jì)算單元的系統(tǒng),這些不同類型的通信單元諸如,通用處理器(GPP)、專用處理器(SP,數(shù)字信號(hào)處理器(DSP)或圖形處理單元(GPU))、協(xié)處理器或定制加速邏輯(專用集成電路(ASIC)、可現(xiàn)場(chǎng)編程門陣列(FPGA)等?!白止?jié)代碼”。正如本文所使用的,此術(shù)語(yǔ)廣義地指已編譯源代碼的機(jī)器可讀表示。在一些實(shí)例中,字節(jié)代碼可以在不進(jìn)行任何修改的情況下由處理器執(zhí)行。在其他實(shí)例中,字節(jié)代碼可以由如解釋器(例如,JAVA虛擬機(jī)、PYTHON解釋器等)的控制程序來(lái)處理以產(chǎn)生用于處理器的可執(zhí)行指令。正如本文所使用的,“解釋器”還可以指雖然未實(shí)際地將任何代碼轉(zhuǎn)換到底層平臺(tái),但是協(xié)同調(diào)度預(yù)寫的函數(shù),每個(gè)預(yù)寫的函數(shù)相當(dāng)于單個(gè)字節(jié)代碼指令?!疤摂M機(jī)”。此術(shù)語(yǔ)具有本領(lǐng)域中常規(guī)和公認(rèn)的含義,并且包括物理計(jì)算機(jī)系統(tǒng)的軟件實(shí)現(xiàn),其中虛擬機(jī)可執(zhí)行以接收和執(zhí)行用于該物理計(jì)算機(jī)系統(tǒng)的指令。“域相關(guān)語(yǔ)言”。此術(shù)語(yǔ)具有本領(lǐng)域中常規(guī)和公認(rèn)的含義,并且包括為特定應(yīng)用設(shè)計(jì)的專用編程語(yǔ)言。相比而言,“通用編程語(yǔ)言”是為在多種應(yīng)用中使用而設(shè)計(jì)的編程語(yǔ)言。域相關(guān)語(yǔ)言的示例包括SQL、VERIL0G、0PENCL等。通用編程語(yǔ)言的示例包括C、JAVA、BASIC、PYTHON 等?!皯?yīng)用編程接口(API)”。此術(shù)語(yǔ)具有本領(lǐng)域中常規(guī)和公認(rèn)的含義,并且包括使軟件能夠與其他軟件交互的接口。程序可以執(zhí)行API調(diào)用以使用應(yīng)用、庫(kù)例行程序、操作系統(tǒng)等的功能。本發(fā)明公開(kāi)認(rèn)識(shí)到,在具有異構(gòu)資源的計(jì)算平臺(tái)的環(huán)境中使用域相關(guān)語(yǔ)言存在若干缺點(diǎn)。此類配置需要軟件開(kāi)發(fā)者精通多種編程語(yǔ)言。例如,為了與目前的JAVA技術(shù)互操作,開(kāi)發(fā)者需要以O(shè)PENCL編寫OPENCL “內(nèi)核”(或方法),編寫C/C++代碼以協(xié)調(diào)此內(nèi)核與JVM的執(zhí)行,以及編寫Java代碼以使用Java的JNI (Java本地接口)API與此C/C++代碼通信。(有開(kāi)源純Java綁定,這將允許避開(kāi)C/C++步驟,但是其不是Java語(yǔ)言或SDK/JDK的部分。)因此,不太熟悉這些語(yǔ)言和接口的開(kāi)發(fā)者可能不情愿制作此類軟件。對(duì)于支持域相關(guān)語(yǔ)言的系統(tǒng)和不支持域相關(guān)語(yǔ)言的系統(tǒng),需要開(kāi)發(fā)不同版本的軟件。相應(yīng)地,不支持OPENCL的計(jì)算機(jī)系統(tǒng)可能無(wú)法運(yùn)行部分使用OPENCL編寫的程序。當(dāng)源代碼包含不同語(yǔ)言時(shí),調(diào)試代碼也更難。(調(diào)試軟件一般針對(duì)特定編程語(yǔ)言。)雖然用戶或許能夠調(diào)試源代碼的部分,但是調(diào)試軟件可能略過(guò)域相關(guān)代碼的部分。相應(yīng)地,本發(fā)明公開(kāi)提供一種供開(kāi)發(fā)者利用異構(gòu)計(jì)算平臺(tái)的資源而不會(huì)強(qiáng)制要求開(kāi)發(fā)者使用常規(guī)情況下使用此類資源所必需的域相關(guān)語(yǔ)言的機(jī)制。在下文論述中,公開(kāi)一種機(jī)制的實(shí)施例,其用于將字節(jié)代碼(例如,從如JAVA、FLASH、CLR等受控運(yùn)行時(shí))轉(zhuǎn)換到域相關(guān)語(yǔ)言(例如,OPENCL、CUDA等),以及用于在異構(gòu)計(jì)算平臺(tái)中自動(dòng)地部署此類工作負(fù)荷。正如本文所使用的,術(shù)語(yǔ)“自動(dòng)地”表示任務(wù)無(wú)需用戶輸入來(lái)執(zhí)行。例如,正如下文將描述的,在一個(gè)實(shí)施例中,可以將一組指令傳遞到庫(kù)例行程序,其中庫(kù)例行程序可執(zhí)行以自動(dòng)地確定是否能夠?qū)⒃摻M指令卸載到另一個(gè)處理器。在此處,術(shù)語(yǔ)“自動(dòng)地”表示庫(kù)例行程序在被請(qǐng)求時(shí)執(zhí)行此確定而無(wú)需用戶提供指示該確定應(yīng)該怎樣的輸入;而是,庫(kù)例行程序執(zhí)行以根據(jù)編碼到庫(kù)例行程序的一個(gè)或多個(gè)標(biāo)準(zhǔn)來(lái)作出確定?,F(xiàn)在轉(zhuǎn)到圖1,其中示出配置成將字節(jié)代碼轉(zhuǎn)換到域相關(guān)語(yǔ)言的異構(gòu)計(jì)算平臺(tái)10的一個(gè)實(shí)施例。如圖所示,平臺(tái)10包括存儲(chǔ)器100、處理器110和處理器120。在圖示的實(shí)施例中,存儲(chǔ)器100包含字節(jié)代碼102、任務(wù)運(yùn)行器112、控制程序113、指令114、驅(qū)動(dòng)程序116、操作系統(tǒng)(0S)117和指令122。在某些實(shí)施例中,處理器110配置成執(zhí)行部件112-117(如虛線所示),而處理器120配置成執(zhí)行指令122。在其他實(shí)施例中,可以以不同方式配置平臺(tái)10。在一個(gè)實(shí)施例中,存儲(chǔ)器100配置成存儲(chǔ)平臺(tái)10可使用的信息。雖然存儲(chǔ)器100示出為單個(gè)實(shí)體,但是在一些實(shí)施例中,存儲(chǔ)器100可以對(duì)應(yīng)于平臺(tái)10內(nèi)配置成存儲(chǔ)如圖1所示的那些不同部件的多個(gè)結(jié)構(gòu)。在一個(gè)實(shí)施例中,存儲(chǔ)器100可以包括主存儲(chǔ)裝置,如閃存存儲(chǔ)器、隨機(jī)存取存儲(chǔ)器(RAM-SRAM、ED0 RAM,SDRAM,DDR SDRAM,RAMBUS RAM等)、只讀存儲(chǔ)器(PROM、EEPROM等)。在一個(gè)實(shí)施例中,存儲(chǔ)器100可以包括輔助存儲(chǔ)裝置,如硬盤存儲(chǔ)裝置、軟盤存儲(chǔ)裝置、移動(dòng)盤存儲(chǔ)裝置等。在一個(gè)實(shí)施例中,存儲(chǔ)器100可以包括處理器110和/或120的高速緩沖存儲(chǔ)器。在一些實(shí)施例中,存儲(chǔ)器100可以包括主存儲(chǔ)器、輔助存儲(chǔ)器和高速緩沖存儲(chǔ)器的組合。在不同實(shí)施例中,存儲(chǔ)器100可以包括比圖1中所示更多(或更少)的部件。在一個(gè)實(shí)施例中,處理器110是通用處理器。在一個(gè)實(shí)施例中,處理器110是用于平臺(tái)10的中央處理單元(CPU)。在一個(gè)實(shí)施例中,處理器110是多線程超標(biāo)量處理器。在一個(gè)實(shí)施例中,處理器110包括配置成彼此獨(dú)立工作的多個(gè)多線程執(zhí)行核。在一些實(shí)施例中,平臺(tái)10可以包括與處理器110相似的附加處理器。簡(jiǎn)言之,處理器110可以表示任何適合的處理器。在一個(gè)實(shí)施例中,處理器120是配置成執(zhí)行已從處理器110卸載的工作負(fù)荷(即,指令或任務(wù)的組)的協(xié)處理器。在一個(gè)實(shí)施例中,處理器120是專用處理器,如DSP、GPU等。在一個(gè)實(shí)施例中,處理器120是加速邏輯,如ASIC、FPGA等。在一些實(shí)施例中,處理器120是多線程超標(biāo)量處理器。在一些實(shí)施例中,處理器120包括多個(gè)多線程執(zhí)行核。在一個(gè)實(shí)施例中,字節(jié)代碼102是已編譯源代碼。在一個(gè)實(shí)施例中,字節(jié)代碼102可以由通用編程語(yǔ)言(如BASIC、C/C++、FORTRAN、JAVA、PERL等)的編譯器創(chuàng)建。在一個(gè)實(shí)施例中,字節(jié)代碼102可直接由處理器110執(zhí)行。S卩,字節(jié)代碼102可以包含處理器110的指令集體系結(jié)構(gòu)(ISA)內(nèi)定義的指令。在另一個(gè)實(shí)施例中,字節(jié)代碼102是可(例如由虛擬機(jī))解釋的,以產(chǎn)生可由處理器110執(zhí)行的指令(或協(xié)調(diào)其調(diào)度)。在一個(gè)實(shí)施例中,字節(jié)代碼102可以對(duì)應(yīng)于整個(gè)可執(zhí)行程序。在另一個(gè)實(shí)施例中,字節(jié)代碼102可以對(duì)應(yīng)于可執(zhí)行程序的一部分。在不同實(shí)施例中,字節(jié)代碼102可以對(duì)應(yīng)于JAVA編譯器javac為給定程序生成的多個(gè)JAVA, class文件之一。在一個(gè)實(shí)施例中,字節(jié)代碼102指定多個(gè)任務(wù)104A和104B (即,工作負(fù)荷)以實(shí)現(xiàn)并行化。正如下文將描述的,在不同實(shí)施例中,任務(wù)104可以在處理器110和/或處理器120上并發(fā)地執(zhí)行。在一個(gè)實(shí)施例中,字節(jié)代碼102通過(guò)調(diào)用與任務(wù)運(yùn)行器112關(guān)聯(lián)的應(yīng)用編程接口(API)來(lái)指定任務(wù)104,其中該API使程序員能夠以用于編寫其余源代碼所的相同格式(例如語(yǔ)言)表示數(shù)據(jù)并行問(wèn)題(即,可通過(guò)并發(fā)地執(zhí)行多個(gè)任務(wù)104來(lái)執(zhí)行的問(wèn)題)。例如,在一個(gè)特定實(shí)施例中,開(kāi)發(fā)者通過(guò)擴(kuò)充基類以將數(shù)據(jù)并行問(wèn)題編碼來(lái)編寫指定多個(gè)·任務(wù)104的JAVA源代碼,其中基類在API內(nèi)定義,并且字節(jié)代碼102表示擴(kuò)充類。然后,可以將擴(kuò)充類的實(shí)例提供到任務(wù)運(yùn)行器112以執(zhí)行任務(wù)104。在一些實(shí)施例中,字節(jié)代碼102可以指定不同組任務(wù)104以進(jìn)行并行化(或考慮進(jìn)行并行化)。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112是可執(zhí)行以確定是否要將字節(jié)代碼102指定的任務(wù)104卸載到處理器120的模塊。在一個(gè)實(shí)施例中,字節(jié)代碼102可以將(指定任務(wù)的)指令集合傳遞到任務(wù)運(yùn)行器112,任務(wù)運(yùn)行器112從而可以確定是否要將指定的指令集合卸載到處理器120。任務(wù)運(yùn)行器112可以基于多種標(biāo)準(zhǔn)來(lái)作出其確定。例如,在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以至少部分地基于驅(qū)動(dòng)程序116是否支持特定的域相關(guān)語(yǔ)言來(lái)確定是否要卸載任務(wù)。在一個(gè)實(shí)施例中,如果任務(wù)運(yùn)行器112確定要將任務(wù)104卸載到處理器120,則任務(wù)運(yùn)行器112通過(guò)以域相關(guān)語(yǔ)言生成表示任務(wù)104的一組指令來(lái)促使處理器120執(zhí)行任務(wù)104。(正如本文所使用的,“域相關(guān)指令”是以域相關(guān)語(yǔ)言編寫的指令)。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112通過(guò)使用.class文件中包含的與字節(jié)代碼102對(duì)應(yīng)的元數(shù)據(jù)將字節(jié)代碼102轉(zhuǎn)換到域相關(guān)指令來(lái)生成該組指令。在其他實(shí)施例中,如果原始源代碼仍可用(例如,正如BASIC/JAVA/PERL等的可能情況),則任務(wù)運(yùn)行器112可以執(zhí)行原始源代碼至域相關(guān)指令的文本轉(zhuǎn)換。在圖示的實(shí)施例中,任務(wù)運(yùn)行器112將這些生成的指令提供到驅(qū)動(dòng)程序116,驅(qū)動(dòng)程序116又生成供處理器120執(zhí)行的指令122。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以從驅(qū)動(dòng)程序116接收任務(wù)104的一組對(duì)應(yīng)結(jié)果,其中這些結(jié)果以域相關(guān)語(yǔ)言所使用的格式表示。在一些實(shí)施例中,在處理器120計(jì)算了一組任務(wù)104的結(jié)果之后,任務(wù)運(yùn)行器112可執(zhí)行以將這些結(jié)果從域相關(guān)語(yǔ)言格式轉(zhuǎn)換成指令114可使用的格式。例如,在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以將一組結(jié)果從OPENCL數(shù)據(jù)類型轉(zhuǎn)換到JAVA數(shù)據(jù)類型。任務(wù)運(yùn)行器112可以支持各種域相關(guān)語(yǔ)言中的任一種,如OPENCL、CUDA、DIRECT COMPUTE等。在一個(gè)實(shí)施例中,如果任務(wù)運(yùn)行器112確定不卸載任務(wù)104,則處理器110執(zhí)行任務(wù)104。在不同實(shí)施例中,任務(wù)運(yùn)行器112可以通過(guò)為處理器110生成(或促使生成)可執(zhí)行以執(zhí)行任務(wù)104的指令114來(lái)促使任務(wù)104的執(zhí)行。在一些實(shí)施例中,任務(wù)運(yùn)行器112可執(zhí)行以優(yōu)化字節(jié)代碼102,以便在處理器110上并行地執(zhí)行任務(wù)104。在一些實(shí)施例中,任務(wù)運(yùn)行器112還可以處理原有代碼。例如,在一個(gè)實(shí)施例中,如果字節(jié)代碼102是原有代碼,則任務(wù)運(yùn)行器112可以促使將原有代碼執(zhí)行的任務(wù)卸載到處理器120或可以優(yōu)化原有代碼以供在處理器110上執(zhí)行。在多種實(shí)施例中,任務(wù)運(yùn)行器112可執(zhí)行以確定是否要卸載任務(wù)104,生成一組域相關(guān)指令和/或在運(yùn)行時(shí)(在即包含字節(jié)代碼102的程序正在被平臺(tái)10執(zhí)行時(shí))優(yōu)化字節(jié)代碼102。在其他實(shí)施例中,任務(wù)運(yùn)行器112可以在運(yùn)行時(shí)之前確定是否要卸載任務(wù)104。例如,在一些實(shí)施例中,任務(wù)運(yùn)行器112可以為包含字節(jié)代碼102的程序的后續(xù)執(zhí)行預(yù)處理字節(jié)代碼102。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112是可直接由處理器110執(zhí)行的程序。SP,存儲(chǔ)器100可以包含在處理器110的ISA內(nèi)定義的任務(wù)運(yùn)行器112的指令。在另一個(gè)實(shí)施例中,存儲(chǔ)器100可以包含可由控制程序113解釋以產(chǎn)生可由處理器110執(zhí)行的指令的任務(wù)運(yùn)行器112的字節(jié)代碼。下文結(jié)合圖2和圖4-6描述任務(wù)運(yùn)行器。在一個(gè)實(shí)施例中,控制程序113可執(zhí)行以管理任務(wù)運(yùn)行器112和/或字節(jié)代碼102的執(zhí)行。在一些實(shí)施例中,控制程序113可以管理任務(wù)運(yùn)行器112與平臺(tái)10中的其他部件(例如驅(qū)動(dòng)程序116和OS 117)的交互。在一個(gè)實(shí)施例中,控制程序113是配置成從字節(jié)代碼(例如,字節(jié)代碼102和/或任務(wù)運(yùn)行器112的字節(jié)代碼)產(chǎn)生可由處理器110執(zhí)行的指令(例如,指令114)的解釋器。例如,在一些實(shí)施例中,如果任務(wù)運(yùn)行器112確定要在處理器110上執(zhí)行一組任務(wù),則任務(wù)運(yùn)行器112可以將字節(jié)代碼102的部分提供到控制程序113以產(chǎn)生指令114??刂瞥绦?13可以支持各種解釋的語(yǔ)言中的任一種,如BASIC、JAVA、PERL、RUBY等。在一個(gè)實(shí)施例中,控制程序113可執(zhí)行以實(shí)現(xiàn)虛擬機(jī),該虛擬機(jī)配置成實(shí)現(xiàn)物理機(jī)器的一個(gè)或多個(gè)屬性并執(zhí)行字節(jié)代碼。在一些實(shí)施例中,控制程序113可以包括垃圾收集器,垃圾收集器用于回收不再使用的存儲(chǔ)器位置??刂瞥绦?13可以對(duì)應(yīng)于各種虛擬機(jī)中的任一種,包括SUN公司的JAVA虛擬機(jī)、ADOBE公司的AVM2、MICROSOFT公司的CLR等。在一些實(shí)施例中,平臺(tái)10中可以不包括控制程序113。在一個(gè)實(shí)施例中,指令114表示可由處理器110執(zhí)行以執(zhí)行任務(wù)104的指令。在一個(gè)實(shí)施例中,由解釋字節(jié)代碼102的控制程序113產(chǎn)生指令114。正如上文所提到的,在一個(gè)實(shí)施例中,指令可以由與控制程序113協(xié)同工作的任務(wù)運(yùn)行器112來(lái)產(chǎn)生。在另一個(gè)實(shí)施例中,在字節(jié)代碼102內(nèi)包含指令114。在不同實(shí)施例中,指令114可以包括可執(zhí)行以處理從已卸載到處理器120來(lái)執(zhí)行的任務(wù)104已產(chǎn)生的結(jié)果的指令。例如,指令114可以包括依賴于任務(wù)104中的各種任務(wù)的結(jié)果的指令。在一些實(shí)施例中,指令114可以包括從字節(jié)代碼102生成的附加指令,其不與特定任務(wù)104關(guān)聯(lián)。在一些實(shí)施例中,指令114可以包括從任務(wù)運(yùn)行器112的字節(jié)代碼生成的指令(或包括來(lái)自任務(wù)運(yùn)行器112的指令)。在一個(gè)實(shí)施例中,驅(qū)動(dòng)程序116可執(zhí)行以管理處理器120與平臺(tái)10內(nèi)的其他部件之間的交互。驅(qū)動(dòng)程序116可以對(duì)應(yīng)于各種驅(qū)動(dòng)程序中的任一種,如圖形卡驅(qū)動(dòng)程序、聲卡驅(qū)動(dòng)程序、DSP卡驅(qū)動(dòng)程序、其他類型的外設(shè)驅(qū)動(dòng)程序等。在一個(gè)實(shí)施例中,驅(qū)動(dòng)程序116為處理器120提供域相關(guān)語(yǔ)言支持。即,驅(qū)動(dòng)程序116可以接收一組域相關(guān)指令并生成可由處理器120執(zhí)行的一組對(duì)應(yīng)的指令122。例如,在一個(gè)實(shí)施例中,驅(qū)動(dòng)程序116可以將用于一組給定任務(wù)104的OPENCL指令轉(zhuǎn)換成處理器120的ISA指令,并將這些ISA指令提供到處理器120以促使該組任務(wù)104的執(zhí)行。當(dāng)然,驅(qū)動(dòng)程序116可以支持各種域相關(guān)語(yǔ)言中的任一種。下文結(jié)合圖3進(jìn)一步描述驅(qū)動(dòng)程序116。在一個(gè)實(shí)施例中,OS 117可執(zhí)行以管理平臺(tái)10上程序的執(zhí)行。OS 117可以對(duì)應(yīng)于各種已知操作系統(tǒng)中的任一種,如LINUX、WINDOWS、OSX, SOLARIS等。在一些實(shí)施例中,OS 117可以是分布式操作系統(tǒng)的一部分。在多種實(shí)施例中,OS可以包括多種驅(qū)動(dòng)程序以協(xié)調(diào)平臺(tái)10上的軟件與平臺(tái)10的一個(gè)或多個(gè)硬件組件的交互。在一個(gè)實(shí)施例中,將驅(qū)動(dòng)程序116集成在0S117內(nèi)。在其他實(shí)施例中,驅(qū)動(dòng)程序116不是OS 117的組件。在一個(gè)實(shí)施例中,指令122表示可由處理器120執(zhí)行以執(zhí)行任務(wù)104的指令。正如上文所提到的,在一個(gè)實(shí)施例中,由驅(qū)動(dòng)程序116生成指令122。在另一個(gè)實(shí)施例中,可以用不同方式(例如由任務(wù)運(yùn)行器112、控制程序113等)生成指令122。在一個(gè)實(shí)施例中,在處理器120的ISA內(nèi)定義指令122。在另一個(gè)實(shí)施例中,指令122可以是處理器120用于生成可由處理器120執(zhí)行的一組對(duì)應(yīng)指令的命令。在多種實(shí)施例中,平臺(tái)10提供一種使程序員能夠開(kāi)發(fā)使用平臺(tái)10的多個(gè)資源(例如處理器110和120)的軟件的機(jī)制。在一些實(shí)例中,程序員可以使用一種通用語(yǔ)言(例如,JAVA)編寫軟件而不必了解特定域相關(guān)語(yǔ)言(例如,OPENCL)。因?yàn)榭梢允褂孟嗤恼Z(yǔ)言編寫軟件,所以支持該語(yǔ)言的調(diào)試器(例如通過(guò)ECLIPSE IDE調(diào)試JAVA的GNU調(diào)試器)能夠調(diào)試包括進(jìn)行API調(diào)用以執(zhí)行任務(wù)104的部分的整個(gè)軟件。在一些實(shí)例中,可以為多個(gè)平臺(tái)編寫一個(gè)版本的軟件,而不考慮這些平臺(tái)是否提供對(duì)特定域相關(guān)語(yǔ)言的支持,因?yàn)樵诙喾N實(shí)施例中,任務(wù)運(yùn)行器112可執(zhí)行以確定是否要在運(yùn)行時(shí)卸載任務(wù),并且能夠確定在給定的平臺(tái)10上是否存在這種支持。例如,如果平臺(tái)10無(wú)法卸載任務(wù)104,則任務(wù)運(yùn)行器112仍可以能夠優(yōu)化開(kāi)發(fā)者的軟件,使得它執(zhí)行得更有效率。實(shí)際上,在一些實(shí)例中,任務(wù)運(yùn)行器112在優(yōu)化軟件以實(shí)現(xiàn)并行化時(shí)比開(kāi)發(fā)者嘗試自己優(yōu)化軟件更好?,F(xiàn)在轉(zhuǎn)到圖2,其中示出任務(wù)運(yùn)行器軟件模塊112的一個(gè)實(shí)施例的表示。正如所提到的,任務(wù)運(yùn)行器112是可執(zhí)行以接收一組指令(例如指定到處理器110的那些指令)和確定是否要將這些指令卸載(即,重新指定)到不同的處理器(例如處理器120 )的代碼(或存儲(chǔ)此類代碼的存儲(chǔ)器)。如圖所示,任務(wù)運(yùn)行器112包括確定單元210、優(yōu)化單元220和轉(zhuǎn)換單元230。在一個(gè)實(shí)施例中,控制程序113 (圖2未示出)是虛擬機(jī),任務(wù)運(yùn)行器112在該虛擬機(jī)中執(zhí)行。例如,在一個(gè)實(shí)施例中,控制程序113對(duì)應(yīng)于JAVA虛擬機(jī),其中任務(wù)運(yùn)行器112是已解釋的JAVA字節(jié)代碼。在其他實(shí)施例中,處理器110可以不使用控制程序113而執(zhí)行任務(wù)運(yùn)行器112。在一個(gè)實(shí)施例中,確定單元210表示可執(zhí)行以確定是否要將任務(wù)104卸載到處理器120的程序指令。在圖示的實(shí)施例中,任務(wù)運(yùn)行器210包括在確定單元210中響應(yīng)于接收到字節(jié)代碼102 (或字節(jié)代碼102的至少一部分)而執(zhí)行指令。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器210響應(yīng)于接收到包含字節(jié)代碼102的JAVA, class文件而啟動(dòng)確定單元210中指令的執(zhí)行。在一個(gè)實(shí)施例中,確定單元210可以包含可執(zhí)行以基于與平臺(tái)10的特性關(guān)聯(lián)的一組一個(gè)或多個(gè)初始標(biāo)準(zhǔn)和/或?qū)ψ止?jié)代碼102的初始分析來(lái)確定是否要卸載任務(wù)的指令。在多種實(shí)施例中,此類確定是自動(dòng)的。在一個(gè)實(shí)施例中,確定單元210可以執(zhí)行以至少部分地基于平臺(tái)10是否支持域相關(guān)語(yǔ)言來(lái)作出初始確定。如果不存在支持,則在多種實(shí)施例中,確定單元210可以不執(zhí)行任何進(jìn)一步的分析。在一些實(shí)施例中,確定單元210至少部分地基于字節(jié)代碼102是否引用無(wú)法以域相關(guān)語(yǔ)言表示的數(shù)據(jù)類型或調(diào)用無(wú)法以域相關(guān)語(yǔ)目表不的方法來(lái)確定是否要卸載任務(wù)104。例如,特定域相關(guān)語(yǔ)目可能不支持IEEE雙精度數(shù)據(jù)類型。因此,確定單元210可以確定不卸載包括雙精度的JAVA工作負(fù)荷。相似地,JAVA支持String數(shù)據(jù)類型(實(shí)際為類)的概念,不同于大多數(shù)類,它被JAVA虛擬機(jī)所理解,但是在OPENCL中沒(méi)有此類表示。因此,在一個(gè)實(shí)施例中,確定單元210可以確定引用此類String數(shù)據(jù)類型的JAVA工作負(fù)荷不被卸載。在其他實(shí)施例中,確定單元210可以執(zhí)行進(jìn)一步分析以確定String的使用是否“可映射”到其他OPENCL可表示的類型-例如是否可以移除String引用并以其他代碼表示替代此類引用。在一個(gè)實(shí)施例中,如果滿足一組初始標(biāo)準(zhǔn),則任務(wù)運(yùn)行器112可以啟動(dòng)在轉(zhuǎn)換單元230中指令的執(zhí)行以將字節(jié)代碼102轉(zhuǎn)換成域相關(guān)指令。在一個(gè)實(shí)施例中,在轉(zhuǎn)換單元230執(zhí)行的同時(shí),確定單元210繼續(xù)執(zhí)行基于另外一組標(biāo)準(zhǔn)確定是否要卸載任務(wù)104。例如,在一個(gè)實(shí)施例中,確定單元210至少部分地基于字節(jié)代碼102是否被確定為具有導(dǎo)致無(wú)限循環(huán)的執(zhí)行路徑來(lái)確定是否要卸載任務(wù)104。在一個(gè)實(shí)施例中,確定單元210至少部分地基于字節(jié)代碼102是否試圖執(zhí)行如使用遞歸的非法動(dòng)作來(lái)確定是否要卸載任務(wù)104。此外,確定單元210還可以執(zhí)行以至少部分地基于一組任務(wù)104的一個(gè)或多個(gè)先前執(zhí)行來(lái)確定是否要卸載任務(wù)104。例如,在一個(gè)實(shí)施例中,確定單元210可以存儲(chǔ)有關(guān)針對(duì)多組任務(wù)104的先前確定的信息,如是否成功卸載過(guò)一組特定任務(wù)104的指示。在一些實(shí)施例中,確定單元210至少部分地基于任務(wù)運(yùn)行器112是否存儲(chǔ)用于該組任務(wù)104的一組先前生成的域相關(guān)指令來(lái)確定是否要卸載任務(wù)104。在多種實(shí)施例中,確定單元210可以收集有關(guān)字節(jié)代碼102的一個(gè)部分的先前迭代(例如其中如在循環(huán)中那樣,字節(jié)代碼102的該部分多次指定一組相同的任務(wù)104)的信息?;蛘撸_定單元210可以收集有關(guān)由執(zhí)行在程序的不同部分中多次包括字節(jié)代碼102的程序所產(chǎn)生的先前執(zhí)行的信息。在一個(gè)實(shí)施例中,確定單元210可以收集有關(guān)任務(wù)104的先前執(zhí)行的效率的信息。例如,在一些實(shí)施例中,任務(wù)運(yùn)行器112可以促使任務(wù)104被處理器110和被處理器120執(zhí)行。如果確定單元210確定處理器110執(zhí)行該組任務(wù)比處理器120更有效率(例如,使用更少的時(shí)間),則確定單元210可以確定不卸載任務(wù)104的后續(xù)執(zhí)行?;蛘?,如果確定單元210確定處理器120在執(zhí)行該組任務(wù)時(shí)更有效率,則單元210可以例如緩存卸載該組任務(wù)的后續(xù)執(zhí)行的指示。下文結(jié)合圖4進(jìn)一步描述確定單元210。在一個(gè)實(shí)施例中,優(yōu)化單元220表示可執(zhí)行以為任務(wù)104在處理器110上的執(zhí)行來(lái)優(yōu)化字節(jié)代碼102的程序指令。在一個(gè)實(shí)施例中,一旦確定單元210確定不卸載任務(wù)104,則任務(wù)運(yùn)行器112可以啟動(dòng)優(yōu)化單元220的執(zhí)行。在多種實(shí)施例中,優(yōu)化單元220分析字節(jié)代碼102以識(shí)別字節(jié)代碼102中可被修改以改善并行化的部分。在一個(gè)實(shí)施例中,如果識(shí)別出此類部分,則優(yōu)化單元220可以修改字節(jié)代碼102以為任務(wù)104添加線程池支持。在其他實(shí)施例中,優(yōu)化單元220可以使用其他技術(shù)來(lái)提高任務(wù)104的性能。一旦修改了字節(jié)代碼102的部分,則在一些實(shí)施例中,優(yōu)化單元220將修改的字節(jié)代碼102提供到控制程序113以解釋成指令114。下文結(jié)合圖5進(jìn)一步描述字節(jié)代碼102的優(yōu)化。在一個(gè)實(shí)施例中,轉(zhuǎn)換單元230表示可執(zhí)行以為任務(wù)104在處理器120上的執(zhí)行來(lái)生成一組域相關(guān)指令的程序指令。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112的執(zhí)行可以包括一旦確定單元210確定對(duì)于卸載任務(wù)104已滿足一組初始標(biāo)準(zhǔn),則啟動(dòng)轉(zhuǎn)換單元230的執(zhí)行。在圖示的實(shí)施例中,轉(zhuǎn)換單元230將一組域相關(guān)指令提供到驅(qū)動(dòng)程序116以促使處理器120執(zhí)行任務(wù)104。在一個(gè)實(shí)施例中,轉(zhuǎn)換單元230可以從驅(qū)動(dòng)程序116接收任務(wù)104的一組對(duì)應(yīng)結(jié)果,其中這些結(jié)果以域相關(guān)語(yǔ)言的格式表示。在一些實(shí)施例中,轉(zhuǎn)換單元230將這些結(jié)果從域相關(guān)語(yǔ)言的格式轉(zhuǎn)換成指令114可使用的格式。例如,在一個(gè)實(shí)施例中,在任務(wù)運(yùn)行器112已從驅(qū)動(dòng)程序116接收到一組計(jì)算的結(jié)果之后,任務(wù)運(yùn)行器112可以將一組結(jié)果從OPENCL數(shù)據(jù)類型轉(zhuǎn)換成JAVA數(shù)據(jù)類型。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112 (例如,轉(zhuǎn)換單元230)可執(zhí)行以存儲(chǔ)一組已生成的域相關(guān)指令以用于任務(wù)104的后續(xù)執(zhí)行。在一些實(shí)施例中,轉(zhuǎn)換單元230通過(guò)將字節(jié)代碼102轉(zhuǎn)換到中間表示并且然后由中間表示生成一組域相關(guān)指令來(lái)生成該組域相關(guān)指令。下文結(jié)合圖6進(jìn)一步描述將字節(jié)代碼102轉(zhuǎn)換到域相關(guān)語(yǔ)目。注意,單元210、220和230是示范性的;在任務(wù)運(yùn)行器112的多種實(shí)施例中,可以通過(guò)不同方式將指令分組?,F(xiàn)在參考圖3,示出驅(qū)動(dòng)程序116的一個(gè)實(shí)施例。如圖所示,驅(qū)動(dòng)程序116包括域相關(guān)語(yǔ)言單元310。在圖示的實(shí)施例中,將驅(qū)動(dòng)程序116集成在OS 117內(nèi)。在其他實(shí)施例中,驅(qū)動(dòng)程序116可以與OS 117分開(kāi)來(lái)實(shí)現(xiàn)。在一個(gè)實(shí)施例中,域相關(guān)語(yǔ)言單元310可執(zhí)行以提供對(duì)域相關(guān)語(yǔ)言的驅(qū)動(dòng)程序支持。在一個(gè)實(shí)施例中,單元310從轉(zhuǎn)換單元230接收一組域相關(guān)指令,并產(chǎn)生一組對(duì)應(yīng)的指令122。在多種實(shí)施例中,單元310可以支持如上文所述的各種域相關(guān)語(yǔ)言中的任一種。在一個(gè)實(shí)施例中,單兀310產(chǎn)生處理器120的ISA內(nèi)定義的指令122。在另一個(gè)實(shí)施例中,單元310產(chǎn)生促使處理器120執(zhí)行任務(wù)104的非ISA指令-例如,處理器120可以使用指令122來(lái)生成可由處理器120執(zhí)行的一組對(duì)應(yīng)指令。一旦處理器120執(zhí)行一組任務(wù)104,則在一個(gè)實(shí)施例中,域相關(guān)語(yǔ)言單元310接收一組結(jié)果,并將這些結(jié)果轉(zhuǎn)換成域相關(guān)語(yǔ)言的數(shù)據(jù)類型。例如,在一個(gè)實(shí)施例中,單元310可以將接收到的結(jié)果轉(zhuǎn)換成OPENCL數(shù)據(jù)類型。在圖示的實(shí)施例中,單元310將轉(zhuǎn)換的結(jié)果提供到轉(zhuǎn)換單元230,轉(zhuǎn)換單元230又可以將這些結(jié)果從域相關(guān)語(yǔ)言的數(shù)據(jù)類型轉(zhuǎn)換成指令114支持的數(shù)據(jù)類型(例如,JAVA數(shù)據(jù)類型)?,F(xiàn)在轉(zhuǎn)到圖4,其中示出確定單元210的一個(gè)實(shí)施例。在圖示的實(shí)施例中,確定單元210包括用于對(duì)接收到的字節(jié)代碼102執(zhí)行多種測(cè)試的多個(gè)單元410-460。在其他實(shí)施例中,確定單元210可以包括額外的單元、更少的單元或與所示那些單元不同的單元。在一些實(shí)施例中,確定單元210可以并行地執(zhí)行多種所示的測(cè)試。在一個(gè)實(shí)施例中,確定單元210可以在由字節(jié)代碼102生成域相關(guān)指令期間的不同階段測(cè)試各種標(biāo)準(zhǔn)。在一個(gè)實(shí)施例中,支持檢測(cè)單元410表示可執(zhí)行以確定平臺(tái)10是否支持域相關(guān)語(yǔ)言的程序指令。在一個(gè)實(shí)施例中,單元410基于從OS 117 (例如系統(tǒng)寄存器)接收的信息確定存在支持。在另一個(gè)實(shí)施例中,單元410基于從驅(qū)動(dòng)程序116接收的信息確定存在支持。在其他實(shí)施例中,單元410基于來(lái)自其他源的信息確定存在支持。在一個(gè)實(shí)施例中,如果單元410確定不存在支持,則確定單元210可以得出不能將任務(wù)104卸載到處理器120的結(jié)論。在一個(gè)實(shí)施例中,數(shù)據(jù)類型映射確定單元420表示可執(zhí)行以確定字節(jié)代碼102是否引用無(wú)法以目標(biāo)域相關(guān)語(yǔ)言(即驅(qū)動(dòng)程序116支持的域相關(guān)語(yǔ)言)表示的任何數(shù)據(jù)類型的程序指令。例如,在一個(gè)實(shí)施例中,如果字節(jié)代碼102是JAVA字節(jié)代碼,則如int、float、double、byte或此類元素的數(shù)組的數(shù)據(jù)類型可以具有在OPENCL中的對(duì)應(yīng)數(shù)據(jù)類型。在一個(gè)實(shí)施例中,如果單元420確定字節(jié)代碼102引用無(wú)法以用于一組任務(wù)104的目標(biāo)域相關(guān)語(yǔ)言表示的數(shù)據(jù)類型,則確定單元210可以確定不卸載該組任務(wù)104。在一個(gè)實(shí)施例中,函數(shù)映射確定單元430表示可執(zhí)行以確定字節(jié)代碼102是否調(diào)用目標(biāo)域相關(guān)語(yǔ)言不支持的任何函數(shù)(例如,例行程序/方法)的程序指令。例如,如果字節(jié)代碼102是JAVA字節(jié)代碼,則單元430可以確定該JAVA字節(jié)代碼是否調(diào)用在OPENCL中沒(méi)有等效方式的JAVA專有函數(shù)(例如,System, out. println)。在一個(gè)實(shí)施例中,如果單元430確定字節(jié)代碼102為一組任務(wù)104調(diào)用不支持的函數(shù),則確定單元210可以確定要中止卸載該組任務(wù)104。另一方面,如果字節(jié)代碼的代碼102僅調(diào)用在目標(biāo)域相關(guān)語(yǔ)言中支持的那些函數(shù)(例如,與OPENCL的sqrt()函數(shù)兼容的JAVA的Math, sqrt ()函數(shù)),則確定單元210可以允許卸載繼續(xù)。]在一個(gè)實(shí)施例中,成本轉(zhuǎn)移確定單元440表示可執(zhí)行以確定一組任務(wù)104的集合大小(即,并行任務(wù)的數(shù)量)是否低于預(yù)定閾值(指示卸載的成本不可能是成本有效的)的程序指令。在一個(gè)實(shí)施例中,如果單元440確定集合大小低于閾值,則確定單元210可以確定要中止卸載該組任務(wù)104。單元440可以執(zhí)行多種其他檢查以將卸載的預(yù)期獲益與預(yù)期成本比較。在一個(gè)實(shí)施例中,非法特征檢測(cè)單元450表示可執(zhí)行以確定字節(jié)代碼102是否在使用在語(yǔ)法上可接受但卻為非法的特征的程序指令。例如,在多種實(shí)施例中,驅(qū)動(dòng)程序116可以支持禁止方法/函數(shù)使用遞歸的OPENCL版本(例如,該版本無(wú)法表示遞歸所需的堆棧幀)。在一個(gè)實(shí)施例中,如果單元450確定JAVA代碼可以執(zhí)行遞歸,則確定單元210可以確定不部署該JAVA代碼,因?yàn)椴渴鹂赡軙?huì)導(dǎo)致意想不到的運(yùn)行時(shí)錯(cuò)誤。在一個(gè)實(shí)施例中,如果單元450檢測(cè)到用于一組任務(wù)104的此類使用,則確定單元210可以確定要中止卸載。在一個(gè)實(shí)施例中,無(wú)限循環(huán)檢測(cè)單元460表示可執(zhí)行以確定字節(jié)代碼102是否具有可能無(wú)限地循環(huán)(即導(dǎo)致無(wú)限/無(wú)窮循環(huán))的任何執(zhí)行路徑的程序指令。在一個(gè)實(shí)施例中,如果單元460檢測(cè)到與一組任務(wù)104關(guān)聯(lián)的任何此類路徑,則確定單元210可以確定要中止卸載該組任務(wù)104。如上文提到的,確定單元210可以在字節(jié)代碼102的轉(zhuǎn)換過(guò)程期間的不同階段測(cè)試多種標(biāo)準(zhǔn)。如果對(duì)于一組任務(wù)在任何點(diǎn)處這些測(cè)試之一未通過(guò),則在不同實(shí)施例中,確定單元210可以即刻確定要中止卸載。通過(guò)以此方式測(cè)試標(biāo)準(zhǔn),在一些實(shí)例中,確定單元210可以快速地達(dá)成確定以在將大量資源花費(fèi)在字節(jié)代碼102的轉(zhuǎn)換上之前中止卸載?,F(xiàn)在轉(zhuǎn)到圖5,其中示出優(yōu)化單元220的一個(gè)實(shí)施例。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以響應(yīng)于確定單元210確定要中止一組任務(wù)104的卸載而啟動(dòng)優(yōu)化單元220的執(zhí)行。在另一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以例如在確定單元210已確定是否要中止卸載之前啟動(dòng)優(yōu)化單元220與轉(zhuǎn)換單元230的協(xié)同執(zhí)行。在圖示的實(shí)施例中,優(yōu)化單元220包括優(yōu)化確定單元510和線程池修改單元520。在一些實(shí)施例中,優(yōu)化單元220包括用于使用其他技術(shù)優(yōu)化字節(jié)代碼102的附加單元。在一個(gè)實(shí)施例中,優(yōu)化確定單元510表示可執(zhí)行以識(shí)別字節(jié)代碼102中可被修改以改善任務(wù)104被處理器110的執(zhí)行的部分的程序指令。在一個(gè)實(shí)施例中,單元510可以識(shí)別字節(jié)代碼102中包含對(duì)與任務(wù)運(yùn)行器112關(guān)聯(lián)的API的調(diào)用的部分。在一個(gè)實(shí)施例中,單元510可以識(shí)別字節(jié)代碼102中的特定結(jié)構(gòu)元素(例如,循環(huán)),以便進(jìn)行并行化。在一個(gè)實(shí)施例中,單元510可以通過(guò)分析由轉(zhuǎn)換單元230生成的字節(jié)代碼102的中間表示來(lái)識(shí)別這些部分(如下文結(jié)合圖6所述)。在一個(gè)實(shí)施例中,如果單元510確定字節(jié)代碼102的這些部分可修改以改善一組任務(wù)104的性能,則優(yōu)化單元210可以啟動(dòng)線程池修改單元520的執(zhí)行。如果單元510確定字節(jié)代碼102的這些部分無(wú)法通過(guò)預(yù)定義機(jī)制改善,則在一個(gè)實(shí)施例中,單元510將這些部分提供到控制程序113而不進(jìn)行任何修改,由此促使控制程序113產(chǎn)生對(duì)應(yīng)的指令114。在一個(gè)實(shí)施例中,線程池修改單元520表示可執(zhí)行以添加對(duì)創(chuàng)建處理器110用于執(zhí)行任務(wù)104的線程池的支持的程序指令。例如,在多種實(shí)施例中,單元520可以假定沒(méi)有可能卸載而在準(zhǔn)備在原目標(biāo)平臺(tái)(例如處理器110)上執(zhí)行數(shù)據(jù)并行工作負(fù)荷時(shí)修改字節(jié)代碼102。由此,通過(guò)使用任務(wù)運(yùn)行器112和提供程序員可擴(kuò)充的基類,程序員能夠聲明代碼要被并行化(例如,以有效率的數(shù)據(jù)并行方式執(zhí)行)。在JAVA環(huán)境中,這意味著任務(wù)運(yùn)行器112的缺省JAVA實(shí)現(xiàn)可以通過(guò)協(xié)調(diào)代碼的執(zhí)行來(lái)使用線程池而不變換代碼。如果代碼是可卸載的,則假定該代碼所卸載到的平臺(tái)協(xié)調(diào)并行執(zhí)行。正如本文所使用的,“線程池”是包含用于執(zhí)行的多個(gè)線程的隊(duì)列。在一個(gè)實(shí)施例中,為一組給定的任務(wù)中的每個(gè)任務(wù)104創(chuàng)建線程。當(dāng)使用線程池時(shí),處理器(例如,處理器110)在資源變得可供用于執(zhí)行這些線程時(shí)從該池移除線程。一旦線程完成執(zhí)行,則在一些實(shí)施例中,將線程執(zhí)行的結(jié)果置于對(duì)應(yīng)的隊(duì)列中,直到可以使用該結(jié)果為止。考慮字節(jié)代碼102指定一組2000個(gè)任務(wù)104的情況。在一個(gè)實(shí)施例中,單元520可以對(duì)字節(jié)代碼102添加支持,以使它可執(zhí)行以創(chuàng)建包含2000個(gè)線程的線程池(每個(gè)任務(wù)104對(duì)應(yīng)于一個(gè)線程)。在一個(gè)實(shí)施例中,如果處理器110是四核處理器,則每個(gè)核可以執(zhí)行任務(wù)104中的500個(gè)任務(wù)。如果每個(gè)核一次能夠執(zhí)行4個(gè)線程,則能夠并發(fā)執(zhí)行16個(gè)線程。相應(yīng)地,處理器110能夠比在順序地執(zhí)行任務(wù)104的情況下顯著更快地執(zhí)行一組任務(wù)104?,F(xiàn)在轉(zhuǎn)到圖6,其中示出轉(zhuǎn)換單元230的一個(gè)實(shí)施例。正如上文所提到的,在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以響應(yīng)于確定單元210確定已滿足用于卸載一組任務(wù)104的一組初始標(biāo)準(zhǔn)而啟動(dòng)轉(zhuǎn)換單元230的執(zhí)行。在另一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以啟動(dòng)轉(zhuǎn)換單元230與優(yōu)化單元220的協(xié)同執(zhí)行。在圖示的實(shí)施例中,轉(zhuǎn)換單元230包括具化單元610、域相關(guān)語(yǔ)言生成單元620和結(jié)果轉(zhuǎn)換單元630。在其他實(shí)施例中,轉(zhuǎn)換單元230可以通過(guò)不同方式配置。在一個(gè)實(shí)施例中,具化單元610表示可執(zhí)行以將字節(jié)代碼102具化并產(chǎn)生字節(jié)代碼102的中間表示的程序指令。正如本文所使用的,具化是指解碼字節(jié)代碼102以抽象其中包含的信息的過(guò)程。在一個(gè)實(shí)施例中,單元610開(kāi)始于解析字節(jié)代碼102以識(shí)別在執(zhí)行期間使用的常量。在一些實(shí)施例中,單元610通過(guò)解析JAVA, class文件的constant_pool部分以查找如整數(shù)、Unicode、字符串等的常量來(lái)識(shí)別字節(jié)代碼102中的常量。在一些實(shí)施例中,單元610還解析.class文件的屬性部分以重構(gòu)可用于產(chǎn)生字節(jié)代碼102的中間表示的屬性信息。在一個(gè)實(shí)施例中,單元610還解析字節(jié)代碼102以識(shí)別字節(jié)代碼使用的任何方法。在一些實(shí)施例中,單元610通過(guò)解析JAVA, class文件的方法部分來(lái)識(shí)別方法。在一個(gè)實(shí)施例中,一旦單兀610已確定有關(guān)常量、屬性和/或方法的信息,貝1J單兀610可以開(kāi)始將字節(jié)代碼102中的指令解碼。在一些實(shí)施例中,單元610可以通過(guò)從解碼的指令和解析的信息構(gòu)造表達(dá)式樹(shù)來(lái)產(chǎn)生中間表不。在一個(gè)實(shí)施例中,在單兀610完成將信息添加到表達(dá)式樹(shù)之后,單元610識(shí)別字節(jié)代碼102中的更高級(jí)別結(jié)構(gòu),如循環(huán)、嵌套的if語(yǔ)句等。在一個(gè)實(shí)施例中,單元610可以識(shí)別已知將由字節(jié)代碼102讀取的特定變量或數(shù)組。有關(guān)具化的附加信息可以參見(jiàn)Cristina Cifuentes所著的“A Structuring Algorithm forDecompilation(1993)”。在一個(gè)實(shí)施例中,域相關(guān)語(yǔ)言生成單元620表示可執(zhí)行以根據(jù)具化單元610生成的中間表示生成域相關(guān)指令的程序指令。在一個(gè)實(shí)施例中,單元620可以生成包含具化單元610在字節(jié)代碼102中識(shí)別的對(duì)應(yīng)常量、屬性或方法的域相關(guān)指令。在一些實(shí)施例中,單元620可以生成具有對(duì)應(yīng)于字節(jié)代碼102中的那些結(jié)構(gòu)的更高級(jí)別結(jié)構(gòu)的域相關(guān)指令。在多種實(shí)施例中,單元620可以基于由具化單元610收集的其他信息生成域相關(guān)指令。在一些實(shí)施例中,如果具化單元610識(shí)別出已知將由字節(jié)代碼102讀取的特定變量或數(shù)組,則單元620可以生成域相關(guān)指令以將這些數(shù)組/值置于“只讀”存儲(chǔ)中或?qū)⑦@些數(shù)組/值標(biāo)記為只讀,以便允許代碼優(yōu)化。相似地,單元620可以生成域相關(guān)指令以將值標(biāo)為WRITE_0NLY或 READ_WRITE。在一個(gè)實(shí)施例中,結(jié)果轉(zhuǎn)換單元630表示可執(zhí)行以將任務(wù)104的結(jié)果從域相關(guān)語(yǔ)言的格式轉(zhuǎn)換到字節(jié)代碼102支持的格式的程序指令。例如,在一個(gè)實(shí)施例中,單元630可以將結(jié)果(例如,整型數(shù)、布爾量、浮點(diǎn)數(shù)等)從OPENCL數(shù)據(jù)類型格式轉(zhuǎn)換到JAVA數(shù)據(jù)類型格式。在一些實(shí)施例中,單元630通過(guò)復(fù)制數(shù)據(jù)將結(jié)果轉(zhuǎn)換到解釋器(例如控制程序113)所支持的數(shù)據(jù)結(jié)構(gòu)表示。在一些實(shí)施例中,單元630可以將數(shù)據(jù)從大端(big-endian)表示更改為小端(little-endian)表示。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112預(yù)留一組存儲(chǔ)器位置以存儲(chǔ)由一組任務(wù)104的執(zhí)行生成的該組結(jié)果。在一些實(shí)施例中,任務(wù)運(yùn)行器112可以在域相關(guān)語(yǔ)言生成單元620將域相關(guān)指令提供到驅(qū)動(dòng)程序116之前預(yù)留該組存儲(chǔ)器位置。在一個(gè)實(shí)施例中,在處理器120正在產(chǎn)生該組任務(wù)104的結(jié)果時(shí),單元630防止控制程序113的垃圾收集器重新分配這些存儲(chǔ)器位置。以此方式,當(dāng)從驅(qū)動(dòng)程序116接收到結(jié)果時(shí),單元630能夠?qū)⑦@些結(jié)果存儲(chǔ)在這些存儲(chǔ)器位置中。接下來(lái),提供采用上文描述的單元的功能的多種方法?,F(xiàn)在轉(zhuǎn)到圖7,其中示出用于在計(jì)算平臺(tái)中自動(dòng)地部署工作負(fù)荷的方法700的一個(gè)實(shí)施例。在一個(gè)實(shí)施例中,平臺(tái)10執(zhí)行方法700以將程序(例如,字節(jié)代碼102)指定的工作負(fù)荷(例如,任務(wù)104)卸載到協(xié)處理器(例如,處理器120)。在一些實(shí)施例中,平臺(tái)10通過(guò)(例如在處理器110上)執(zhí)行解釋(例如,任務(wù)運(yùn)行器112的)字節(jié)代碼的控制程序(例如,控制程序113)所生成的程序指令來(lái)執(zhí)行方法700。在圖示的實(shí)施例中,方法700包括步驟710-750。在其他實(shí)施例中,方法700可以包括額外(或更少)的步驟??梢灾辽俨糠值夭l(fā)執(zhí)行步驟710-750中的各步驟。在步驟710中,平臺(tái)10接收使用通用語(yǔ)言開(kāi)發(fā)的且包含數(shù)據(jù)并行問(wèn)題的程序(例如,對(duì)應(yīng)于字節(jié)代碼102或包括字節(jié)代碼102)。在一些實(shí)施例中,該程序可以是使用API以JAVA開(kāi)發(fā)的,且該API允許開(kāi)發(fā)者通過(guò)擴(kuò)充在API內(nèi)定義的基類來(lái)表示數(shù)據(jù)并行問(wèn)題。在其他實(shí)施例中,該程序可以使用不同語(yǔ)言來(lái)開(kāi)發(fā),例如上文描述的各種語(yǔ)言。在其他實(shí)施例中,可以使用其他技術(shù)來(lái)表示數(shù)據(jù)并行問(wèn)題。在一個(gè)實(shí)施例中,該程序可以是可解釋的字節(jié)代碼(例如由控制程序113解釋的字節(jié)代碼)。在另一個(gè)實(shí)施例中,該程序可以是不可解釋的可執(zhí)行字節(jié)代碼。在步驟720中,平臺(tái)10 (例如使用確定單元210)分析該程序以確定是否要將一個(gè)或多個(gè)工作負(fù)荷(例如,任務(wù)104)卸載到例如協(xié)處理器(如處理器120)(術(shù)語(yǔ)“協(xié)處理器“用于表示執(zhí)行方法800的處理器以外的處理器)。在一個(gè)實(shí)施例中,平臺(tái)10可以分析該程序的JAVA, class文件以確定是否要執(zhí)行卸載。平臺(tái)10的確定可以是上文描述的標(biāo)準(zhǔn)的各種組合。在一個(gè)實(shí)施例中,平臺(tái)10基于一組初始標(biāo)準(zhǔn)來(lái)作出初始確定。在一些實(shí)施例中,如果滿足初始標(biāo)準(zhǔn)中的每個(gè)標(biāo)準(zhǔn),則方法700可以進(jìn)行到步驟730和740。在一個(gè)實(shí)施例中,平臺(tái)10可以在步驟730和740正在執(zhí)行時(shí),繼續(xù)基于各種附加標(biāo)準(zhǔn)來(lái)確定是否要卸載工作負(fù)荷。在多種實(shí)施例中,平臺(tái)10的分析可以基于針對(duì)先前卸載的工作負(fù)荷的緩存的信息。在步驟730中,平臺(tái)10 (例如使用轉(zhuǎn)換單元230)將該程序轉(zhuǎn)換到中間表示。在一個(gè)實(shí)施例中,平臺(tái)10通過(guò)解析該程序的JAVA, class文件以識(shí)別該程序所使用的常量、屬性和/或方法來(lái)轉(zhuǎn)換該程序。在一些實(shí)施例中,平臺(tái)10將該程序中的指令解碼以識(shí)別該程序中的更高級(jí)別結(jié)構(gòu),如循環(huán)、嵌套的if語(yǔ)句等。在一些實(shí)施例中,平臺(tái)10創(chuàng)建表達(dá)式樹(shù)以表示通過(guò)具化該程序所收集的信息。在多種實(shí)施例中,平臺(tái)10可以使用上文描述的各種技術(shù)中的任一種。在一些實(shí)施例中,可以分析此中間表示以進(jìn)一步確定是否要卸載工作負(fù)荷。在步驟740中,平臺(tái)10(例如使用轉(zhuǎn)換單元230)將該中間表示轉(zhuǎn)換到域相關(guān)語(yǔ)言。在一個(gè)實(shí)施例中,平臺(tái)10基于在步驟730中收集的信息來(lái)生成域相關(guān)指令(例如,OPENCL)指令。在一些實(shí)施例中,平臺(tái)10根據(jù)在步驟730中構(gòu)造的表達(dá)式樹(shù)來(lái)生成域相關(guān)指令。在一個(gè)實(shí)施例中,平臺(tái)10將這些域相關(guān)指令提供到協(xié)處理器的驅(qū)動(dòng)程序(例如處理器120的驅(qū)動(dòng)程序116)以促使協(xié)處理器執(zhí)行卸載的工作負(fù)荷。在步驟750中,平臺(tái)10 (例如使用轉(zhuǎn)換單元230)將卸載的工作負(fù)荷的結(jié)果轉(zhuǎn)換回該程序支持的數(shù)據(jù)類型。在一個(gè)實(shí)施例中,平臺(tái)10將這些結(jié)果從OPENCL數(shù)據(jù)類型轉(zhuǎn)換回JAVA數(shù)據(jù)類型。一旦轉(zhuǎn)換了結(jié)果,則可以執(zhí)行該程序中使用所轉(zhuǎn)換的結(jié)果的指令。在一個(gè)實(shí)施例中,平臺(tái)10可以在將域相關(guān)指令提供到協(xié)處理器的驅(qū)動(dòng)程序之前分配存儲(chǔ)器位置以存儲(chǔ)結(jié)果。在一些實(shí)施例中,平臺(tái)10可以在協(xié)處理器正在產(chǎn)生結(jié)果時(shí),防止這些位置被控制程序的垃圾收集器回收。注意,對(duì)于接收到的不同程序可以多次執(zhí)行方法700。如果再次接收到相同的程序(例如,一組指令),則還可以重復(fù)方法700。如果兩次接收到相同的程序,則可以省略步驟710-750中的各步驟。如上文所提到的,在一些實(shí)施例中,平臺(tái)10可以緩存有關(guān)先前卸載的工作負(fù)荷的信息,如在步驟720-740期間生成的信息。如果再次接收到程序,則在一個(gè)實(shí)施例中,平臺(tái)10可以在步驟720中執(zhí)行快速確定,如確定先前是否成功卸載工作負(fù)荷。在一些實(shí)施例中,平臺(tái)10然后可以使用先前緩存的域相關(guān)指令而不執(zhí)行步驟730-740。在再次接收到一組相同的指令的一些實(shí)施例中,仍可以按與上文所述相似的方式來(lái)執(zhí)行步驟750。如果程序指定應(yīng)使用不同輸入多次執(zhí)行一組工作負(fù)荷,則也可以重復(fù)方法700的各步驟。在此類實(shí)例中,步驟730-740可以被省略,并可以使用先前緩存的域相關(guān)指令。在多種實(shí)施例中,仍可以執(zhí)行步驟750?,F(xiàn)在轉(zhuǎn)到圖8,其中示出用于在計(jì)算平臺(tái)中自動(dòng)地部署工作負(fù)荷的方法的另一個(gè)實(shí)施例。在一個(gè)實(shí)施例中,平臺(tái)10執(zhí)行任務(wù)運(yùn)行器112以執(zhí)行方法800。在一些實(shí)施例中,平臺(tái)10通過(guò)執(zhí)行控制程序113在運(yùn)行時(shí)解釋任務(wù)運(yùn)行器112的字節(jié)代碼時(shí)其(控制程序113)所產(chǎn)生的指令來(lái)在處理器110上執(zhí)行任務(wù)運(yùn)行器112。在圖示的實(shí)施例中,方法800包括步驟810-840。在其他實(shí)施例中,方法800可以包括額外(或更少)的步驟??梢圆l(fā)地執(zhí)行步驟810-840中的各步驟。在步驟810中,任務(wù)運(yùn)行器112接收指定一組任務(wù)(例如任務(wù)104)的一組字節(jié)代碼(例如,字節(jié)代碼102)。正如上文所提到的,在一個(gè)實(shí)施例中,字節(jié)代碼102可以包含對(duì)與任務(wù)運(yùn)行器112關(guān)聯(lián)的API的調(diào)用以指定任務(wù)104。例如,在一個(gè)特定實(shí)施例中,開(kāi)發(fā)者通過(guò)擴(kuò)充在API內(nèi)定義的基類來(lái)編寫指定多個(gè)任務(wù)104的JAVA源代碼,其中字節(jié)代碼102表示擴(kuò)充的類。然后,可以將擴(kuò)充的類的實(shí)例提供到任務(wù)運(yùn)行器112以執(zhí)行任務(wù)104。在一些實(shí)施例中,步驟810可以采用與上文描述的步驟710相似的方式來(lái)執(zhí)行。在步驟820中,任務(wù)運(yùn)行器112確定是否要將該組任務(wù)卸載到協(xié)處理器(例如,處理器120)。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以(例如使用確定單元210)分析該程序的JAVA, class文件以確定是否要卸載任務(wù)104。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以基于一組初始標(biāo)準(zhǔn)來(lái)作出初始確定。在一些實(shí)施例中,如果滿足初始標(biāo)準(zhǔn)中的每個(gè)標(biāo)準(zhǔn),則方法800可以進(jìn)行到步驟830。在一個(gè)實(shí)施例中,平臺(tái)10可以在步驟830正在執(zhí)行時(shí),繼續(xù)基于各種附加標(biāo)準(zhǔn)來(lái)確定是否要卸載工作負(fù)荷。在多種實(shí)施例中,任務(wù)運(yùn)行器112的分析還可以至少部分地基于針對(duì)先前卸載的任務(wù)104的緩存信息。任務(wù)運(yùn)行器112的確定可以基于上文描述的各標(biāo)準(zhǔn)中的任何一個(gè)。在一些實(shí)施例中,步驟820可以采用與上文描述的步驟720相似的方式來(lái)執(zhí)行。在步驟830中,任務(wù)運(yùn)行器112促使生成用來(lái)執(zhí)行該組任務(wù)的一組指令。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112通過(guò)生成具有域相關(guān)語(yǔ)言格式的一組域相關(guān)指令并將該組域相關(guān)指令提供到驅(qū)動(dòng)程序116以生成采用不同的格式的該組指令來(lái)促使該組指令的生成。例如,在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以生成一組OPENCL指令并將這些指令提供到驅(qū)動(dòng)程序116。在一個(gè)實(shí)施例中,驅(qū)動(dòng)程序116又可以生成用于協(xié)處理器的一組指令(例如,在該協(xié)處理器的ISA內(nèi)的指令)。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以通過(guò)將該組字節(jié)代碼具化以產(chǎn)生該組字節(jié)代碼的中間表示并轉(zhuǎn)換該中間表示以產(chǎn)生該組域相關(guān)指令來(lái)生成該組域相關(guān)指令。在步驟840中,任務(wù)運(yùn)行器112通過(guò)促使將該組指令提供到協(xié)處理器來(lái)促使協(xié)處理器執(zhí)行該組指令。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以通過(guò)向驅(qū)動(dòng)程序116提供該組生成的域相關(guān)指令來(lái)促使將該組指令提供到協(xié)處理器。一旦協(xié)處理器執(zhí)行了通過(guò)驅(qū)動(dòng)程序116提供的該組指令,則在一個(gè)實(shí)施例中,該協(xié)處理器可以向驅(qū)動(dòng)程序116提供執(zhí)行該組指令的結(jié)果。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112將這些結(jié)果轉(zhuǎn)換回字節(jié)代碼102支持的數(shù)據(jù)類型。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112將這些結(jié)果從OPENCL數(shù)據(jù)類型轉(zhuǎn)換回JAVA數(shù)據(jù)類型。在一些實(shí)施例中,任務(wù)運(yùn)行器112可以防止垃圾收集器回收用于存儲(chǔ)所生成的結(jié)果的存儲(chǔ)器位置。一旦轉(zhuǎn)換了結(jié)果,則可以執(zhí)行該程序中使用所轉(zhuǎn)換的結(jié)果的指令。與方法700的情況一樣,對(duì)于接收到的不同程序的字節(jié)代碼可以多次執(zhí)行方法800。如果再次接收到相同的程序或同一程序包含相同字節(jié)代碼的多個(gè)實(shí)例,則還可以重復(fù)方法800。如果兩次接收到相同的字節(jié)代碼,則可以省略步驟810-840中的各步驟。如上文所提到的,在一些實(shí)施例中,任務(wù)運(yùn)行器112可以緩存有關(guān)先前卸載的任務(wù)104的信息,如在步驟820-840期間生成的信息。如果再次接收到字節(jié)代碼,則在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以在步驟820中執(zhí)行快速確定以卸載任務(wù)104。然后,任務(wù)運(yùn)行器112可以使用先前緩存的域相關(guān)指令執(zhí)行步驟840而不執(zhí)行步驟830。注意,在其他實(shí)施例中,可以采用不同方式來(lái)執(zhí)行方法800。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器112可以接收指定一組任務(wù)的一組字節(jié)代碼(如在步驟810那樣)。然后,任務(wù)運(yùn)行器112可以響應(yīng)于確定要將該組任務(wù)卸載到協(xié)處理器而促使生成用來(lái)執(zhí)行該組任務(wù)的一組指令(如在步驟830中那樣),其中該確定可以由任務(wù)運(yùn)行器112以外的軟件來(lái)執(zhí)行。然后,任務(wù)運(yùn)行器112可以促使將該組指令提供到協(xié)處理器以供執(zhí)行(如在步驟840中那樣)。由此,在一些實(shí)施例中,方法800可以不包括步驟820?,F(xiàn)在轉(zhuǎn)到圖9,其中示出程序指令的示范編譯900的一個(gè)實(shí)施例。在圖示的實(shí)施例中,編譯器930編譯源代碼910和庫(kù)920以產(chǎn)生程序940。在其他實(shí)施例中,編譯900可以包括編譯附加的源代碼段和/或庫(kù)源代碼段。在一些實(shí)施例中,可以根據(jù)正在使用的程序語(yǔ)言以不同方式執(zhí)行編譯900。在一個(gè)實(shí)施例中,源代碼910是開(kāi)發(fā)者為執(zhí)行數(shù)據(jù)并行問(wèn)題而編寫的源代碼。在圖示的實(shí)施例中,源代碼910包括為指定一組或多組任務(wù)以便進(jìn)行并行化而對(duì)庫(kù)920的一個(gè)或多個(gè)API調(diào)用912。在一個(gè)實(shí)施例中,API調(diào)用912指定在庫(kù)920內(nèi)定義的API基類922的擴(kuò)充的類914以表示數(shù)據(jù)并行問(wèn)題。源代碼910可以采用各種語(yǔ)言中的任一種來(lái)編寫,如上文描述的那些語(yǔ)言。在一個(gè)實(shí)施例中,庫(kù)920是用于任務(wù)運(yùn)行器112的API庫(kù),其包含API基類922和任務(wù)運(yùn)行器源代碼924。(注意,任務(wù)運(yùn)行器源代碼924在本文中可以稱為“庫(kù)例行程序”)。在一個(gè)實(shí)施例中,API基類922包括可與源代碼910 —起編譯以產(chǎn)生字節(jié)代碼942的庫(kù)源代碼。在多種實(shí)施例中,API基類922可以定義可被源代碼910使用的一個(gè)或多個(gè)變量和/或一個(gè)或多個(gè)函數(shù)。如上文所提到的,在一些實(shí)施例中,API基類922是可被開(kāi)發(fā)者擴(kuò)充以產(chǎn)生一個(gè)或多個(gè)擴(kuò)充的類914來(lái)表示數(shù)據(jù)并行問(wèn)題的類。在一個(gè)實(shí)施例中,任務(wù)運(yùn)行器源代碼924是可編譯以產(chǎn)生任務(wù)運(yùn)行器字節(jié)代碼944的源代碼。在一些實(shí)施例中,任務(wù)運(yùn)行器字節(jié)代碼944對(duì)于一組給定字節(jié)代碼942可以是唯一的。在另一個(gè)實(shí)施例中,任務(wù)運(yùn)行器字節(jié)代碼944可以與獨(dú)立于任務(wù)運(yùn)行器字節(jié)代碼944而被編譯的多組不同字節(jié)代碼942一起使用。正如上文所提到的,在一個(gè)實(shí)施例中,編譯器930可執(zhí)行以編譯源代碼910和庫(kù)920以產(chǎn)生程序940。在一個(gè)實(shí)施例中,編譯器930產(chǎn)生要被處理器(例如處理器110)執(zhí)行的程序指令。在另一個(gè)實(shí)施例中,編譯器產(chǎn)生在運(yùn)行時(shí)要被解釋以生成可執(zhí)行指令的程序指令。在一個(gè)實(shí)施例中,源代碼910指定要與源代碼910—起編譯的庫(kù)(例如,庫(kù)920)。然后,編譯器930可以檢索這些庫(kù)的庫(kù)源代碼,并將其與源代碼910 —起編譯。編譯器930可以支持如上文所述的各種語(yǔ)言中的任一種。在一個(gè)實(shí)施例中,程序940是可被平臺(tái)10執(zhí)行(或可被在平臺(tái)10上執(zhí)行的控制程序113解釋)的已編譯程序。在圖示的實(shí)施例中,程序940包括字節(jié)代碼942和任務(wù)運(yùn)行器字節(jié)代碼944。例如,在一個(gè)實(shí)施例中,程序940可以對(duì)應(yīng)于包括字節(jié)代碼942和字節(jié)代碼944的相應(yīng).class文件的JAVA, jar文件。在其他實(shí)施例中,字節(jié)代碼942和字節(jié)代碼944可以對(duì)應(yīng)于單獨(dú)的程序940。在多種實(shí)施例中,字節(jié)代碼942對(duì)應(yīng)于上文描述的字節(jié)代碼102。(注意,字節(jié)代碼944在本文中可以稱為“已編譯庫(kù)例行程序”)。正如參考圖11將描述的,可以將元素910-940中的各元素或元素910-940中的元素的部分包括在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上。下文提供可以被使用庫(kù)920來(lái)產(chǎn)生程序940的編譯器930編譯的可能的源代碼的一個(gè)示例。在此示例中,利用一組隨機(jī)值將浮點(diǎn)數(shù)組(values[])初始化。然后,處理該數(shù)組以對(duì)該數(shù)組中的給定元素確定相同數(shù)組中多少個(gè)其他元素落在預(yù)定義窗口(例如,+/-2. O)內(nèi)。然后,將這些確定的結(jié)果存儲(chǔ)在對(duì)應(yīng)的整型數(shù)組(counts^)內(nèi)的相應(yīng)位置中。為了初始化數(shù)組(values口 )中values中的值,可以運(yùn)行如下代碼
權(quán)利要求
1.一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其上存儲(chǔ)有程序指令,所述程序指令可在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行以執(zhí)行如下操作 接收第一組字節(jié)代碼,其中所述第一組字節(jié)代碼指定第一組任務(wù); 響應(yīng)于確定要將所述第一組任務(wù)卸載到所述計(jì)算機(jī)系統(tǒng)的第二處理器,促使生成用來(lái)執(zhí)行所述第一組任務(wù)的一組指令,其中所述一組指令采用與所述第一組字節(jié)代碼的格式不同的格式,其中所述第二處理器支持所述格式;以及 促使將所述一組指令提供到所述第二處理器以供執(zhí)行。
2.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述程序指令可被所述第一處理器上的控制程序解釋以產(chǎn)生所述第一處理器的指令集體系結(jié)構(gòu)(ISA)內(nèi)的指令。
3.如權(quán)利要求2所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述程序指令還可被所述控制程序解釋以執(zhí)行如下操作 接收第二組字節(jié)代碼,其中所述第二組字節(jié)代碼指定第二組任務(wù);以及響應(yīng)于確定不將所述第二組任務(wù)卸載到所述第二處理器,促使所述控制程序解釋所述第二組字節(jié)代碼以產(chǎn)生所述第一處理器的所述ISA內(nèi)的指令,其中所述第一處理器配置成通過(guò)執(zhí)行由所述第二組字節(jié)代碼的解釋所產(chǎn)生的所述指令來(lái)執(zhí)行所述第二組任務(wù)。
4.如權(quán)利要求3所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述程序指令還可被所述控制程序解釋以執(zhí)行如下操作 響應(yīng)于確定不將所述第二組任務(wù)卸載到所述第二處理器,生成可被所述控制程序解釋的一組對(duì)應(yīng)的字節(jié)代碼以創(chuàng)建線程池,所述線程池包含對(duì)應(yīng)于所述第二組任務(wù)內(nèi)的多個(gè)任務(wù)中的每個(gè)任務(wù)的線程;以及 促使所述控制程序解釋所述一組對(duì)應(yīng)的字節(jié)代碼以產(chǎn)生所述第一處理器的所述ISA內(nèi)的指令,其中所述第一處理器配置成通過(guò)執(zhí)行從所述一組對(duì)應(yīng)的字節(jié)代碼產(chǎn)生的所述指令來(lái)執(zhí)行所述第二組任務(wù)。
5.如權(quán)利要求2所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述控制程序可執(zhí)行以實(shí)現(xiàn)虛擬機(jī)。
6.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中促使自動(dòng)生成采用所述不同格式的所述一組指令包括 生成具有域相關(guān)語(yǔ)言格式的一組域相關(guān)指令; 將所述一組域相關(guān)指令提供到所述第二處理器的驅(qū)動(dòng)程序,所述驅(qū)動(dòng)程序可執(zhí)行以生成采用所述不同格式的所述一組指令。
7.如權(quán)利要求6所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中生成具有所述域相關(guān)語(yǔ)言格式的所述一組指令包括 將所述第一組字節(jié)代碼具化以產(chǎn)生所述第一組字節(jié)代碼的中間表示;以及 轉(zhuǎn)換所述第一組字節(jié)代碼的所述中間表示以產(chǎn)生所述一組域相關(guān)指令。
8.如權(quán)利要求6所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述程序指令可執(zhí)行以執(zhí)行如下操作 存儲(chǔ)所述一組域相關(guān)指令; 再次接收所述第一組字節(jié)代碼; 響應(yīng)于確定存儲(chǔ)了所述一組域相關(guān)指令,將存儲(chǔ)的所述一組域相關(guān)指令提供到所述第二處理器的所述驅(qū)動(dòng)程序以促使生成用來(lái)執(zhí)行所述第一組任務(wù)的所述一組指令。
9.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述確定基于對(duì)所述第一處理器和所述第二處理器對(duì)所述第一組任務(wù)的先前執(zhí)行的分析。
10.如權(quán)利要求9所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述第一處理器使用線程池來(lái)執(zhí)行所述第一組任務(wù)的所述先前執(zhí)行的其中之一。
11.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述程序指令還可執(zhí)行以執(zhí)行如下操作 在所述第二處理器執(zhí)行所述一組指令之前,預(yù)留一組存儲(chǔ)器位置以存儲(chǔ)所述第一組任務(wù)的一組結(jié)果; 在所述第二處理器正在產(chǎn)生所述一組結(jié)果時(shí),防止垃圾收集器重新分配所述一組存儲(chǔ)器位置;以及 將所述一組結(jié)果存儲(chǔ)在所述一組存儲(chǔ)器位置中。
12.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述第一組字節(jié)代碼通過(guò)包含對(duì)應(yīng)用編程接口的一個(gè)或多個(gè)調(diào)用來(lái)指定所述第一組任務(wù)。
13.如權(quán)利要求I所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述第二處理器是圖形處理器。
14.一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其包含 源程序指令,所述源程序指令可被編譯器編譯以作為已編譯源代碼包含在已編譯代碼中; 其中所述源程序指令包括對(duì)庫(kù)例行程序的應(yīng)用編程接口(API)調(diào)用,其中所述API調(diào)用指定一組任務(wù),并且其中所述庫(kù)例行程序可被所述編譯器編譯以便作為已編譯庫(kù)例行程序包括在所述已編譯代碼中; 其中所述已編譯源代碼可被計(jì)算系統(tǒng)的第一處理器的虛擬機(jī)解釋以將所述一組任務(wù)傳遞到所述已編譯庫(kù)例行程序;并且 其中所述已編譯庫(kù)例行程序可被所述虛擬機(jī)解釋以執(zhí)行如下操作 響應(yīng)于確定要將所述一組任務(wù)卸載到所述計(jì)算系統(tǒng)的第二處理器,促使生成采用所述第二處理器的域相關(guān)語(yǔ)言格式的一組域相關(guān)指令; 促使將所述一組域相關(guān)指令提供到所述第二處理器。
15.如權(quán)利要求14所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述第二處理器是圖形處理器,并且其中生成所述一組域相關(guān)指令包括具化所述已編譯源代碼。
16.如權(quán)利要求14所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述API調(diào)用指定與所述庫(kù)例行程序關(guān)聯(lián)的基類的擴(kuò)充的類。
17.一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其包括 庫(kù)例行程序的源程序指令,所述庫(kù)例行程序的源程序指令可被編譯器編譯以作為已編譯庫(kù)例行程序包含在已編譯代碼中; 其中所述已編譯庫(kù)例行程序可在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行以執(zhí)行如下操作 接收第一組字節(jié)代碼,其中所述第一組字節(jié)代碼指定一組任務(wù); 響應(yīng)于確定要將所述一組任務(wù)卸載到所述計(jì)算機(jī)系統(tǒng)的第二處理器,生成一組域相關(guān)指令以執(zhí)行所述一組任務(wù); 促使將所述域相關(guān)指令提供到所述第二處理器以供執(zhí)行。
18.如權(quán)利要求17所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述已編譯庫(kù)例行程序可被所述第一處理器的虛擬機(jī)解釋,其中所述虛擬機(jī)可執(zhí)行以解釋已編譯指令以產(chǎn)生所述第一處理器的指令集體系結(jié)構(gòu)(ISA)內(nèi)的指令。
19.一種方法,其包括 接收第一組指令,其中所述第一組指令指定一組任務(wù),并且其中所述接收由在計(jì)算機(jī)系統(tǒng)的第一處理器上執(zhí)行的庫(kù)例行程序來(lái)執(zhí)行; 所述庫(kù)例行程序確定是否要將所述一組任務(wù)卸載到所述計(jì)算機(jī)系統(tǒng)的第二處理器; 響應(yīng)于確定要將所述一組任務(wù)卸載到所述第二處理器,促使生成用于執(zhí)行所述第一組任務(wù)的第二組指令,其中所述第二組指令采用與所述第一組指令的格式不同的格式,其中所述第二處理器支持所述格式; 促使將所述第二組指令提供到所述第二處理器以供執(zhí)行。
20.如權(quán)利要求19所述的方法,其中所述例行程序可被虛擬機(jī)解釋,所述虛擬機(jī)可執(zhí)行以產(chǎn)生所述第一處理器的指令集體系結(jié)構(gòu)(ISA)內(nèi)的指令,并且其中所述第二處理器是圖形處理器。
21.一種方法,其包括 計(jì)算機(jī)系統(tǒng)接收指定一組任務(wù)的第一組字節(jié)代碼; 響應(yīng)于確定要將所述一組任務(wù)從所述計(jì)算機(jī)系統(tǒng)的第一處理器卸載到所述計(jì)算機(jī)系統(tǒng)的第二處理器,所述計(jì)算機(jī)系統(tǒng)生成用于執(zhí)行所述一組任務(wù)的一組域相關(guān)指令;以及 所述計(jì)算機(jī)系統(tǒng)促使將所述域相關(guān)指令提供到所述第二處理器以供執(zhí)行。
22.如權(quán)利要求21所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中所述生成由已編譯庫(kù)例行程序來(lái)執(zhí)行,所述已編譯庫(kù)例行程序可被所述第一處理器的虛擬機(jī)解釋,其中所述虛擬機(jī)可執(zhí)行以解釋已編譯指令以產(chǎn)生所述第一處理器的指令集體系結(jié)構(gòu)(ISA)內(nèi)的指令。
全文摘要
公開(kāi)與在處理器之間分布工作負(fù)荷相關(guān)的技術(shù)。在一個(gè)實(shí)施例中,計(jì)算機(jī)系統(tǒng)包括第一處理器和第二處理器。所述第一處理器執(zhí)行程序指令以接收指定第一組任務(wù)的第一組字節(jié)代碼并確定是否要將所述第一組任務(wù)卸載到所述第二處理器。響應(yīng)于確定要將所述第一組任務(wù)卸載到所述第二處理器,所述程序指令還可執(zhí)行以促使生成用來(lái)執(zhí)行所述第一組任務(wù)的一組指令,其中該組指令采用與所述第一組字節(jié)代碼的格式不同的格式,并且其中所述第二處理器支持該格式。所述程序指令還可執(zhí)行以通過(guò)促使將該組指令提供到所述第二處理器來(lái)促使所述第二處理器執(zhí)行該組指令。
文檔編號(hào)G06F9/45GK102985908SQ201180029504
公開(kāi)日2013年3月20日 申請(qǐng)日期2011年5月18日 優(yōu)先權(quán)日2010年5月21日
發(fā)明者加里·R·弗羅斯特 申請(qǐng)人:超威半導(dǎo)體公司