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 має наступні властивості:
- Це чиста функція.
- Вона не містить статичних чи динамічних змінних, не посилається на якісь глобальні змінні за винятком того, коли вона була оголошена в HMPP директиві «resident»
- Не містить викликів функцій які можуть бути вбудованими. Це включає в себе використання бібліотек і системних функцій таких як malloc, printf, …
- Кожен виклик функції повинен посилатись до статичної чистої функції (без покажчиків на функції).
- Вона не повертає ніякого значення(функція void в C або subroutine в Fortran).
- Число аргументів повинно бути виправлено (тобто це не може бути функція зі змінним числом аргументів як в stdarg.h C).
- Вона не рекурсивна.
- Його параметри вважаються не псевдонімом (перегляньте Aliasing (computing)).
- Він не містить директив callsite (тобто RPC на інший codelet) або інших HMPP директив.
Ці властивості гарантують, що RPC може бути віддалено виконана на апаратних прискорювачах. Цей RPC і пов'язані з ним передачі даних можуть бути асинхронними.
Codelet RPCs[ред. | ред. код]
HMPP надає синхронний і асинхронний RPC. Виконання асинхронних операцій залежить від апаратних засобів.
Модель пам'яті 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 }
Зовнішні посилання[ред. | ред. код]
- CAPS Entreprise SAS and PathScale, Inc to Jointly Collaborate on Making HMPP a New Open Standard [Архівовано 7 жовтня 2012 у Wayback Machine.]
- How Hardware Will Shape Languages [Архівовано 13 січня 2012 у Wayback Machine.] By David Chisnall
- Code acceleration with HMPP By ICHEC (Irish Center for High-End Computing)
- Expérience de programmation avec HMPP By IRMA (Institut de Recherche Mathématique Avancée) — FORTRAN examples
- Directive-based Heterogeneous Programming — A GPU-Accelerated RTM Use Case [Архівовано 17 липня 2011 у Wayback Machine.] By TOTAL Technical and Scientific Center and CAPS Entreprise
- HMPP Port [Архівовано 20 липня 2011 у Wayback Machine.] By CEA (Commissariat à l'Energie Atomique et aux Energies Alternatives) for PRACE (Partnership for Advanced Computing in Europe)
Примітки[ред. | ред. код]
- ↑ 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.