OpenHMPP

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

OpenHMPP (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.

Поняття OpenHMPP

[ред. | ред. код]

OpenHMPP заснована на  концепції codelets, функції можуть бути виконані віддалено на апаратних прискорювачах.

Концепція OpenHMPP codelet

[ред. | ред. код]

Codelet має наступні властивості:

  1. Це чиста функція.
    • Вона не містить статичних чи динамічних змінних, не посилається на якісь глобальні змінні за винятком того, коли вона була оголошена в HMPP директиві «resident»
    • Не містить викликів функцій які можуть бути вбудованими. Це включає в себе використання бібліотек і системних функцій таких як malloc, printf, …
    • Кожен виклик функції повинен посилатись до статичної чистої функції (без покажчиків на функції).
  2. Вона не повертає ніякого значення(функція void в C або subroutine в Fortran).
  3. Число аргументів повинно бути виправлено (тобто це не може бути функція зі змінним числом аргументів як в stdarg.h C).
  4. Вона не рекурсивна.
  5. Його параметри вважаються не псевдонімом (перегляньте Aliasing (computing)).
  6. Він не містить директив callsite (тобто RPC на інший codelet) або інших HMPP директив.

Ці властивості гарантують, що RPC може бути віддалено виконана на апаратних прискорювачах. Цей RPC і пов'язані з ним передачі даних можуть бути асинхронними.

Codelet RPCs

[ред. | ред. код]
Синхронний проти асинхронного RPC

HMPP надає синхронний і асинхронний RPC. Виконання асинхронних операцій залежить від апаратних засобів.

Модель пам'яті HMPP

[ред. | ред. код]
Модель пам'яті HMPP

HMPP розглядає два адресних простори: хост процесор і пам'ять апаратного прискорювача.

Поняття директив

[ред. | ред. код]

Директиви OpenHMPP можуть розглядатися як «мета-інформація» додана у вихідний код програми. Вони гарантують безпеку мета-інформації, тобто вони не змінюють поведінку початкового коду. Вони стосуються віддаленого виконання (RPC) функції, а також передачі даних в/з пам'яті апаратного прискорювача.

В таблиці нижче представлені директиви OpenHMPP. В директивах OpenHMPP розглядаються різні проблеми: деякі з них присвячені оголошенню та інші призначені для управління виконанням.

Інструкції керування потоком Директиви для управління даними
Оголошення codelet

group

resident

map mapbyname

Оперативні директиви callsite

synchronize region

allocate

release advancedload delegatedstore

Концепція набору директив

[ред. | ред. код]

Однією з основних точок НМРР підходу є поняття директив і пов'язаних з ними міток, що дозволяють виявити цілісну структуру на весь набір директив поширений в додатку.

Існує два види міток:

  • Один пов'язаний з codelet. Загалом, директиви які несуть цей вид міток обмежуються тільки одним codelet (викликається автономний codelet в іншій частині документа щоб відрізнити його від групи codelets).
  • Інший пов'язаний з групою codelets. Ці мітки позначені таким чином: «<LabelOfGroup>», де «LabelOfGroup» — це ім'я, задане користувачем. Загалом, директиви, які мають позначку цього типу відносяться до цілої групи.

OpenHMPP Синтаксис Директив

[ред. | ред. код]

Для того, щоб спростити позначення, регулярні вирази будуть використані для опису синтаксису HMPP директив.

Кольорові позначення нижче використовується для опису синтаксису директив:

  • Зарезервовані HMPP ключові слова зелені;
  • Елементи граматики, які можуть бути відкинуті в ключових словах HMPP червоні;
  • Змінні користувача залишаються в чорними.

Загальний синтаксис

[ред. | ред. код]

Загальний синтаксис директив OpenHMPP є:

  • Для мови C:
#pragma hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&]
  • Для мови FORTRAN:
!$hmpp <grp_label> [codelet_label]? directive_type [,directive_parameters]* [&]

Де:

  • <grp_label>: це унікальний ідентифікатор іменування групи codelets. У тих випадках, коли жодна з груп не визначена в додатку, ця мітка може просто пропущена. Дозволені назви міток повинні дотримуватись цієї граматики: [a-z, A-Z,_][a-z, A-Z,0-9,_]*. Зверніть увагу, що «< >» символи відносяться до синтаксису і є обов'язковими для такого роду міток.
  • codelet_label: унікальний ідентифікатор іменування codelet. Дозволені назви міток повинні дотримуватись цієї граматики: [a-z, A-Z,_][a-z, A-Z,0-9,_]*
  • directive: це ім'я директиви;
  • directive_parameters: визначає деякі параметри, пов'язані з директивою. Ці параметри можуть бути різних видів і уточнювати деякі аргументи наведені в директиві з будь-яким режимом виконання (асинхронний в порівнянні з синхронним, наприклад);
  • [&]: це символ, який використовується для продовження директиви на наступному рядку(те ж для C і FORTRAN).

OpenHMPP директиви

[ред. | ред. код]

Директиви для оголошення і виконання codelet

[ред. | ред. код]

Директива codelet оголошує обчислення для віддаленого виконання на апаратному прискорювачі.

Для директиви codelet :

  • Мітка codelet є обов'язковою і повинна бути унікальною в додатку
  • Мітка групи не вимагається, якщо жодна з груп не визначена.
  • Директива 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]*]

Директива callsite визначає, яким чином Використовувати codelet в даний момент в програмі. 

Синтаксис директиви: 

 #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 оптимізації переміщення даних, загальні змінні...). Директива group дозволяє оголошувати групу codelets. Параметри, зазначені в цій директиві, застосовуються до всіх codelets, що належать до цієї групи. 

Синтаксис директиви: 

#pragma hmpp <grp_label> group 
                          [, version = <major>.<minor>[.<micro>]?]? 
                          [, target = target_name[:target_name]*]]? 
                          [, cond  = “expr]?

Обмін даними між codelets

[ред. | ред. код]

Типи та розміри всіх зіставлених аргументи повинні бути ідентичними.

Директива map відображає кілька аргументів на пристрої. 

#pragma hmpp <grp_label>  map, args[arg_items]

Ця директива дуже схожа на map за винятком того, що аргументи, які будуть зіставлені визначаються по їменам. Директива mapbyname є еквівалентом кількох директив map .

#pragma hmpp <grp_label> mapbyname [,variableName]+

Глобальні змінні 

[ред. | ред. код]

Директива resident оголошує деякі змінні як глобальні всередині групи. Ці змінні можуть бути доступні безпосередньо з будь-якого codelet, що належить до групи. Ця директива застосовується до оператора оголошення тільки наступною за ним в вихідному коді.

Синтаксис цієї директиви:  #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]*

Позначення ::var_name з префіксом ::означає, що змінна програми оголошена як resident.

Прискорення регіонів 

[ред. | ред. код]

Region це злиття директив codelet/callsite. Мета полягає в тому, щоб уникнути реструктуризації коду для побудови codelet. Тому, всі атрибути доступні для codelet або callsite директив можуть бути використані в директивах regions .

В мові 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
   }

Зовнішні посилання

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. Dolbeau, Romain; Bihan, Stéphane; Bodin, François (4 October 2007). HMPP: A Hybrid Multi-core Parallel Programming Environment [Архівовано 16 січня 2014 у Wayback Machine.] . Workshop on General Purpose Processing on Graphics Processing Units [Архівовано 23 вересня 2011 у Wayback Machine.]. Retrieved 14 January 2014.