HMPP開放標準

HMPP用於異構多核並行程式設計。OpenHMPP標準基於一組指令，是用於處理硬體加速器的程式設計模型，但又沒有GPU程式設計的相關複雜性。這種基於指令的方法已經實現，因為他們使應用程式程式碼和硬體加速器使用之間形成鬆散關係。本文涉及組成OpenHMPP標準的HMPP指令, 但並不處理指令的執行連結到指令執行。簡介.OpenHMPP基於指令的程式設計模型提供了一種語法，有效地減輕硬體加速器上的計算，最佳化資料向/從硬體儲存器移動。模型基於 CAPS (編譯器和超標量體系結構以及嵌入式處理器) 的初始化工作, 以及來自INRIA, CNRS, 雷恩第一大學和雷恩INSA的共同專案。OpenHMPP標準概念.OpenHMPP標準基於codelets的概念, 可以在硬體上遠端執行。OpenHMPP Codelet 概念.codelet具有以下屬性:這些屬性確保codelet RPC可以透過硬體遠端執行。此RPC及其相關的資料傳輸可以是非同步的。Codelet RPCs.HMPP提供同步和非同步的RPC。非同步操作的執行依賴於硬體。HMPP 儲存器模型.HMPP考慮到兩個地址空間: 一個主機處理器和硬體儲存器。指令概念.OpenHMPP指令可能被視為“元資訊” 新增到應用程式原始碼。它們是安全的元資訊，即不會改變原始程式碼的行為。它們處理函式的遠端執行(RPC)，以及資料向/從硬體儲存器傳輸。下表介紹了OpenHMPP指令。OpenHMPP指令滿足不同需求: 其中一些專門用於宣告，其他用於執行的管理。指令集的概念.HMPP方法的基本點之一是指令的概念及其關聯的標籤，使它能夠在分佈於應用程式中的整個指令集上公開一個相干結構。有兩種型別的標籤:OpenHMPP指令語法.為了簡化符號, 正則表示式 將用於描述HMPP指令的語法。下面的顏色通常用於描述指令的語法:一般語法.OpenHMPP指令的一般語法如下:#pragma hmpp  [codelet_label]? directive_type [,directive_parameters]* [&amp;]!$hmpp  [codelet_label]? directive_type [,directive_parameters]* [&amp;]其中:指令引數.關聯到一個指令的引數可能是不同型別。以下是 在HMPP中定義的指令引數:OpenHMPP 指令.宣告和執行一個codelet的指令.codelet指令宣告在硬體加速器上遠端執行計算。codelet 指令:該指令的語法是:#pragma hmpp  codelet_label codelet[, version = major.minor[.micro]?]?[, args[arg_items].io=out|inout*[, args[arg_items].size={dimsize[,dimsize]*}]*[, args[arg_items].const=true]*[, cond = "expr"][, target=target_name[:target_name]*]可以在一個函式中加入多個codelet指令，以便指定不同用途或不同執行文字。但是, 一個給定呼叫站點標籤只能有一個codelet指令。Callsite指令指定程式內的給定點如何使用一個codelet。該指令的語法是:#pragma hmpp  codelet_label callsite[, asynchronous]?[, args[arg_items].size={dimsize[,dimsize]*}]*[, args[arg_items].advancedload=false*[, args[arg_items].addr="expr"]*[, args[arg_items].noupdate=true]*這裡有一個例子:/* declaration of the codelet */#pragma hmpp simple1 codelet, args[outv].io=inout, target=CUDAstatic void matvec(int sn, int sm, loat inv[sm], float inm[sn][sm], float *outv){int i, j;for (i = 0 ; i &lt; sm ; i++) {float temp = outv[i];for (j = 0 ; j &lt; sn ; j++) {temp += inv[j] * inm[i][ j];outv[i] = temp;int main(int argc, char **argv) {int n;/* codelet use */matvec(n, m, myinc, inm, myoutv);某些情況下, 需要具體管理整個應用程式的資料(CPU/GPU 資料移動最佳化, 共享變數...)。group指令允許宣告一組codelets。 指令中定義的引數應用於所有屬於該組的 codelets。該指令的語法是:#pragma hmpp  group[, version = ]?]?[, target = target_name[:target_name]*]]?[, cond = “expr”]?資料傳輸指令可以最佳化通訊開銷.硬體使用時的主要瓶頸通常是硬體和住處理器之間的資料傳輸。要限制通訊開銷,可以透過使用硬體的非同步屬性，連續執行相同的codelet以重疊資料傳輸。allocate指令鎖定硬體，並分配所需的記憶體量。release指令指定何時為一組或一個獨立codelet釋放硬體。#pragma hmpp  releaseadvancedload指令在codelet遠端執行之前預取資料。,args[arg_items][,args[arg_items].size={dimsize[,dimsize]*}]*[,args[arg_items].addr="expr"]*[,args[arg_items].section={[subscript_triplet,]+}]*[,asynchronous]delegatedstore指令是一個同步障，以等待一個非同步codelet執行完成，然後下載結果。,args[arg_items][,args[arg_items].addr="expr"]*[,args[arg_items].section={[subscript_triplet,]+}]*同步指令指定等待，直到一個非同步callsite執行完成。對於同步指令, codelet 標籤始終是強制性的，並且若是codelet屬於一個組，需要有組標籤。在下面的例子中，完成裝置初始化，記憶體分配和輸入資料的上載在迴圈外只有一次，而不是每次迴圈迭代。同步指令允許在啟動另一個迭代之前等待codelet的非同步執行的完成。最後在迴圈外delegatedstore指令將上載sgemm結果。int main(int argc, char **argv) {#pragma hmpp sgemm advancedload, args[vin1;vin2;vout], args[m,n,k,alpha,beta]for ( j = 0 ; j &lt; 2 ; j ++) {#pragma hmpp sgemm callsite, asynchronous, args[vin1;vin2;vout].advancedload=true, args[m,n,k,alpha,beta].advancedload=truesgemm (size, size, size, alpha, vin1, vin2, beta, vout);#pragma hmpp sgemm synchronize#pragma hmpp sgemm delegatedstore, args[vout]#pragma hmpp sgemm releaseCodelets之間共享資料.這些指令共同對映所有引數共享所有組的給定名稱。所有對映引數的型別和尺寸必須是相同的。map指令對映裝置上的幾個引數。此指令除了引數按其名稱直接指定對映之外，與map指令很類似。 mapbyname 指令相當於多對映指令。#pragma hmpp  mapbyname [,variableName]+全域性變數.Resident指令宣告某些變數在一個組內為全域性變數。 然後可以從任何屬於組的codelet中直接訪問這些變數。此指令應用於原始碼中在其之後的宣告語句。此指令的語法是:#pragma hmpp  resident[, args[::var_name].io=out|inout*[, args[::var_name].size={dimsize[,dimsize]*}]*[, args[::var_name].addr="expr"]*[, args[::var_name].const=true]*符號::var_name 以::為字首, 表示一個應用程式的變數宣告為resident。加速區.codelet/callsite指令合併為一個區域。目的是避免程式碼重構中構建codelet。 因此，所有codelet或callsite指令可用屬性都可以用於regions指令。在C語言中:#pragma hmpp [] [label] region[, args[arg_items].io=out|inout*[, cond = "expr"]&lt;[, args[arg_items].const=true]*[, target=target_name[:target_name]*][, args[arg_items].size={dimsize[,dimsize]*}]*[, args[arg_items].advancedload=false*[, args[arg_items].addr="expr"]*[, args[arg_items].noupdate=true]*[, asynchronous]?[, private=[arg_items]]*C BLOCK STATEMENTS實現.HMPP開放標準基於HMPP 2.3版本(2009年5月, CAPS 公司).HMPP基於指令的程式設計模型已經實現如下:此外，HMPP開放標準用於石油和天然氣，能源，製造業，金融，教育及研究領域的高效能計算，讓開發人員使用大部分多核處理器，同時保留其遺留資源。