Міністерство освіти і науки УкраїниНаціональний університет «Львівська політехніка»
Розрахункова роботаз дисципліни: «Технології розподілених систем та паралельних обчислень»Варіант - 6
ЗМІСТ
Вступ
Апаратне та програмне забезпечення
Апаратне
Програмне
Опис
Використання бібліотеки
Ключове слово restrict
Інсталяція та конфігурація
Приклад використання бібліотеки
Висновок
Використані джерела
Вступ
Паралельні обчислення — це форма обчислень, в яких кілька дій проводяться одночасно[1]. Грунтуються на тому, що великі задачі можна розділити на кілька менших, кожну з яких можна розв'язати незалежно від інших.
Паралельні комп'ютери можуть бути грубо класифіковані згідно з рівнем, на якому апаратне забезпечення підтримує паралелізм: багатоядерність, багатопроцесорність — комп'ютери, що мають багато обчислювальних елементів в межах одної машини, а також кластери, MPP, та ґрід — системи що використовують багато комп'ютерів для роботи над одним завданням. Спеціалізовані паралельні архітектури іноді використовуються поряд з традиційними процесорами, для прискорення особливих задач.
Програми для паралельних комп'ютерів писати значно складніше, ніж для послідовних[5], бо паралелізм додає кілька нових класів потенційних помилок, серед яких є найпоширеніною стан гонитви. Комунікація, та синхронізація процесів зазвичай одна з найбільших перешкод для досягнення хорошої продуктивності паралельних програм.
Апаратне та програмне забезпечення
Апаратне
Основною пам'яттю в паралельному комп'ютері є як спільна пам'ять (розподілена між всіма обчислювальними елементами в одному адресному просторі), чирозподілена пам'ять (в якій кожен обчислювальний елемент має свій власний локальний адресний простір). Розподілена пам'ять відсилається до того факту, що пам'ять є логічно поділеною, хоча часто натякає і на те, що вона також розділена і фізично. Розподілена спільна пам'ять та віртуалізація пам'яті комбінують обидва підходи, де обчислювальний елемент має свою власну локальну пам'ять, та доступ до пам'яті інших процесорів. Доступ до локальної пам'яті зазвичай швидший ніж доступ до нелокальної.
Багатоядерний процесор — це процесор, що містить кілька ядер. Ці процесори відрізняються від суперскалярних процесорів, які можуть виконувати кілька інструкцій за такт з одного потоку інструкцій (ниті); на відміну від багатоядерних, що можуть за такт виконувати кілька інструкцій з різних нитей. Кожне ядро багатоядерного процесора потенційно може бути суперскалярним, тобто виконувати по кілька інструкцій з одної ниті.
Програмне
C++ Accelerated Massive Parallelism (скорочено C++ AMP) - бібліотека реалізована на основі DirectX 11 з відкритою специфікацією від компанії Microsoft для реалізації паралельних програм для гетерогенних систем на мові програмування C++. Для роботи програм написаних з використанням цієї бібліотеки необхідна операційної системи Windows 7 або Windows Server 2008 R2 або вищі, з встановленим DirectX 11, якщо у системі немає графічного адаптера на якому може бути запущений код то він буде запущений за допомогою центрального процесору і використовувати SSE інструкції. На даний час розробку програм можна робити лише за допомогою середовища Microsoft Visual Studio 2012, Windows 7, Windows 8, Windows Server 2008 R2 або Windows Server 2012 DirectX 11 Feature Level 11,0 або пізнішої версії апаратного
Для налагодження в емуляторі програмного забезпечення, Windows 8 або Windows Server 2012 не потрібно. Для налагодження на апаратне забезпечення, вам необхідно встановити драйвери для вашої відеокарти. Для отримання додаткової інформації див Налагодження GPU-код.
Опис
C ++ AMP (C ++ Прискорене масовим паралелізмом) прискорює виконання вашої C ++ код за користуючись даними паралельно обладнання, яке зазвичай присутній у вигляді графічного процесора (GPU) на дискретній відеокарті. Модель програмування C ++ AMP включає підтримку багатовимірних масивів, індексація, передачі пам'яті, і паркет. Він також включає в себе бібліотеку математичної функції. Ви можете використовувати мовні розширення C ++ AMP, щоб контролювати, як дані переміщаються від центрального процесора на графічний і назад.
Для початкового релізу C ++ AMP від Microsoft потрібна ОС Windows 7 або Windows Server 2008 R2.
У мову додана синтаксична конструкція «restrict (amp)», яка може бути вказана для будь-якої функції (у тому числі для лямбда-функції), що позначає що вона може бути виконана на акселератор C ++ AMP. Ключове слово restrict в даному випадку означає, що компілятор повинен оцінити, чи підходить дана функція для GPU (чи використовує вона лише ті можливості мови C ++, які можуть бути виконані на більшості GPU).
Microsoft или другие будущие производители систем, совместимых с C++ AMP могли бы добавить другие спецификаторы restrict, в дополнение к «amp».
Остальная часть C++ AMP доступна через заголовочный файл <amp.h> и пространство имен «concurrency». Основные классы C++ AMP: array (контейнер данных для акселератора), array_view (обертка для данных), index (координаты точки в N-мерном декартовом пространстве с целочисленными координатами), extent (N-мерная целочисленная размерность), accelerator (вычислительный блок, например, GPU, на котором будет выделяться память и запускаться вычисление), accelerator_view (вид акселератора).
Використання бібліотеки
Для того щоб почати розробляти програми використовуючи дану бібліотеку першочергово слід підключити хідер файл: <amp.h>. Даний файл містить опис усіх необхідних функцій та типів. Окрім хідер файлу ще треба використовувати простір імен concurrency. Класи C++ AMP:
accelerator: обчислювальний блок на котрому буде виділятися пам'ять і будуть робитися обрахунки.
accelerator_view: тип accelerator.
extent: N-вимірна цілочисельна розмірність даних.
index: індекс для роботи у N-вимірному просторі.
array: контейнер даних для акселератора.
array_view: обґортка над даними, дозволяє створювати багатомірні обгортки на даними, масивами або векторами
Ключове слово restrict
Дане ключове слово, або умова, вказує тип пристрою на якому планується запуск коду, дана умова може бути додана до функцій та лямбда-функцій. На даний час існує лише два вида умов:
restrict(amp): дана умова вказує що функція може бути виконана на акселераторі C++ AMP. Використання умови «restrict(amp)» означає, що компілятор має оцінити можливість виконання даної функції на GPU(перевірити чи не використовуються заборонені інструкції).
restrict(cpu): дана умова вказує що функція може використовувати усі особливості С++, якщо біля функції не стоїть жодної умови то за замовчуванням використовуєтсья умова restrict(cpu).
Приклад використання умови restrict(amp):
void myFunc() restrict(amp)
{
// Код функції
}
Інсталяція та конфігурація
Дана бібліотека є серед бібліотек середовища Microsoft Visual Studio і щоб користуватись нею достатньо просто підключити хедер файл програмно і розширити простір імен. Тому немає потреби у пошуку в інтернеті цієї бібліотеки, її інсталяції і конфігурації.
Приклад використання бібліотеки
#include <iostream>
#include <amp.h>
using namespace std;
using namespace concurrency;
void main()
{
int v[25] = { 'G', 'd', 'k', 'k', 'n', 31, 'e', 'q', 'n', 'l', 31, 'o', 'a', 'q', 'a', 'k', 'k', 'd', 'k', 31, 'v', 'n', 'q', 'k', 'c' };
array_view<int> av(25, v);
parallel_for_each(av.extent, [=](index<1> idx) restrict(amp)
{
if (av[idx] != 'a') av[idx] += 1;
});
for (unsigned int i = 0; i < 25; i++) cout << (char)av[i];
cout << endl;
system("pause");
}
/
Висновок
Бібліотека містить усі необхідні функції для виконання паралельних обчислень.
Дані які обробляються в середині операторів розпаралелення, мають закритий характер, а саме є можливість опрацювання типів amp бібліотеки, за вчасно передавши дані з простих змінних, і не можливість звичних опрацювань змішання з стандартними типами (змінні типу, які містяться в бібліотеці – з простими змінними стандартних типів, звичайним способом не можливо об’єднати) і в середині оператора потрібно виконати усі необхідні дії, а вже окремо виконати вивід результатів, це можна вважати перевагою бібліотеки.
Недолік є у тому, що потрібні хороші знання бібліотеки, щоб якісно написати паралельну програму. Бібліотека складніша у розумінні ніж подібні бібліотеки розпаралелення, і відповідно складніше написати код або перевести код, що забирає більше затрат часу.
Використані джерела
1. Book: C++ AMP : Language and Programming Model
2. https://msdn.microsoft.com/ru-ru/magazine/hh882446.aspx
3. http://opencl.ru/node/25