OpenHMPPOpenHMPP (HMPP[1] для Hybrid Multicore Parallel Programming) — стандарт програмування для гетерогенних обчислень. Базується на основі набору директив компілятора, модель програмування призначена для маніпулювання апаратними прискорювачами без складнощів пов'язаних з GPU програмуванням. Цей підхід на основі директив був реалізований тому, що він дозволяє вільні зв'язки між програмний кодом і використанням апаратного прискорювача. ОписOpenHMPP модель програмування заснована на директивах надає синтаксис, щоб розвантажити обчислювання на апаратних прискорювачах та оптимізувати переміщення даних на/із апаратної пам'яті. Модель заснована на праці CAPS (Compiler and Architecture for Embedded and Superscalar Processors) [Архівовано 16 червня 2011 у Wayback Machine.], є спільним проектом з INRIA, CNRS, University of Rennes 1 і INSA Rennes. Поняття OpenHMPPOpenHMPP заснована на концепції codelets, функції можуть бути виконані віддалено на апаратних прискорювачах. Концепція OpenHMPP codeletCodelet має наступні властивості:
Ці властивості гарантують, що RPC може бути віддалено виконана на апаратних прискорювачах. Цей RPC і пов'язані з ним передачі даних можуть бути асинхронними. Codelet RPCsHMPP надає синхронний і асинхронний RPC. Виконання асинхронних операцій залежить від апаратних засобів. Модель пам'яті HMPPHMPP розглядає два адресних простори: хост процесор і пам'ять апаратного прискорювача. Поняття директивДирективи OpenHMPP можуть розглядатися як «мета-інформація» додана у вихідний код програми. Вони гарантують безпеку мета-інформації, тобто вони не змінюють поведінку початкового коду. Вони стосуються віддаленого виконання (RPC) функції, а також передачі даних в/з пам'яті апаратного прискорювача. В таблиці нижче представлені директиви OpenHMPP. В директивах OpenHMPP розглядаються різні проблеми: деякі з них присвячені оголошенню та інші призначені для управління виконанням.
Концепція набору директивОднією з основних точок НМРР підходу є поняття директив і пов'язаних з ними міток, що дозволяють виявити цілісну структуру на весь набір директив поширений в додатку. Існує два види міток:
OpenHMPP Синтаксис ДирективДля того, щоб спростити позначення, регулярні вирази будуть використані для опису синтаксису HMPP директив. Кольорові позначення нижче використовується для опису синтаксису директив:
Загальний синтаксисЗагальний синтаксис директив OpenHMPP є:
#pragma hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&]
!$hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&] Де:
OpenHMPP директивиДирективи для оголошення і виконання codeletДиректива Для директиви
Синтаксис директиви: #pragma hmpp <grp_label> codelet_label codelet [, version = major.minor[.micro]?]? [, args[arg_items].io=[[in|out|inout]]* [, args[arg_items].size={dimsize[,dimsize]*}]* [, args[arg_items].const=true]* [, cond = "expr"] [, target=target_name[:target_name]*] Директива Синтаксис директиви: #pragma hmpp <grp_label> codelet_label callsite [, asynchronous]? [, args[arg_items].size={dimsize[,dimsize]*}]* [, args[arg_items].advancedload=[[true|false]]* [, args[arg_items].addr="expr"]* [, args[arg_items].noupdate=true]* Приклад показаний тут: /* declaration of the codelet */
#pragma hmpp simple1 codelet, args[outv].io=inout, target=CUDA
static void matvec(int sn, int sm, float inv[sm], float inm[sn][sm], float *outv){
int i, j;
for (i = 0 ; i < sm ; i++) {
float temp = outv[i];
for (j = 0 ; j < sn ; j++) {
temp += inv[j] * inm[i][ j];
}
outv[i] = temp;
}
int main(int argc, char **argv) {
int n;
........
/* codelet use */
#pragma hmpp simple1 callsite, args[outv].size={n}
matvec(n, m, myinc, inm, myoutv);
........
}
У деяких випадках, певне управління даних у всьому додатку потрібно (CPU/GPU оптимізації переміщення даних, загальні змінні...). Директива Синтаксис директиви: #pragma hmpp <grp_label> group [, version = <major>.<minor>[.<micro>]?]? [, target = target_name[:target_name]*]]? [, cond = “expr”]? Обмін даними між codeletsТипи та розміри всіх зіставлених аргументи повинні бути ідентичними. Директива #pragma hmpp <grp_label> map, args[arg_items] Ця директива дуже схожа на #pragma hmpp <grp_label> mapbyname [,variableName]+ Глобальні змінніДиректива Синтаксис цієї директиви: #pragma hmpp "/span>grp_label<span style="color:#339933;"" resident [, args[::var_name].io=[[in|out|inout]]* [, args[::var_name].size={dimsize[,dimsize]*}]* [, args[::var_name].addr="expr"]* [, args[::var_name].const=true]* Позначення Прискорення регіонівRegion це злиття директив codelet/callsite. Мета полягає в тому, щоб уникнути реструктуризації коду для побудови codelet. Тому, всі атрибути доступні для В мові C: #pragma hmpp [<MyGroup>] [label] region [, args[arg_items].io=[[in|out|inout]]* [, cond = "expr"]< [, args[arg_items].const=true]* [, target=target_name[:target_name]*] [, args[arg_items].size={dimsize[,dimsize]*}]* [, args[arg_items].advancedload=[[true|false]]* [, args[arg_items].addr="expr"]* [, args[arg_items].noupdate=true]* [, asynchronous]? [, private=[arg_items]]* { C BLOCK STATEMENTS } Зовнішні посилання
Примітки
|