Розпаралелювання програми за допомогою openmp

OpenMP - бібліотека для мов програмування Fortran, C, C ++, що дозволяє запускати паралельно ділянки коду на багатопроцесорних системах або процесорах з HyperThreading. Вбудована в компілятор gcc починаючи з версії 4.2. Розробляється за активної участі Intel, за що їм велике спасибі.

Кілька правил по активації даного режиму:

Розпаралелювання можна ввести на ділянку програми, тобто певний блок буде виконуватися кілька разів (задається користувачем) або для циклів for. На першому випадку ми зупинятися не будемо, про це можна прочитати в презентації OpenMP_talk. торкнемося лише розпаралелювання циклів.

В даному прикладі цикл for буде виконуватися в два потоки, при цьому не можна заздалегідь визначити в якій послідовності значень змінної i буде відбувається виконання тіла циклу. Таким чином, необхідно позбутися від залежності від попереднього кроку.

Наприклад, якщо у вас є такий цикл:

Те його потрібно перетворити до вигляду:

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

Мінлива ave накопичує значення і залежить від ітерації. Якщо ви запустите програму в паралельному режимі, то можете отримувати різні відповіді. Як я розумію, справа в тому, що щоб додати до змінної ave значення A [i]. з пам'яті в регістр процесора копіюється значення ave. підсумовується, а потім нове значення записується в ділянку пам'яті цієї змінної. У проміжку між зчитуванням і записом інший процес може записати нове підсумкова значення, яке потім буде втрачено і не враховано.

Облік такого випадку називається reduction і оголошується наступним чином для змінних:

Після чого для кожної змінної list створюється локальна копія і инициализируется згідно операції op - +, *, - (дивно, а / ні) 0, 1, 0 відповідно. Після обчислення ця локальна копія комбінується з глобальної змінної.

Таким чином, коректна запис попереднього прикладу виглядає наступним чином:

Якщо ви хочете використовувати генератор випадкових чисел всередині циклу, який йде на розпаралелювання, то потрібно бути дуже уважним, тому що якщо для цього використовується задається послідовність псевдовипадкових чисел, то вони можуть перекриватися між собою. Детально про це написано в OpenMP_talk.

Отже, ви готові до програмування розпаралелювання циклів. Основні правила - позбутися від залежностей від ітерації, бажано використовувати всередині циклів тільки локальні змінні циклу, уважно стежити за привласнення глобальних змінних (виділяти ці випадки як reduction). Обов'язково порівняйте результати до і після.

Увага! У мене виникли складності при створенні і видаленні динамічних об'єктів всередині циклу, так що рекомендую виносити дані операції за його межі.

Оптимальною роботи вашого комп'ютера!

Схожі статті