專利名稱:具有橫跨多個(gè)處理器的數(shù)據(jù)并行線程之映射處理邏輯的制作方法
技術(shù)領(lǐng)域:
本揭示發(fā)明系一般地關(guān)于計(jì)算機(jī)處理器以及資料并行線程。
背景技術(shù):
計(jì)算機(jī)與其它此種數(shù)據(jù)處理裝置系具有至少一個(gè)通常稱為控制處理單元(CPU) 的控制處理器。此種計(jì)算機(jī)與處理裝置亦可具有其它用于各種型態(tài)的專用處理的處理器, 例如圖形處理單元(GPU)。舉例而言,GPU系設(shè)計(jì)成特別適用于圖型處理。GPU—般包括理想地適用于執(zhí)行在平行資料流上相同的指令的多重處理組件,例如資料平行處理。一般而言,CPU作為主機(jī)或控制處理器而使用,且將例如圖形處理的專用功能交給例如GPU的其它處理器。由于已有多核心CPU可供使用(其中各個(gè)CPU具有多重處理核心),在CPU中可具有亦可用于專門功能之實(shí)質(zhì)的處理能力。多核心CPU或GPU的一個(gè)或更多計(jì)算核心可以是相同芯片(例如AMD FusionTM)之一部分或是在不同的芯片中(例如具有NVIDIA GPU 的Intel XeonTM)。近來(lái),具有CPU與GPU兩者特性之混合核心(例如CellSPETM, Intel LarrabeeTM)已普遍的提倡于通用GPU(GPGPU)類型的運(yùn)算。該GPGPU類型運(yùn)算提倡使用 CPU主要地執(zhí)行控制編碼并且卸載效能關(guān)鍵性的數(shù)據(jù)平行編碼(performance critical data-parallel code)至GPU。該GPU系主要地用來(lái)作為加速器。該多核心CPU與GPGPU 計(jì)算模型之組合包含作為加速目標(biāo)的CPU核心與GPU核心兩者。在很多方面,許多多核心 CPU的核心具有可比得上GPU的效能。舉例而言,許多CPU核心的每秒浮點(diǎn)運(yùn)算(floating point operations per second, FLOPS)現(xiàn)在系比得上一些GPU核心的每秒浮點(diǎn)運(yùn)算。已開發(fā)了用于具有CPU與GPU的異質(zhì)計(jì)算平臺(tái)的數(shù)個(gè)框架(framework)。這些框架包含Manford University所開發(fā)的BrookGPU、NVIDIA所開發(fā)的CUDA,以及被稱作 Khronos Group的工業(yè)集團(tuán)所開發(fā)的OpenCL。OpenCL框架提供了一類似C的開發(fā)環(huán)境,使用者可以使用該環(huán)境創(chuàng)造用于GPU的應(yīng)用程序。舉例而言,OpenCL讓使用者能夠指定卸載一些計(jì)算(例如數(shù)據(jù)并行計(jì)算)至GPU的指令。OpenCL亦提供了編譯器與執(zhí)行環(huán)境(runtime environment),在其中,可以在異質(zhì)計(jì)算系統(tǒng)內(nèi)編譯與執(zhí)行編碼。因此,需要使CPU能力能夠有效地使用于一般在GPU上處理的功能的執(zhí)行的方法和系統(tǒng)。
發(fā)明內(nèi)容
本發(fā)明揭露用以在處理器核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的系統(tǒng)與方法。該用以在處理器核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的方法包含將該復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組,使來(lái)自該一個(gè)或更多工作群組的第一個(gè)工作群組關(guān)聯(lián)于在該處理器核心上的操作系統(tǒng)線程,以及將來(lái)自該第一工作群組的線程配置成該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。該處理邏輯可包含先前配置成在GPU上執(zhí)行的GPU核函數(shù)。 該處理核心可包含CPU核心,例如多核心CPU的處理核心。
另一種實(shí)施例系用以執(zhí)行GPU核函數(shù)的方法,其包含加載該GPU核函數(shù)至主機(jī)處理器,形成一個(gè)或更多工作群組(其中,各工作群組包括復(fù)數(shù)該資料并行線程),以及使該工作群組關(guān)聯(lián)于耦合至該主機(jī)處理器的一個(gè)或更多處理核心的操作系統(tǒng)線程。各該工作群組可關(guān)聯(lián)于一個(gè)或更多操作系統(tǒng)線程,且各個(gè)操作系統(tǒng)線程系配置成僅在一個(gè)處理核心上執(zhí)行。該方法亦可包含將各個(gè)該工作群組的資料并行線程配置成各自關(guān)聯(lián)的操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程的步驟。另一種實(shí)施例系用于在處理核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的系統(tǒng)。該系統(tǒng)包含包含該處理核心的至少一個(gè)處理器、耦合至該處理核心的至少一個(gè)內(nèi)存與GPU 核函數(shù)排程器。該GPU核函數(shù)排程器系被配置成將該復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組,使來(lái)自于該一個(gè)或更多工作群組的第一工作群組關(guān)聯(lián)于在該處理核心上的操作系統(tǒng)線程,以及將來(lái)自于該第一工作群組的線程執(zhí)行成在該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。另一種實(shí)施例系計(jì)算機(jī)程序產(chǎn)品包括紀(jì)錄有計(jì)算機(jī)程序邏輯的計(jì)算機(jī)可讀取媒體以使至少一處理器將復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組,使來(lái)自于該一個(gè)或更多工作群組的第一工作群組關(guān)聯(lián)于在至少一個(gè)處理核心上的操作系統(tǒng)線程,以及將來(lái)自于該第一工作群組的線程執(zhí)行成在該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。本發(fā)明的進(jìn)一步實(shí)施例、特征及優(yōu)勢(shì),連帶本發(fā)明的各種實(shí)施例的結(jié)構(gòu)和運(yùn)作,系在以下參考附加圖標(biāo)作詳細(xì)地描述。
合并至且構(gòu)成本說(shuō)明書的一部份的附加圖標(biāo)系例示本發(fā)明之實(shí)施例,連同前述發(fā)明內(nèi)容提供的一般敘述以及下列具體實(shí)施方式
提供的詳細(xì)說(shuō)明,以協(xié)助解釋本揭示發(fā)明的原理,于該圖標(biāo)中第1圖顯示根據(jù)本揭示發(fā)明的實(shí)施例的異質(zhì)計(jì)算系統(tǒng)。第2圖顯示根據(jù)本揭示發(fā)明的實(shí)施例的GPU核函數(shù)排程器。第3圖系根據(jù)本揭示發(fā)明的實(shí)施例的在異質(zhì)計(jì)算系統(tǒng)上用于執(zhí)行編碼的程序。第4圖系關(guān)于本揭示發(fā)明的例示內(nèi)存布局的描繪。第5圖系關(guān)于本揭示發(fā)明的在異質(zhì)計(jì)算系統(tǒng)上用于排程工作項(xiàng)的程序。第6圖系關(guān)于本揭示發(fā)明的線程排程的例示描繪。
具體實(shí)施例方式本發(fā)明的實(shí)施例可藉由讓在CPU或GPU處理器上相同或相似的編碼基底的使用以及促進(jìn)這些編碼基底的除錯(cuò)可行而產(chǎn)生實(shí)質(zhì)上的優(yōu)點(diǎn)。雖然本發(fā)明于此處系以用于特定應(yīng)用的例示實(shí)施例來(lái)描述,應(yīng)該了解到本發(fā)明并不以此為限。所屬領(lǐng)域的技術(shù)人員接收本發(fā)明之教示將意識(shí)到在本敘述之范圍內(nèi)及本發(fā)明會(huì)有顯著功用的其它領(lǐng)域中的其它修正、應(yīng)用和實(shí)施例。本發(fā)明的實(shí)施例可使用于任何計(jì)算機(jī)系統(tǒng)、計(jì)算裝置、娛樂系統(tǒng)、媒體系統(tǒng)、游戲系統(tǒng)、通訊裝置、個(gè)人數(shù)字助理或任何使用一個(gè)或更多處理器的系統(tǒng)。本發(fā)明系特別有益于包括異質(zhì)計(jì)算系統(tǒng)的系統(tǒng)。于此處使用的術(shù)語(yǔ)「異質(zhì)計(jì)算系統(tǒng)(heterogeneous computingsystem)」系為有多種處理器可供使用的計(jì)算系統(tǒng)。本發(fā)明的實(shí)施例能夠使相同的編碼基底在不同的處理器(例如CPU和GPU)上被執(zhí)行。本發(fā)明的實(shí)施例例如在具有多核心CPU及/或GPU的處理系統(tǒng)中可特別有利,因?yàn)閷?duì)于一種類型處理器所開發(fā)的編碼可以微量的或無(wú)需額外的努力而配置在另一種類型的處理器上。舉例而言,利用本發(fā)明的實(shí)施例,開發(fā)來(lái)用于在GPU上執(zhí)行的編碼,亦被稱為GPU 核函數(shù),可以被配置成在CPU上執(zhí)行。又,本發(fā)明能夠以有助于除錯(cuò)線程的方式將典型地包括大量資料并行線程的GPU 核函數(shù)配置于CPU及其它處理器上。異質(zhì)計(jì)算系統(tǒng)依據(jù)本發(fā)明的一實(shí)施例作為范例的異質(zhì)計(jì)算系統(tǒng)100系顯示在第1圖中。異質(zhì)計(jì)算系統(tǒng)100可包含一個(gè)或更多CPU,例如CPU 101,以及一個(gè)或更多GPU,例如GPU 102。異質(zhì)計(jì)算系統(tǒng)100復(fù)可包含至少一系統(tǒng)內(nèi)存103、至少一持續(xù)內(nèi)存104、至少一系統(tǒng)總線105、 至少一輸入/輸出裝置106、GPU核函數(shù)排程器109以及除錯(cuò)器108。CPU 101可包含任何商業(yè)上可得的控制處理器或客制化的控制處理器。CPU 101 系例如執(zhí)行用以控制異質(zhì)計(jì)算系統(tǒng)100的操作的控制邏輯。CPU 101系可為多核心CPU,例如具有二個(gè)CPU核心141和142的多核心CPU。CPU 101除任何控制電路外,可包含CPU高速緩存,例如CPU核心141和142各自的高速緩存143和144。CPU高速緩存143和144可分別用于在CPU核心141和142上執(zhí)行應(yīng)用程序的期間暫時(shí)性的保存指令及/或參數(shù)值。 舉例而言,CPU高速緩存143可以使用于在CPU核心141上執(zhí)行控制邏輯指令的期間暫時(shí)性的保存來(lái)自系統(tǒng)內(nèi)存103的一個(gè)或更多控制邏輯指令、變量的值或固定參數(shù)的值。在一些實(shí)施例中,CPU 101亦可包含專用的向量指令處理單元。舉例而言,CPU核心142可包含可以有效地處理向量指令的數(shù)據(jù)流SIMD延伸指令集(SSE)單元。熟知本領(lǐng)域技術(shù)的人士將了解到CPU 101可包含多于或少于本實(shí)施例中所選擇的CPU核心,而且亦可具有無(wú)高速緩存或更多復(fù)雜的高速緩存階層。GPU 102可包含任何商業(yè)上可得的圖形處理器或客制設(shè)計(jì)的圖形處理器。GPU 102 例如可執(zhí)行用于所選擇的功能的專用編碼。通常,GPU 102可使用于執(zhí)行圖形功能,例如繪圖管線計(jì)算,比如幾何計(jì)算以及在顯示器上影像的成像。GPU 102可包含GPU全域高速緩存110和一個(gè)或更多計(jì)算單元112和113。圖形內(nèi)存107可包含在GPU 102內(nèi)或耦合至GPU 102。各計(jì)算單元112和113系分別關(guān)聯(lián)于GPU 區(qū)域內(nèi)存114和115。各計(jì)算單元包含一個(gè)或更多GPU處理組件(processing elements, ΡΕ)。舉例而言,計(jì)算單元112包含GPU處理組件121和122,而計(jì)算單元113包含GPU處理組件123和124。各處理組件121、122、123和124系分別關(guān)聯(lián)于至少一個(gè)私有內(nèi)存(private memory,PM) 131、132、133和134。各GPU處理組件可包含一個(gè)或更多純量與向量浮點(diǎn)單元。 GPU處理組件亦可包含特殊用途單元譬如逆平方根單元及正弦/余弦單元。GPU全域高速緩存110可耦合至例如系統(tǒng)內(nèi)存103的系統(tǒng)內(nèi)存及/或例如圖形內(nèi)存107的圖形內(nèi)存。系統(tǒng)內(nèi)存103可包含至少一個(gè)非持久性內(nèi)存,例如動(dòng)態(tài)隨機(jī)存取內(nèi)存(DRAM)。系統(tǒng)內(nèi)存103可在部份應(yīng)用程序或其它處理邏輯的執(zhí)行期間,保存處理邏輯指令、常數(shù)值與變量值。舉例而言,在一實(shí)施例中,GPU核函數(shù)排程器109控制邏輯及/或其它處理邏輯在藉由CPUlOl執(zhí)行GPU核函數(shù)排程器109的期間可處于系統(tǒng)內(nèi)存103內(nèi)。在此處使用之術(shù)語(yǔ)「處理邏輯」系指控制流指令、用以執(zhí)行計(jì)算的指令以及關(guān)于資源相關(guān)的存取的指令。持續(xù)內(nèi)存104包含一個(gè)或更多能儲(chǔ)存數(shù)字資料的儲(chǔ)存裝置,例如磁盤、光盤或閃存。持續(xù)內(nèi)存104可例如至少儲(chǔ)存GPU核函數(shù)排程器109和除錯(cuò)器108的指令邏輯的一部分。舉例而言,在異質(zhì)計(jì)算系統(tǒng)100激活時(shí),操作系統(tǒng)和其它應(yīng)用軟件可從持續(xù)內(nèi)存104加載至系統(tǒng)內(nèi)存103。系統(tǒng)總線 105 可包含外圍組件互連(Peripheral Component Interconnect,PCI) 總線、高級(jí)微控制器總線架構(gòu)(Advanced Microcontroller Bus Architecture, AMBA)總線、工業(yè)標(biāo)準(zhǔn)架構(gòu)andustry Standard Architecture, ISA)總線或此類裝置。系統(tǒng)總線 105亦可包含網(wǎng)絡(luò),例如局域網(wǎng)絡(luò)(Local area network, LAN)。系統(tǒng)總線105包含耦合包括異質(zhì)計(jì)算系統(tǒng)100的組件在內(nèi)的組件的功能性。輸入/輸出接口 106包含一個(gè)或更多接口以連接使用者的輸入/輸出裝置,例如鍵盤、鼠標(biāo)、顯示器及/或觸控屏幕。舉例而言,可透過連接至使用者接口 106的鍵盤和鼠標(biāo)提供使用者的輸入至異質(zhì)計(jì)算系統(tǒng)100。異質(zhì)計(jì)算系統(tǒng)100的輸出,例如GPU核函數(shù)排程器109和除錯(cuò)器108的輸出,可透過使用者接口 106輸出至顯示器。圖形內(nèi)存107系耦合至系統(tǒng)總線105和GPU 102。圖形內(nèi)存107系通常使用于保存?zhèn)鬏斪韵到y(tǒng)內(nèi)存103的數(shù)據(jù)以供GPU快速存取。舉例而言,在GPU 102和圖形內(nèi)存107 之間的接口可以數(shù)倍地快于系統(tǒng)總線接口 105。除錯(cuò)器108包含對(duì)應(yīng)用編碼和在異質(zhì)計(jì)算系統(tǒng)100執(zhí)行的其它處理邏輯除錯(cuò)的功能。舉例而言,除錯(cuò)器108可包含在應(yīng)用編碼及/或其它處理邏輯的執(zhí)行期間監(jiān)測(cè)一個(gè)或更多變量的功能。在異質(zhì)計(jì)算環(huán)境中,除錯(cuò)器108可能需要有監(jiān)測(cè)在CPU以及GPU上執(zhí)行的應(yīng)用編碼及其它處理邏輯的能力。GPU核函數(shù)排程器109包含將特別寫成在GPU上執(zhí)行的功能或處理邏輯排程在 GPU上或在CPU上的功能。在下文關(guān)聯(lián)于第2圖時(shí)將進(jìn)一步地描述GPU核函數(shù)排程器。熟知本領(lǐng)域技術(shù)的人士將了解到除錯(cuò)器108和GPU核函數(shù)排程器109可以用軟件、韌體、硬件或上述三者的任何組合加以實(shí)現(xiàn)。當(dāng)以軟件實(shí)現(xiàn)時(shí),例如,GPU核函數(shù)排程器109系可為以 C或OpenCL寫成的計(jì)算機(jī)程序,該計(jì)算機(jī)程序被編譯與執(zhí)行時(shí)系處于系統(tǒng)內(nèi)存103中。在原始碼形式及/或經(jīng)編譯后可執(zhí)行的形式下,GPU核函數(shù)排程器109可被儲(chǔ)存于持續(xù)內(nèi)存 104。在一實(shí)施例中,一些或全部的GPU核函數(shù)排程器109及/或除錯(cuò)器108的功能系特定為硬件描述語(yǔ)言,例如Verilog、RTL、netlists,以便最終能夠透過光罩著作/光罩的產(chǎn)生配置成制造程序,以產(chǎn)生具體化在此處所描述的本發(fā)明的實(shí)施態(tài)樣的硬件裝置。熟知本領(lǐng)域技術(shù)的人士將了解到異質(zhì)計(jì)算系統(tǒng)100可包含比在第1圖中顯示者更多或更少的組件。舉例而言,異質(zhì)計(jì)算系統(tǒng)100可包含一個(gè)或更多網(wǎng)絡(luò)接口及/或例如 OpenCL框架的軟件應(yīng)用程序。GPU核函數(shù)在此處所使用的術(shù)語(yǔ)「GPU核函數(shù)」包括在GPU上執(zhí)行一個(gè)或更多功能或操作的編碼及/或處理邏輯。舉例而言,GPU核函數(shù)系針對(duì)矩陣乘法、矩陣轉(zhuǎn)置、重分(subdivision)、 方程式求解及許多其它操作而發(fā)展。在GPGPU模型中,舉例而言,GPU核函數(shù)系為可藉由卸載以在GPU上執(zhí)行的功能及/或其它操作的編碼片段。在典型的GPGPU應(yīng)用中,相同的GPU 核函數(shù)編碼將在多個(gè)平行數(shù)據(jù)流上同時(shí)執(zhí)行。這就是所謂的「資料平行」計(jì)算。舉例而言,在相乘二個(gè)矩陣時(shí),來(lái)自該二個(gè)來(lái)源矩陣的相對(duì)應(yīng)元素的多個(gè)配對(duì)(pair)可以利用不同的處理核心同時(shí)相乘。雖然是簡(jiǎn)單的范例,矩陣乘法可例示在GPU上的資料平行運(yùn)算。承上述的矩陣乘法的范例,對(duì)于結(jié)果矩陣的各元素的計(jì)算可視為執(zhí)行(線程)的獨(dú)立的線程。對(duì)應(yīng)于結(jié)果矩陣的各元素的線程可平行執(zhí)行。在GPU 102中,舉例而言,線程可能在各處理組件121、122、123和IM上同時(shí)執(zhí)行。若欲相乘矩陣的多個(gè)配對(duì),例如在圖形應(yīng)用中常見者,則可指派矩陣的各個(gè)配對(duì)至計(jì)算組件,例如計(jì)算組件112與113??申P(guān)聯(lián)于GPU 102而描述GPU核函數(shù)的執(zhí)行。GPU核函數(shù)一般執(zhí)行為平行的多個(gè)線程。各并行線程系為「工作項(xiàng)」。各工作項(xiàng)可在處理組件(例如處理組件121、122、123和 124)上執(zhí)行。分配至計(jì)算單元的工作項(xiàng)系所謂的「工作群組」。一般而言,工作項(xiàng)間的同步化系限于單一工作群組內(nèi)的工作項(xiàng)。該限制系通常在具有大量線程的環(huán)境中執(zhí)行,以便可有效地管理線程的數(shù)量。然而,在一些實(shí)施例中,同步化可能不限于單一工作群組內(nèi)的工作項(xiàng)。GPU核函數(shù)排程器第2圖例示了依據(jù)本發(fā)明的一實(shí)施例的GPU核函數(shù)排程器109的組件。GPU核函數(shù)排程器109可包括編碼分析器201、CPU內(nèi)存映射器203、工作群組排程器205以及線程排程器207。熟知本領(lǐng)域技術(shù)的人員將意識(shí)到GPU核函數(shù)排程器109可包括額外的組件及 /或組件201至207的不同組合。編碼分析器201包含分析編碼(例如OpenCL編碼)的功能。編碼分析器201可識(shí)別編碼片段及/或被分析的編碼中的GPU核函數(shù),其可有利地被排程在CPU上或替代性的在GPU上。編碼分析器201亦可包含得知目標(biāo)平臺(tái)的詳細(xì)說(shuō)明的功能。舉例而言,編碼分析器201可識(shí)別CPU核心的數(shù)量及在目標(biāo)平臺(tái)上可得的GPU核心。其亦可能識(shí)別系統(tǒng)內(nèi)存、高速緩存、全域GPU高速緩存等等的數(shù)量。CPU內(nèi)存映射器203包含判定可對(duì)其發(fā)送編碼以執(zhí)行的CPU的內(nèi)存可用性,以及準(zhǔn)備用以執(zhí)行映射的GPU核函數(shù)的CPU內(nèi)存。工作群組排程器205包含排成工作群組的功能。舉例而言,工作群組排程器205 可判定可使用于執(zhí)行各工作群組的GPU的計(jì)算單元的適當(dāng)集合(set)。在另一實(shí)施例中,工作群組排程器亦可判定GPU核函數(shù)的工作項(xiàng)線程應(yīng)該如何群集成工作群組,以便工作群組可指派至在一個(gè)或更多CPU核心上的線程。工作群組排程器復(fù)可包含將GPU核函數(shù)線程的工作群組映射至CPU或GPU核心的功能。線程排程器207包含排程GPU核函數(shù)的線程至GPU或CPU的功能。舉例而言,線程排程器207依可符合線程的處理要求的方法可判定對(duì)于處理單元121、122、123或124的線程的分配。在一實(shí)施例中,線程排程器207判定可在GPU 102中的哪個(gè)處理組件上對(duì)各工作項(xiàng)進(jìn)行排程。在另一實(shí)施例中,線程排程器207對(duì)在CPU 101上的工作項(xiàng)線程進(jìn)行排程。舉例而言,線程排程器207可將一個(gè)工作群組的工作項(xiàng)線程排程在單一 CPU核心上,例如CPU核心142。下文將關(guān)聯(lián)于第3至6圖進(jìn)一步描述依據(jù)本發(fā)明的實(shí)施例的模塊201至 207的功能性。在CPU核心上映射并執(zhí)行GPU核函數(shù)第3圖顯示了依據(jù)本發(fā)明的實(shí)施例的用于在異質(zhì)計(jì)算系統(tǒng)上執(zhí)行編碼的程序300。程序300例如可在異質(zhì)計(jì)算系統(tǒng)100上執(zhí)行。在一實(shí)施例中,程序300可代表GPU核函數(shù)排程器109的處理邏輯的流程。在未喪失一般性的前提下,以下的敘述系主要基于OpenCL框架。熟知本領(lǐng)域技術(shù)的人員將意識(shí)到本發(fā)明的實(shí)施例亦可使用其它發(fā)展及執(zhí)行框架加以實(shí)現(xiàn),例如,但不限于 CUDA框架、BrookGPU框架等等。如先前所述,OpenCL提供了開發(fā)環(huán)境、編譯器以及執(zhí)行環(huán)境,在其中,可以在異質(zhì)計(jì)算系統(tǒng)內(nèi)開發(fā)、編譯與執(zhí)行編碼。OpenCL亦提供了可被使用者應(yīng)用程序所呼叫的內(nèi)嵌的鏈接庫(kù)函數(shù)以及應(yīng)用程序撰寫接口(application programming interface, API)以執(zhí)行各種功能,例如配置GPU核函數(shù)在所選擇的處理器上執(zhí)行。一般而言,OpenCL框架主要地在主機(jī)系統(tǒng)上執(zhí)行并且藉由配置命令(例如,包含GPU核函數(shù)的可執(zhí)行編碼)至各處理器以控制所耦合的處理器的作業(yè)。舉例而言,OpenCL可能主要地在CPU核心141上執(zhí)行,并且藉由配置命令給對(duì)應(yīng)的裝置執(zhí)行以控制GPU 102與GPU核心141和142的作業(yè)。在步驟301中,加載用于一個(gè)或更多應(yīng)用程序的編碼。所加載的編碼可能是原始碼或其它預(yù)先編譯編碼的形式,例如字節(jié)碼。在一些實(shí)施例中,編碼亦可包含嵌入式編譯函數(shù)。舉例而言,可基于在應(yīng)用程序中的嵌入式函數(shù)的呼叫而從鏈接庫(kù)中動(dòng)態(tài)地連結(jié)一些函數(shù)。為了敘述的目的,將假設(shè)所加載的編碼系為例如OpenCL的程序語(yǔ)言的原始碼形式。此原始碼最初可位于例如持續(xù)儲(chǔ)存裝置104。在步驟301中加載編碼時(shí),此原始碼可被加載進(jìn)內(nèi)存,例如,系統(tǒng)內(nèi)存103。應(yīng)該注意到,所加載的編碼可包含原始碼、預(yù)先編譯的編碼及/ 或編譯的二進(jìn)制的組合。舉例而言,在其內(nèi)可能實(shí)施程序300的OpenCL開發(fā)、編譯以及執(zhí)行框架允許GPU核函數(shù)的原始碼及/或編譯的二進(jìn)制的加載。OpenCL程序例如可包含GPU 核函數(shù)、控制流編碼以及其它由GPU核函數(shù)所呼叫的函數(shù)。在步驟303中,系分析所加載的編碼。此編碼的分析可包含解析編碼。在一些實(shí)施例中,在步驟303中所分析的編碼可包含有效的OpenCL編碼或在其它程序語(yǔ)言或框架中的編碼,例如C。在分析步驟303中,可判定所需求的CPU資源。舉例而言,分析及/或解析可判定需要于一個(gè)或更多CPU核心上進(jìn)行排程的線程(工作項(xiàng))的總數(shù)。又,分析步驟 303可使用于判定內(nèi)存的需求,例如GPU核函數(shù)所使用的私有內(nèi)存和區(qū)域內(nèi)存的實(shí)際數(shù)量。 在一實(shí)施例中,步驟301和303可使用編碼分析器201的處理邏輯而加以實(shí)現(xiàn)。在步驟305中,異質(zhì)計(jì)算系統(tǒng)系配置成運(yùn)行在步驟301中所加載的編碼。舉例而言,基于步驟303中所完成的編碼分析,可分配一部分的CPU與GPU以運(yùn)行所加載的編碼。 步驟305亦可包含配置內(nèi)存資源,例如內(nèi)存103,以準(zhǔn)備用于所加載的編碼的執(zhí)行。對(duì)所加載的編碼中的各函數(shù)及/或GPU核函數(shù)重復(fù)步驟307至323。舉例而言,可用由上至下的方式掃描所加載的編碼以辨識(shí)各函數(shù)及/或GPU核函數(shù)。在步驟307中,辨識(shí)一函數(shù)/或GPU核函數(shù)。在一實(shí)施例中,舉例而言,可藉由例如在OpenCL中的kernel識(shí)別器的預(yù)定識(shí)別器辨識(shí)GPU核函數(shù)。在步驟309中,判定在步驟307中所識(shí)別的編碼片段系執(zhí)行在CPU或GPU上。舉例而言,預(yù)設(shè)行為可能是在CPU上執(zhí)行除了 GPU核函數(shù)以外的所有函數(shù)并且在GPU上執(zhí)行所有GPU核函數(shù)。另一種考量系可例如基于內(nèi)嵌在編碼內(nèi)的識(shí)別器判定命令或函數(shù)是否為資料平行。料平行命令或函數(shù)較宜排程至GPU。亦可使用其它標(biāo)準(zhǔn),例如加載平衡需求和應(yīng)用程序特征。
(在步驟309中)若處理邏輯及/或編碼片段系被判定在GPU上執(zhí)行,該處理邏輯及/或編碼片段系排程于步驟311中實(shí)施在GPU上。在一些實(shí)施例中,處理邏輯及/或編碼片段系被排程為在特定的GPU上實(shí)施。在步驟311中,處理邏輯及/或編碼片段系被排程在選定的GPU上。步驟311可能包含判定GPU的結(jié)構(gòu),例如在GPU中計(jì)算裝置的數(shù)量,以及在各計(jì)算裝置內(nèi)處理組件的數(shù)量。步驟311亦可包含創(chuàng)造用于該GPU的內(nèi)容和命令隊(duì)列(queue)、創(chuàng)造關(guān)聯(lián)于該內(nèi)容的內(nèi)存對(duì)象、編譯和創(chuàng)造GPU核函數(shù)對(duì)象、發(fā)送相對(duì)應(yīng)的命令至命令隊(duì)列以執(zhí)行該GPU核函數(shù)對(duì)象以及執(zhí)行所發(fā)送的命令的任何同步化。判定GPU的結(jié)構(gòu)可包括,舉例而言,使用OpenCL API呼叫以尋求在系統(tǒng)中可供使用的計(jì)算裝置(例如CPU、GPU),之后尋找一個(gè)或更多所識(shí)別的計(jì)算裝置的區(qū)域信息。從計(jì)算裝置的列表,可詢問GPU裝置以判定GPU處理組件的數(shù)量、范圍限制、工作群組大小、不同內(nèi)存空間的大小、最大內(nèi)存對(duì)象的大小等等。在排程處理邏輯及/或編碼片段以在選定的GPU上執(zhí)行時(shí),可將包括含有編碼片段(例如可執(zhí)行的核函數(shù)對(duì)象)的可執(zhí)行編碼的命令排程至創(chuàng)造在所選定的GPU內(nèi)容中的命令隊(duì)列。在此所使用的「內(nèi)容」,系定義為用于核函數(shù)的執(zhí)行環(huán)境。內(nèi)容可包含對(duì)于裝置、 內(nèi)存以及與核函數(shù)相關(guān)聯(lián)的其它程序?qū)ο蟮奶幚砼c其它信息。舉例而言,內(nèi)容可提供執(zhí)行核函數(shù)以及允許其使用的GPU裝置和內(nèi)存位置。所創(chuàng)造的內(nèi)存對(duì)象可對(duì)應(yīng)于來(lái)源與目標(biāo)對(duì)象。舉例而言,若處理邏輯及/或編碼片段系實(shí)施迭代數(shù)組加法,則來(lái)源對(duì)象系可為二個(gè)來(lái)源數(shù)組。目標(biāo)對(duì)象可為輸出結(jié)果系寫入在其中的數(shù)組??稍谙到y(tǒng)內(nèi)存103或圖形內(nèi)存107中創(chuàng)造內(nèi)存對(duì)象。內(nèi)存對(duì)象可能隨后在例如快取110、143和144的各種快取中被快取。所創(chuàng)造的各內(nèi)存系關(guān)聯(lián)于相對(duì)應(yīng)的內(nèi)容。可執(zhí)行的核函數(shù)對(duì)象的創(chuàng)造系藉由編譯處理邏輯及/或編碼片段而完成,且連接任何需要的裝置特定模塊。舉例而言,編譯后的核函數(shù)對(duì)象可包含核函數(shù)函數(shù)編碼或指令、 提供給核函數(shù)的任何自變量(argument)、相關(guān)聯(lián)的內(nèi)容以及關(guān)于在GPU上執(zhí)行的鏈接庫(kù)編碼。在創(chuàng)造核函數(shù)對(duì)象之后,系將用于執(zhí)行核函數(shù)的命令排列于命令隊(duì)列。排列命令的方式可能依該命令系為資料平行或任務(wù)平行命令而特定。舉例而言,在迭代數(shù)組加法的范例中,數(shù)據(jù)平行命令可排列成具有多個(gè)指令的單一命令以平行地執(zhí)行在特定數(shù)目的計(jì)算裝置中,反之,任務(wù)平行命令可導(dǎo)致一些分離的命令被排入隊(duì)列中,一個(gè)命令用于各個(gè)數(shù)組元素。在步驟309中,若判定處理邏輯及/或編碼片段應(yīng)該在CPU上執(zhí)行,則程序300繼續(xù)進(jìn)行至步驟313。在步驟313中,可選擇一個(gè)或更多CPU以執(zhí)行編碼片段。在一些實(shí)施例中,例如在多核心CPU系統(tǒng)中,CPU的選擇可基于CPU的負(fù)載或處理能力。亦可考慮其它考量,例如可用高速緩存等等的可利用性與大小。為了描述的方便,步驟311至321的描述假設(shè)在CPU上所執(zhí)行的處理邏輯及/或編碼片段系為GPU核函數(shù)。映射該GPU核函數(shù)至所選定的CPU可包含將細(xì)分的GPU線程 (例如工作項(xiàng))映射至CPU核心并且將GPU內(nèi)存階層映射至CPU內(nèi)存系統(tǒng)。在步驟315中, GPU核函數(shù)線程系映射至所選定的CPU。若GPU核函數(shù)原本就系映射至CPU,各GPU工作項(xiàng)將映射至操作系統(tǒng)(operating system, OS)線程。步驟315的處理系可為由工作群組排程器205所提供的部份功能。CPU的硬件內(nèi)容具有更多的限制,而且通常只具有一個(gè)硬件內(nèi)容。OS通常負(fù)責(zé)排程與執(zhí)行OS線程。工作項(xiàng)若原始地映射于OS線程可導(dǎo)致若不是數(shù)千就是數(shù)百的線程。在單一個(gè)內(nèi)容中執(zhí)行大量的線程可導(dǎo)致實(shí)質(zhì)上的低效率,理由包含當(dāng)執(zhí)行各程序時(shí)需要大量的內(nèi)容轉(zhuǎn)換。又,使此OS管理大量的線程系可為非常沒效率。本發(fā)明的實(shí)施例中,系以可達(dá)到高效能的方式完成從GPU至CPU的映射且亦便于對(duì)具有大量線程應(yīng)用程序進(jìn)行除錯(cuò)。在本發(fā)明的實(shí)施例中,映射GPU核函數(shù)至CPU核心系以下述方法完成利用可供使用的多核心CPU,以及具有可管理的OS線程數(shù)量以避免關(guān)于內(nèi)容轉(zhuǎn)換等等的無(wú)效率。因此, 在本發(fā)明的實(shí)施例中,工作群組系代替工作項(xiàng)而為映射及/或關(guān)聯(lián)于OS線程的單元。一個(gè)或更多工作項(xiàng)群集成工作群組。在工作群組中的工作項(xiàng)數(shù)量系可為預(yù)定的或可基于例如可用的處理核心的數(shù)量與能力的標(biāo)準(zhǔn)來(lái)決定。映射及/或?qū)⒐ぷ魅航M關(guān)聯(lián)于OS線程可包含對(duì)工作群組產(chǎn)生新的OS線程或附加工作群組至已經(jīng)存在的OS線程的配置。用于產(chǎn)生新的 OS線程或附加至存在的線程的API函數(shù)系由一個(gè)或更多OpenCL框架(包含OpenCL執(zhí)行系統(tǒng))及位于其下的操作系統(tǒng)所提供??衫缃逵稍O(shè)定對(duì)關(guān)聯(lián)于OS線程的處理器親合性,而將GPU核函數(shù)的各工作群組可映射至CPU??芍概梢粋€(gè)或更多工作群組給各CPU核心??善叫械貓?zhí)行每一 CPU核心的多工作群組。在一實(shí)施例中,各CPU核心系配置成一次僅執(zhí)行單一工作群組。舉例而言,在各CPU核心中僅創(chuàng)造單一 OS線程。各CPU核心可藉由執(zhí)行一個(gè)工作群組至完成,再執(zhí)行另一個(gè)的方式來(lái)執(zhí)行多工作群組。在步驟317中,映射及/或配置在工作群組內(nèi)的線程。步驟317的程序系可為由線程排程器207所提供的部份功能。在映射至工作群組的各OS線程內(nèi),工作項(xiàng)線程系配置成一個(gè)接一個(gè)地依序執(zhí)行。工作項(xiàng)線程系實(shí)施為使用者層級(jí)的線程。將工作項(xiàng)線程系實(shí)施為使用者層級(jí)的線程避免了在使用者空間和核函數(shù)空間之間的過度轉(zhuǎn)換,以及大量?jī)?nèi)容轉(zhuǎn)換的相關(guān)消耗。注意在大部分的例子中,GPU核函數(shù)系應(yīng)用于使用者空間的應(yīng)用程序且不需要對(duì)需求核函數(shù)空間存取的系統(tǒng)資源進(jìn)行直接存取。如同熟知本領(lǐng)域技術(shù)的人員所知, 多使用者層級(jí)的線程可在單一操作系統(tǒng)層級(jí)的線程內(nèi)實(shí)施。在本發(fā)明的一些實(shí)施例中,可在工作群組內(nèi)成群地執(zhí)行工作項(xiàng)線程。舉例而言,在可同時(shí)容納多于一個(gè)浮點(diǎn)或雙運(yùn)算的例如SSE單元(譬如在系統(tǒng)100中的SSE單元145) 的向量單元系可用的環(huán)境中,編譯器可結(jié)合數(shù)個(gè)工作項(xiàng)以平行執(zhí)行以便利用到SSE單元的全部處理能力。在步驟319中,系映射可被CPU核心存取的內(nèi)存以容納可用于GPU的內(nèi)存階層。步驟203的程序系可為CPU內(nèi)存映射器203所提供的部份功能。將GPU內(nèi)存階層映射至CPU 核心以便GPU核函數(shù)可在CPU核心上執(zhí)行可包含數(shù)個(gè)樣態(tài)。因?yàn)镚PU核函數(shù)編碼可包含對(duì) GPU內(nèi)存階層內(nèi)位置的參照,故從GPU內(nèi)存階層至CPU內(nèi)存的映射系有需求。CPU核心典型地僅具有用于其內(nèi)存(例如,系統(tǒng)內(nèi)存103)的單一地址空間,而GPU核心則可具有數(shù)個(gè)分離的可定地址的內(nèi)存。GPU全域內(nèi)存、計(jì)算裝置區(qū)域內(nèi)存以及處理組件私有內(nèi)存可全部映射至CPU內(nèi)存。GPU全域內(nèi)存,例如GPU內(nèi)存107,可直接映射至系統(tǒng)內(nèi)存,例如內(nèi)存103。GPU區(qū)域內(nèi)存和私有內(nèi)存的映射需要更多細(xì)微的方法。如相關(guān)于內(nèi)存所使用的映射可包含設(shè)定設(shè)定自動(dòng)地址翻譯機(jī)制,藉由該機(jī)制,包含在于CPU核心上執(zhí)行的GPU核函數(shù)內(nèi)的內(nèi)存地址系被重新指向系統(tǒng)內(nèi)存103,取代關(guān)聯(lián)于GPU的內(nèi)存階層中的位置。GPU區(qū)域內(nèi)存,例如GPU區(qū)域內(nèi)存114和115,系于計(jì)算單元的處理組件之間被分享。因此,一個(gè)GPU區(qū)域內(nèi)存系于工作群組的所有工作項(xiàng)間被分享。當(dāng)工作群組映射至CPU 時(shí),因?yàn)楣ぷ魅航M系映射至單一的CPU核心,可將相對(duì)應(yīng)的GPU區(qū)域內(nèi)存帶入該CPU核心。 在許多例子中,在GPU中的區(qū)域內(nèi)存的實(shí)際使用系可完全符合在CPU核心的高速緩存。GPU區(qū)域內(nèi)存,例如GPU區(qū)域內(nèi)存114和115,系被工作群組中的工作項(xiàng)所分享。 本發(fā)明中的實(shí)施例可能限制各CPU核心一次只執(zhí)行單一工作群組。在任何例子中,當(dāng)CPU 一次只執(zhí)行單一工作群組時(shí),只有單一個(gè)對(duì)應(yīng)于GPU區(qū)域內(nèi)存的分配系被CPU核心所利用。 據(jù)此,可分配每CPU核心的單一區(qū)域內(nèi)存,且所分配的區(qū)域內(nèi)存可重復(fù)使用于在此CPU核心上執(zhí)行的連續(xù)工作群組。可在系統(tǒng)內(nèi)存的鄰近內(nèi)存區(qū)中對(duì)于各計(jì)算裝置分配區(qū)域內(nèi)存。較佳地,在CPU核心中的高速緩存系可為足夠的大小以容納對(duì)應(yīng)該CPU核心的在系統(tǒng)內(nèi)存中的區(qū)域內(nèi)存的分配的例子。熟知本領(lǐng)預(yù)技術(shù)的人員將了解到分配在內(nèi)存及/或快取中的區(qū)域內(nèi)存區(qū)可需要在被重復(fù)使用于各連續(xù)的工作群組前被刷新。在一些實(shí)施例中,可藉由覆寫掉先前的內(nèi)容以重復(fù)使用分配在內(nèi)存及/或快取中的區(qū)域內(nèi)存區(qū)。GPU私有內(nèi)存,例如GPU私有內(nèi)存131、132、133和134,系私有于各處理組件。在 GPU環(huán)境中的各私有內(nèi)存系一次被單一工作項(xiàng)所使用。因此,類似區(qū)域內(nèi)存,私有內(nèi)存可被分配在系統(tǒng)內(nèi)存中并重復(fù)使用于連續(xù)的工作項(xiàng)。舉例而言,在系統(tǒng)內(nèi)存103中對(duì)私有內(nèi)存的單一分配可被單一工作群組的連續(xù)地執(zhí)行的工作項(xiàng)重復(fù)使用,并且在被相同的CPU核心所執(zhí)行的連續(xù)的工作群組內(nèi)被重復(fù)使用。GPU私有內(nèi)存,與因此對(duì)應(yīng)至該GPU私有內(nèi)存的系統(tǒng)內(nèi)存103中的分配,系典型的使用于保存堆棧變量,該堆棧變量系位于核函數(shù)的內(nèi)部且系屬于各工作項(xiàng)的區(qū)域。常數(shù)內(nèi)存包含具有編碼執(zhí)行過程中始終為常數(shù)的值的資料。對(duì)于在GPU上執(zhí)行的 GPU核函數(shù)而言,常數(shù)內(nèi)存系可在圖形內(nèi)存107及/或GPU全域高速緩存110中。常數(shù)內(nèi)存通常來(lái)說(shuō)系為只讀且不依附于工作群組。于本發(fā)明的實(shí)施例中,常數(shù)內(nèi)存系映射至可被所有CPU核心存取的系統(tǒng)內(nèi)存的區(qū),因?yàn)樵谌魏蜟PU核心上執(zhí)行的任何工作群組或工作項(xiàng)可能需要存取至常數(shù)內(nèi)存。又,較佳地,來(lái)自主存儲(chǔ)器的常數(shù)內(nèi)存分配系復(fù)制在各CPU核心的高速緩存中。將GPU內(nèi)存層級(jí)映射至CPU的范例布局系顯示在第4圖。在步驟321中,可將GPU核函數(shù)排程以執(zhí)行于一個(gè)或更多選定的CPU核心上,例如,核心141及/或142。排程GPU核函數(shù)以供執(zhí)行可包含配置執(zhí)行環(huán)境,例如OpenCL運(yùn)行系統(tǒng),以實(shí)施將工作群組與工作項(xiàng)映射在選定的CPU核心上。在本發(fā)明的一實(shí)施例中,其中系使用OpenCL框架以編譯與執(zhí)行在異質(zhì)計(jì)算計(jì)統(tǒng) 100上的編碼,步驟321可包含排列一個(gè)或更多命令至命令隊(duì)列。舉例而言,在異質(zhì)計(jì)算計(jì)統(tǒng)100中使用OpenCL框架,可將GPU核函數(shù)排程以在一個(gè)或更多核心141和多核心CPU 101上執(zhí)行。典型地,于使用OpenCL框架以在異質(zhì)計(jì)算計(jì)統(tǒng)100上運(yùn)行應(yīng)用程序時(shí),控制部分系在主機(jī)上運(yùn)行,該控制部分使所選擇的編碼在系統(tǒng)100的裝置上(例如GPU 102或核心141和142)開始執(zhí)行。CPU核心,例如核心141和142的其中之一,可作為主機(jī)并且分配GPU核函數(shù)至系統(tǒng)100上的裝置以執(zhí)行之。舉例而言,用于映射CPU內(nèi)存的命令以及用于執(zhí)行GPU核函數(shù)的命令可被排程命令隊(duì)列中,其中該命令隊(duì)列系針對(duì)多核心CPU 101所建立的內(nèi)容中而創(chuàng)設(shè)者。OpenCL運(yùn)行環(huán)境系執(zhí)行被寫至在系統(tǒng)101中特定裝置中的命令隊(duì)列的各命令。在排程用以在多核心CPU 101上執(zhí)行的GPU核函數(shù)時(shí),步驟313至325中所判定用以執(zhí)行映射和配置的指令可插入至編碼以在多核心CPU 101上執(zhí)行。舉例而言,在工作群組內(nèi)的工作項(xiàng)可能需要同步點(diǎn)以被自動(dòng)地或由程序開發(fā)人員手動(dòng)的插入。在多核心CPU 101系統(tǒng)上實(shí)施工作群組內(nèi)的工作項(xiàng)同步化時(shí),本發(fā)明的實(shí)施例可使工作項(xiàng)執(zhí)行至同步點(diǎn)。舉例而言,各工作項(xiàng)以連續(xù)的方式逐個(gè)執(zhí)行至同步點(diǎn)(例如, barrier()函數(shù))且在下一個(gè)工作項(xiàng)被執(zhí)行前暫停在同步點(diǎn)。當(dāng)具有同步點(diǎn)的工作群組中的全部工作項(xiàng)以到達(dá)此處,各工作項(xiàng)從該同步點(diǎn)連續(xù)地執(zhí)行致工作項(xiàng)的終點(diǎn)??刹迦肜缬靡詢?chǔ)存工作項(xiàng)狀態(tài)set jmp()及用以恢復(fù)該工作項(xiàng)的狀態(tài)的IongjmpO的函數(shù)至編碼中。 在本發(fā)明的實(shí)施例中,不會(huì)插入此類附加的編碼至GPU核函數(shù)的原始碼中。反而,此類附加的編碼系插入在GPU核函數(shù)的入口、出口及/或屏障例程(routine)中(且不會(huì)在GPU核函數(shù)編碼內(nèi))。藉由不改變GPU核函數(shù)本身的原始碼,本發(fā)明的實(shí)施例減輕了除錯(cuò)的費(fèi)力。在步驟323中,系決定是否有附加的編碼要被執(zhí)行,若是,程序300返回至步驟 307。若沒有更多編碼要被執(zhí)行,程序300終止在步驟325。 內(nèi)存映射至CPU的范例第4圖例示了在在一 CPU核心的系統(tǒng)內(nèi)存與高速緩存中的內(nèi)存布局的范例。401 系例如描繪了在系統(tǒng)內(nèi)存103中的對(duì)應(yīng)于GPU核函數(shù)的內(nèi)存分配的布局,其中該GPU核函數(shù)原本寫成為在例如GPU 102的GPU上執(zhí)行。402系描繪在單一 CPU核心的快取(例如在 CPU 101的快取109中)中對(duì)應(yīng)的內(nèi)存布局。舉例而言,區(qū)域內(nèi)存411和421系可分別對(duì)應(yīng)于GPU 102中的區(qū)域內(nèi)存114和115。 私有內(nèi)存412、413、422和423系可分別對(duì)應(yīng)于GPU 102的私有內(nèi)存131、132、133和134。常數(shù)內(nèi)存(亦即,儲(chǔ)存固定參數(shù)的內(nèi)存區(qū))。如402所示,CPU核心的快取可具有區(qū)域內(nèi)存區(qū)塊、對(duì)應(yīng)用于工作群組中的各工作項(xiàng)的一個(gè)區(qū)塊的一系列的私有內(nèi)存,及常數(shù)內(nèi)存區(qū)。在一些實(shí)施例中,具有藉由CPU核心處理所需要的區(qū)域內(nèi)存、私有內(nèi)存及常數(shù)內(nèi)存全部在CPU核心的快取中為可得的時(shí),系可為特別的有優(yōu)勢(shì),由此可減低關(guān)于存取系統(tǒng)內(nèi)存103的延遲。如401所示,系統(tǒng)內(nèi)存的鄰近區(qū)域可分配至各區(qū)域內(nèi)存411和421,由此其可分別仿真GPU 102的區(qū)域內(nèi)存114和115。由GPU核函數(shù)編碼所存取的區(qū)域內(nèi)存地址可被翻譯至此分配的區(qū)域內(nèi)的偏移。分配在系統(tǒng)內(nèi)存中的區(qū)域內(nèi)存的總大小系可為M乘上(每一工作群組的區(qū)域內(nèi)存大小),其中M系為CPU核心的數(shù)量。私有內(nèi)存的總大小系可為M乘上N 乘上(每一工作項(xiàng)的私有內(nèi)存大小),其中M系為核心的數(shù)量且N系為每一工作群組的工作項(xiàng)的數(shù)量。為了額外的除錯(cuò)能力,本發(fā)明的一些實(shí)施例可包含在系統(tǒng)內(nèi)存中分離的內(nèi)存分配之間的防護(hù)頁(yè)。舉例而言,可插入防護(hù)頁(yè)441、442、443、444、445和446在用于不同的OS線程的分配間,以及用于相同線程的不同內(nèi)存分配之間。在范例實(shí)施中,可設(shè)定緩存器于每次一指令試圖存取內(nèi)存的防護(hù)頁(yè)區(qū)。內(nèi)存存取錯(cuò)誤的快速偵測(cè)在以實(shí)質(zhì)上平行的方式執(zhí)行大量的并行線程的應(yīng)用程序系可為特別的有效用。在CPU上排程工作項(xiàng)的范例第5圖依據(jù)本發(fā)明的實(shí)施例,顯示了實(shí)施步驟317的處理步驟501至523。在步驟501中,排程工作群組線程。如先前所述,本發(fā)明的實(shí)施例在各CPU核心上創(chuàng)設(shè)單一操作系統(tǒng)線程,在其內(nèi)系排程多個(gè)使用者層級(jí)線程。舉例而言,若要排程二十個(gè)GPU核函數(shù)的實(shí)例 1. . . 20,GPU核函數(shù)線程1. . . 10 (作為工作項(xiàng)1. . . 10)可被排程于核心141,而GPU核函數(shù)線程11. . . 20 (作為工作項(xiàng)11. . . 20)可被排程于核心142。工作項(xiàng)1. . . 10及工作項(xiàng)11. . . 20 可分別被收集至工作群組1和工作群組2。如先前所提及,各工作群組系實(shí)施為OS線程,且因此可在各核心141和142上創(chuàng)造一個(gè)OS線程,以分別實(shí)施工作群組1和2。在步驟503中,判定GPU核函數(shù)是否需要與其它平行執(zhí)行的GPU核函數(shù)同步化。 舉例而言,OpenCL編碼可包含一個(gè)或呼叫barrier ()函數(shù)。若存在此呼叫同步,則判定GPU 核函數(shù)需要同步化;否則,GPU核函數(shù)可能不需要同步化。若判定GPU核函數(shù)不需要同步化,則GPU核函數(shù)依據(jù)所需求的實(shí)例數(shù)目系排程為以由始至終的方式執(zhí)行。舉例而言,在步驟501中所創(chuàng)造的各OS線程內(nèi),系排程預(yù)定數(shù)量的GPU核函數(shù)或工作項(xiàng)以執(zhí)行為使用者層級(jí)的線程。因?yàn)?,工作?xiàng)之間無(wú)需同步化,各工作項(xiàng)系排程為以由始至終的方式執(zhí)行。當(dāng)工作項(xiàng)使用者線程的執(zhí)行完成時(shí),在步驟505中,可例如藉由使用回呼(callback)函數(shù)通知OpenCL執(zhí)行框架。當(dāng)在步驟507中通知工作項(xiàng)已完成執(zhí)行時(shí),在工作群組中的下一個(gè)工作項(xiàng)可排程為在步驟509中執(zhí)行成使用者層級(jí)線程。OpenCL執(zhí)行框架亦可周期性地查詢一個(gè)或更多狀態(tài)參數(shù)以判定工作項(xiàng)是否已完成執(zhí)行。當(dāng)無(wú)余留更多要被排程的工作項(xiàng)在工作群組內(nèi)時(shí),該工作群組完成執(zhí)行。應(yīng)該注意到,在一些實(shí)施例中,可在各CPU核心上排程超過一個(gè)工作群組以逐項(xiàng)連續(xù)地執(zhí)行。若在步驟109中判定執(zhí)行中的工作群組的所有工作項(xiàng)已經(jīng)完成執(zhí)行,則,在步驟511中判定在目前的核心中是否有其它工作群組要執(zhí)行。若在目前的CPU核心上有更多要排程的工作群組時(shí),則排程下一個(gè)工作群組以執(zhí)行。排程另一工作群組可包含重新初始化用于目前CPU核心上正在執(zhí)行的OS線程的內(nèi)存分配。請(qǐng)注意,本發(fā)明的實(shí)施例中,當(dāng)創(chuàng)造OS線程時(shí),內(nèi)存的分配可一次完成,且通常不需要對(duì)指派至此OS線程的各工作群組進(jìn)行重新分配。 若在步驟503中判定需要同步化,依據(jù)所需要的實(shí)例數(shù)目,排程GPU核函數(shù)從起始執(zhí)行至下一個(gè)同步點(diǎn)(例如,barrierO呼叫)。舉例而言,在步驟513中,工作項(xiàng)的使用者層級(jí)線程系排程為從開始執(zhí)行至下一個(gè)barrier ()的呼叫發(fā)生。當(dāng)遭遇到barrierO的呼叫時(shí),可儲(chǔ)存執(zhí)行線程的狀態(tài)。在一實(shí)施例中,可使用例如setjmpO的函數(shù)呼叫以儲(chǔ)存使用者層級(jí)線程的狀態(tài)。所儲(chǔ)存的該線程的狀態(tài)可包含緩存器的內(nèi)容,例如,堆棧指針、框指針及程序計(jì)數(shù)器。各工作項(xiàng)使用者層級(jí)線程的狀態(tài)可儲(chǔ)存于例如系統(tǒng)內(nèi)存103的系統(tǒng)內(nèi)存的一區(qū)中,或在例如持續(xù)內(nèi)存104的持續(xù)內(nèi)存中。在步驟515中,當(dāng)執(zhí)行工作項(xiàng)到達(dá)同步點(diǎn),則在步驟517中判定是否有更多在現(xiàn)行工作群組內(nèi)要被排程的工作項(xiàng)。當(dāng)在步驟515中工作項(xiàng)使用者層級(jí)線程的執(zhí)行到達(dá)同步點(diǎn)時(shí),可例如使用回呼函數(shù)通知OpenCL執(zhí)行框架。當(dāng)在步驟515中通知工作項(xiàng)已到達(dá)同步點(diǎn)時(shí),在步驟517中,可排程工作群組中的下一個(gè)工作項(xiàng)以執(zhí)行成使用者層級(jí)線程。OpenCL執(zhí)行框架亦可周期性地查詢一個(gè)或更多狀態(tài)參數(shù)以判定工作項(xiàng)是否已到達(dá)同步點(diǎn)。當(dāng)無(wú)余留更多要被排程的工作項(xiàng)在工作群組內(nèi)時(shí),該工作群組已完成將工作項(xiàng)執(zhí)行至同步點(diǎn)。若在步驟519中系判定工作項(xiàng)在到達(dá)線程執(zhí)行的終點(diǎn)前具有更多同步點(diǎn),則對(duì)各工作項(xiàng)重復(fù)步驟513至525以從現(xiàn)行同步點(diǎn)執(zhí)行至下一個(gè)同步點(diǎn)。
若在步驟519中系判定工作群組中的工作項(xiàng)不具有更多同步點(diǎn),則在步驟521中, 系排程一個(gè)或已到達(dá)同步點(diǎn)的工作項(xiàng)以由此點(diǎn)執(zhí)行到結(jié)束。排程工作項(xiàng)線程以從同步點(diǎn)執(zhí)行到結(jié)束可包含恢復(fù)線程的狀態(tài)。在一實(shí)施例中,可使用例如IongjmpO的函數(shù)呼叫以恢復(fù)先前以setjmpO所儲(chǔ)存的線程的狀態(tài)。應(yīng)該注意到的是,setjmpO與IongjmpO系分別為習(xí)知上被識(shí)別為儲(chǔ)存及恢復(fù)程序或線程的函數(shù)名稱。在步驟523中,系判定執(zhí)行工作項(xiàng)線程是否已完成執(zhí)行。如關(guān)于步驟507所述,可基于回呼函數(shù)或周期性的查詢判定工作項(xiàng)線程是否已完成執(zhí)行。若判定工作項(xiàng)已完成執(zhí)行,則在步驟523中,判定是否有要被從最后遭遇的同步點(diǎn)執(zhí)行到結(jié)束的更多工作項(xiàng)線程。 若是,則排程下一個(gè)工作項(xiàng)且對(duì)各要被執(zhí)行的工作項(xiàng)重復(fù)步驟521至525。當(dāng)工作群組的所有工作項(xiàng)線程已完成執(zhí)行時(shí),則在步驟527中,判定是否在目前所選擇的CPU核心上有要被排程的其它工作群組。若其它工作群組要被排程,則對(duì)各該其它工作群組重復(fù)步驟513至527。第6式地描繪了工作項(xiàng)線程執(zhí)行。在601中,逐項(xiàng)執(zhí)行工作項(xiàng)線程 WiO. . .Win-I直到工作群組的所有工作項(xiàng)已被由始至終地執(zhí)行。601系描繪了其中無(wú)需同步化的范例。在602中,逐項(xiàng)執(zhí)行工作項(xiàng)線程WiO. . . Win-I直到工作群組的所有工作項(xiàng)已被從開始執(zhí)行到第一同步點(diǎn),在此處以呼叫barrierO加以標(biāo)示。在工作組的所有工作項(xiàng)已從開始執(zhí)行到barrierO后,則工作項(xiàng)中的這者系被逐一地從同步點(diǎn)執(zhí)行到結(jié)束。結(jié)論發(fā)明說(shuō)明即摘要段落可闡明如發(fā)明人所考量的一個(gè)或更多但并非所有的本發(fā)明的范例實(shí)施例,且因此,不欲于限制本發(fā)明以及以任何方式附加的權(quán)利要求。本發(fā)明已以描繪特定功能及其關(guān)聯(lián)的實(shí)施例的功能性建構(gòu)區(qū)塊的幫助而在以上作說(shuō)明。為了敘述的方便,在此處,這些功能性建構(gòu)區(qū)塊的邊界系被任意地定義。只要特定功能及其關(guān)聯(lián)系適當(dāng)?shù)貙?shí)施即可定義替代的邊界。前述的特定實(shí)施例的描述將充分地揭露本發(fā)明的一般性質(zhì),其它人可藉由應(yīng)用在相同技術(shù)領(lǐng)域中的知識(shí)而無(wú)需過度實(shí)驗(yàn)即可輕易地修改及/或適用于此種特定實(shí)施例的各種應(yīng)用,而不背離本發(fā)明的一般概念。因此,基于在此處的教示與引導(dǎo),此種適用及修改系傾向于落在揭露的實(shí)施例的等效含義及范圍內(nèi)。應(yīng)該了解到,在此處的用語(yǔ)或術(shù)語(yǔ),系用于敘述的目的,并非用來(lái)加以限制,使得熟知本技術(shù)領(lǐng)域人員系參考教示及引導(dǎo)以理解本發(fā)明書的術(shù)語(yǔ)或用語(yǔ)。本發(fā)明的廣度及范疇不應(yīng)被任何上述的范例實(shí)施例所加以限制,系應(yīng)只被以下權(quán)利要求及其等效所加以定義。
權(quán)利要求
1.一種用以在處理器核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的方法,該方法包括(a)將該復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組;(b)使來(lái)自該一個(gè)或更多工作群組的第一個(gè)工作群組關(guān)聯(lián)于配置在該處理器核心上執(zhí)行的操作系統(tǒng)線程;以及(c)將來(lái)自該第一工作群組的線程配置成該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。
2.如權(quán)利要求1所述的方法,其中步驟(c)包括將來(lái)自該第一工作群組的線程群集成一個(gè)或更多線程的一個(gè)或更多子集合;將來(lái)自該一個(gè)或更多子集合的第一子集合配置成用以執(zhí)行;以及將來(lái)自該一個(gè)或更多子集合的第二子集合配置成在該第一子集合完成執(zhí)行后執(zhí)行。
3.如權(quán)利要求1所述的方法,其中步驟(a)包括判定多個(gè)可用以在處理器上執(zhí)行該處理邏輯的處理核心,其中該處理器包含該處理核心;以及形成一個(gè)或更多處理核心的多個(gè)工作群組,其中該工作群組的數(shù)目系基于該處理核心的數(shù)目。
4.如權(quán)利要求1所述的方法,進(jìn)一步包括使來(lái)自該一個(gè)或更多工作群組的第二工作群組關(guān)聯(lián)于在第二處理核心上的第二操作系統(tǒng);以及將來(lái)自該第二工作群組的線程配置成該第二操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程, 其中,該第一與第二工作群組系被配置成實(shí)質(zhì)上同時(shí)地執(zhí)行。
5.如權(quán)利要求1所述的方法,其中步驟(c)包括 對(duì)來(lái)自該第一工作群組的線程定義同步點(diǎn);將來(lái)自該第一工作群組的各個(gè)該線程配置成只執(zhí)行到該同步點(diǎn);以及將來(lái)自該第一工作群組的各個(gè)該線程配置成在所有該線程到達(dá)該同步點(diǎn)之后,自該同步點(diǎn)重新開始執(zhí)行。
6.如權(quán)利要求5所述的方法,其中步驟(c)復(fù)包括在到達(dá)該同步點(diǎn)時(shí),儲(chǔ)存來(lái)自該第一工作群組的各個(gè)該線程的狀態(tài);以及在上述重新開始執(zhí)行之前,回復(fù)來(lái)自該第一工作群組的各個(gè)該線程的狀態(tài)。
7.如權(quán)利要求5所述的方法,其中對(duì)于來(lái)自該第一工作群組的線程定義同步點(diǎn)的步驟包括在用于來(lái)自該第一工作群組的線程的編碼中插入同步呼叫。
8.如權(quán)利要求1所述的方法,其中該處理核心系為控制處理單元(CPU)核心。
9.如權(quán)利要求1所述的方法,其中該處理邏輯系為圖形處理單元(GPU)的核函數(shù) (kernel)。
10.如權(quán)利要求1所述的方法,進(jìn)一步包括(d)映射關(guān)聯(lián)于第二處理器的內(nèi)存階層至關(guān)聯(lián)于該處理核心的內(nèi)存。
11.如權(quán)利要求10所述的方法,其中,該映射包括在耦合至該處理核心的系統(tǒng)內(nèi)存中分派復(fù)數(shù)的第一區(qū)域,其中,各個(gè)該第一區(qū)域相當(dāng)于被來(lái)自該第一工作群組的線程所存取的私有內(nèi)存;以及在耦合至該處理核心的系統(tǒng)內(nèi)存中分派復(fù)數(shù)的第二區(qū)域,其中,各個(gè)該第一區(qū)域相當(dāng)于與來(lái)自該第一工作群組的所有線程相關(guān)聯(lián)的區(qū)域內(nèi)存。
12.如權(quán)利要求11所述的方法,其中,該映射復(fù)包括分派防護(hù)頁(yè)于來(lái)自該復(fù)數(shù)第一區(qū)域的每一對(duì)第一區(qū)域之間;以及分派防護(hù)頁(yè)于來(lái)自該復(fù)數(shù)第二區(qū)域的每一對(duì)第二區(qū)域之間。
13.如權(quán)利要求11所述的方法,其中,該映射進(jìn)一步包括在耦合于該處理核心的高速緩存終形成快取區(qū)域,其中,該快取區(qū)域包括該第一區(qū)域和第二區(qū)域其中至少一者的內(nèi)容。
14.一種用于執(zhí)行圖形處理單元(GPU)核函數(shù)的方法,包括加載包括該GPU核函數(shù)的應(yīng)用程序至主機(jī)處理器,其中,該GPU核函數(shù)已經(jīng)預(yù)先被配置成在GPU上執(zhí)行,其中,該GPU核函數(shù)系配置成在該GPU上樣例化(instantiate)復(fù)數(shù)資料并行線程;形成一個(gè)或更多工作群組,其中,各工作群組包括復(fù)數(shù)該資料并行線程; 使該一個(gè)或更多工作群組關(guān)聯(lián)于耦合至該主機(jī)處理器的一個(gè)或更多處理核心的操作系統(tǒng)線程,其中各個(gè)該工作群組僅關(guān)聯(lián)于該操作系統(tǒng)線程的其中一個(gè),而其中各個(gè)該操作系統(tǒng)線程系配置成僅在該處理核心的其中一個(gè)上執(zhí)行;以及將各個(gè)該工作群組的資料并行線程配置成各自關(guān)聯(lián)的操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。
15.如權(quán)利要求14所述的方法,進(jìn)一步包括將來(lái)自耦合至該GPU的內(nèi)存階層中的一個(gè)或更多分配映射至耦合至該一個(gè)或更多處理核心的系統(tǒng)內(nèi)存。
16.一種用于在處理核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的系統(tǒng),包括 包含該處理核心的至少一個(gè)處理器;耦合至該處理核心的至少一個(gè)內(nèi)存;耦合于該至少一個(gè)內(nèi)存與該至少一個(gè)處理器的圖形處理單元(GPU)核函數(shù)排程器,其被配置成使該復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組;使來(lái)自于該一個(gè)或更多工作群組的第一工作群組關(guān)聯(lián)于在該處理核心上的操作系統(tǒng)線程;以及將來(lái)自于該第一工作群組的線程執(zhí)行成在該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。
17.如權(quán)利要求16所述的系統(tǒng),其中,該圖形處理單元核函數(shù)排程器系進(jìn)一步配置成 將來(lái)自該第一工作群組的線程群集成一個(gè)或更多線程的一個(gè)或更多子集合;將來(lái)自該一個(gè)或更多子集合的第一子集合配置成用以執(zhí)行;以及將來(lái)自該一個(gè)或更多子集合的第二子集合配置成在該第一子集合完成執(zhí)行后執(zhí)行。
18.如權(quán)利要求16所述的系統(tǒng),其中,該圖形處理單元核函數(shù)排程器系進(jìn)一步配置成 映射關(guān)聯(lián)于第二處理器的內(nèi)存階層至關(guān)聯(lián)于該處理核心的內(nèi)存。
19.一種實(shí)體計(jì)算機(jī)程序產(chǎn)品包括紀(jì)錄有計(jì)算機(jī)程序邏輯的計(jì)算機(jī)可讀取媒體,系用以另至少一處理器使復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組;使來(lái)自于該一個(gè)或更多工作群組的第一工作群組關(guān)聯(lián)于在至少一個(gè)處理核心上的操作系統(tǒng)線程;以及將來(lái)自于該第一工作群組的線程執(zhí)行成在該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。
20.如權(quán)利要求19所述的實(shí)體計(jì)算機(jī)程序產(chǎn)品,其中該紀(jì)錄有計(jì)算機(jī)程序邏輯的計(jì)算機(jī)可讀取媒體,進(jìn)一步系用以另至少一處理器將來(lái)自該第一工作群組的線程群集成一個(gè)或更多線程的一個(gè)或更多子集合;將來(lái)自該一個(gè)或更多子集合的第一子集合配置成用以執(zhí)行;以及將來(lái)自該一個(gè)或更多子集合的第二子集合配置成在該第一子集合完成執(zhí)行后執(zhí)行。
全文摘要
一種用以在處理核心上執(zhí)行處理邏輯的復(fù)數(shù)資料并行線程的方法,包含將該復(fù)數(shù)資料并行線程群集成一個(gè)或更多工作群組,使來(lái)自該一個(gè)或更多工作群組的第一個(gè)工作群組關(guān)聯(lián)于在該處理器核心上的操作系統(tǒng)線程,以及將來(lái)自該第一工作群組的線程配置成該操作系統(tǒng)線程內(nèi)的使用者層級(jí)線程。在一范例中,一種方法使先前配置成用于GPU的GPU核函數(shù)能夠在例如多核心CPU的CPU上執(zhí)行。以此方法將大量資料并行線程映射至CPU以減少實(shí)例化在CPU上的耗成本的操作系統(tǒng)線程的數(shù)目,且達(dá)成有效的除錯(cuò)。
文檔編號(hào)G06F9/46GK102576314SQ201080042528
公開日2012年7月11日 申請(qǐng)日期2010年7月23日 優(yōu)先權(quán)日2009年7月27日
發(fā)明者B·加斯特, J·伽馬拉杜, L·莫里切特 申請(qǐng)人:先進(jìn)微裝置公司