Приклади з розподіленими масивами
Вступ
Розподіл даних по процесам призначений для прискорення рахунку та економії пам'яті. Паралельні обчислення з використанням розподілених масивів докладно описані на сайті Matlab, зокрема, у підрозділі Working with Codistributed Arrays.
Можливий доступ до будь-якого сегменту розподіленого масиву. Доступ до локального сегменту буде швидше, ніж до віддаленого, оскільки останній вимагає посилки (функція labSend) та отримання (функція labReceive) даних між процесами. Вміст розподіленого масиву можна зібрати за допомогою функції gather в один локальний масив, продублювавши його на всіх процесах або розмістивши тільки на одному процесі.
Використання розподілених масивів при паралельних обчисленнях скорочує час рахунку завдяки тому, що кожен процес обробляє свою локальну порцію вихідного масиву (сегмент розподіленого масиву).
Існує 3 способи створення розподіленого масиву (див. Creating a Codistributed Array): 1) розподіл вихідного масиву на частини, 2) побудова з локальних частин (менших масивів), 3) використання вбудованих функцій Matlab ( типу rand, zeros, .).
1) Розподіл масиву на частини може бути реалізований за допомогою функції codistributed (Приклад 1). При цьому робочої області кожного процесу розташовані вихідний масив у своєму повному обсязі і відповідний сегмент розподіленого масиву. Таким чином, цей спосіб хороший за наявності достатнього місця в пам'яті для зберігання вихідного масиву, що тиражується (replicated). Розмірності вихідного та розподіленого масивів збігаються.
Розподіл масиву може бути зроблено за будь-яким з його вимірювань. За умовчанням у разі двовимірного масиву проводиться горизонтальне розбиття, тобто. постовпцям, що виглядає природно з урахуванням прийнятого в системі Matlab розміщення матриць у пам'яті стовпчиками (як у Фортрані).
2) При побудові розподіленого масиву з локальних частин як сегмент розподіленого масиву береться масив, що зберігається в робочій області кожного процесу (Приклад 2). Таким чином, розподілений масив сприймається як об'єднання локальних масивів. Вимоги до пам'яті у разі скорочуються.
3) Для вбудованих функцій Matlab (типу rand, zeros, .) можна створювати розподілений масив будь-якого розміру за один крок (див. Using MATLAB Constructor Functions).
ВгоруЯк можна використовувати розподілені масиви
У прикладах, що наводяться нижче, рішення задачі пов'язане з обчисленням значень деякої функції, позначеної my_func . При цьомуобчислення одного значення функції потребує тривалого часу.
Надаються можливі схеми вирішення таких завдань з використанням розподілених масивів. Показано перехід від вихідної послідовної програми до паралельної з розподіленими обчисленнями. Відповідні зміни виділені.Зауваження. Хоча дистрибутивні масиви сумісні (на відміну від циклу parfor та GPU) з глобальними змінними, необхідно ретельно стежити за тим, щоб зміни глобальних змінних у процесі обробки однієї порції даних не впливали на результати обробки інших порцій, забезпечуючи тим самим незалежність обчислень частин дистрибутивних масивів. Там, де допустимо, простіше використовувати цикл parfor або обчислення наGPU.
ВгоруПриклад 1. Розподіл масиву на частини
Нехай потрібно обчислити значення деякої функції 10 речових змінних. Аргументом функції є 10-мірний вектор. Значення функції необхіднеобчислити для n точок (значень аргументу), заданих 10хn матрицею. Обчислення матриці здійснюється за деяким заданим алгоритмом і не вимагає багато часу.
Позначення. my_func - обчислювана функція М - масив для аргументів функції my_func F - масив для значень функції my_func M_distr - розподілений масив для M (тої ж розмірності) F_distr - розподілений масив для F (Тієї ж розмірності)
ВгоруПриклад 2. Побудова масиву частин. Розподілений масив як об'єднання локальних масивів
Сформувати таблицю значень функції 2-х речових змінних ( (x, y) -- F) на прямокутній сітці розміру 120x200, заданої векторами ( x1: x2: x3 і y1: y2: y3 ). Існує алгоритм обчислення значення функції у точці, позначений my_func.
Позначення. my_func - обчислювана функція 2-х змінних F - масив для значень функції my_func F_loc - локальний масив, який заповнюється відповідними значеннями функції на кожному процесі і потім береться за основу (розглядається як сегмент) при побудові розподіленого масиву F_distr F_distr - розподілений масив, вміст якого збирається в масиві F на 1-му процесі
Варіант 1. Розпаралелювання проводиться за зовнішнім циклом (по x - першому індексу). Передбачається, що число рядків 120 кратно numlabs - числу процесів, замовлених при запуску програми на рахунок.
Варіант 2. Розпаралелювання проводиться за внутрішнім циклом (по y - другому індексу). Передбачається, що число стовпців 200 кратно numlabs - числу процесів, замовлених при запуску програми на рахунок.
Зауваження. Це завдання, якщо пам'яті достатньо, можна запрограмувати першим способом, тобто. шляхом поділу великого масиву на частини. У цьому випадку розподіл даних по процесах буде зроблено автоматично (вимоги кратності зникають).
ВгоруЯк переконатися у працездатності програми
Перед першим запуском програми-функції на кластері її варто перевірити спочатку уоднопроцесорному варіанті з налагоджувачемDebug (див., наприклад, Debug a MATLAB Program), а потім у паралельному режиміpmode. Оскількиполітика використання обчислювальних ресурсів ІММ УрО РАН не передбачає тривалих обчислень на комп'ютері, що управляє, запускати програму в режимахDebug іpmode слід з тестовим набором даних.
Отже, рекомендується наступна послідовність виходу на рахунок:Debugpmode кластер
Стартувати режимpmode на 4-х процесах (для наочності) можна у вікні Matlab (Command Window) за допомогою команди pmode start 4 Потім у командному рядку паралельного вікна, що відкрилося (Parallel Command Window) викликати власну програму. Закрити паралельний режим можна або з паралельного вікна командою exit або з вікна Matlab командою pmode exit Для контролю за даними корисна функція getLocalPart .
Запуск на кластері можна здійснити у вікні Matlab за допомогою функції imm_sch.