Користувач:Горбач Вадим/Чернетка
OpenHMPP (HMPP для Hybrid Multicore Parallel Programming) - стандарт програмування для гетерогенних обчислень. Базується на основі набору директив компілятора, модель програмування призначена для маніпулювання апаратними прискорювачами без складнощів пов'язаних з GPU програмуванням. Цей підхід на основі директив був реалізований тому, що він дозволяє вільні зв'язки між програмний кодом і використанням апаратного прискорювача.
Опис[ред. | ред. код]
OpenHMPP модель програмування заснована на директивах надає синтаксис, щоб розвантажити обчислювання на апаратних прискорювачах та оптимізувати переміщення даних на/із апаратної пам'яті.
Модель заснована на праці CAPS (Compiler and Architecture for Embedded and Superscalar Processors), є спільним проектом з 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=[[<span style="color:#339933;">in</span>|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=[[<span style="color:#339933;">true</span>|false]]* [, args[arg_items].addr="expr"]* [, args[arg_items].noupdate=true]* Приклад показаний тут:У деяких випадках, певне управління даних у всьому додатку потрібно (CPU/GPU оптимізації переміщення даних, загальні змінні...). Директива/* 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); ........ }
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 <grp_label> resident [, args[::var_name].io=[[<span style="color:#339933;">in</span>|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=[[<span style="color:#339933;">in</span>|out|inout]]* [, cond = "expr"]< [, args[arg_items].const=true]* [, target=target_name[:target_name]*] [, args[arg_items].size={dimsize[,dimsize]*}]* [, args[arg_items].advancedload=[[<span style="color:#339933;">true</span>|false]]* [, args[arg_items].addr="expr"]* [, args[arg_items].noupdate=true]* [, asynchronous]? [, private=[arg_items]]* { C BLOCK STATEMENTS }