Користувальницькькі налаштування

Налаштування сайту


openmp

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

openmp [2016/09/14 21:03] (поточний)
wombat створено
Рядок 1: Рядок 1:
 +====== OpenMP ======
  
 +Якщо в програмі є деякий порівняно великий блок, що потребує паралельного виконання,​ зручно спочатку просто позначити цей блок:
 +
 +<code c>
 +#pragma omp parallel default(shared) private(i)
 +{
 +    ​
 +}
 +</​code>​
 +
 +
 +
 +===== Цикл for =====
 +
 +<code c>
 +#pragma omp for
 +for (i=0; i<12; i++) {}
 +</​code>​
 +
 +
 +===== Розмір порції =====
 +
 +Розділення завдання на порції для кожного потоку залежить від реалізації. Часто все завдання просто ділиться на стільки послідовних частин,​ скільки потоків,​ і кожний потік виконує свою порцію.
 + 
 +{{::​openmp-chunks-default.png?​nolink|}}
 +
 +Це зручно,​ якщо обробка кожної порції потребує приблизно однакового часу, але якщо кожна наступна ітерація циклу виконується довше попередньої (наприклад,​ коли для кожного значення ''​i''​ потрібно обробити дані від ''​0''​ до ''​i''​),​ складається така ситуація,​ коли перший потік вже закінчив свою роботу,​ а останній ще довго працюватиме. Це значно знижує продуктивність. ​
 +
 +{{::​openmp-chunks-progressive.png?​nolink|}}
 +
 +Тому буває корисно встановити невеликий розмір однієї порції вручну таким чином, щоб кожному потоку дісталася приблизно рівноцінна частка навантаження
 +
 +{{::​openmp-chunks-manual.png?​nolink|}}
 +
 +<code c>
 +#pragma omp for schedule(static,​2)
 +for (i=0; i<12; i++) {}
 +</​code>​
 +
 +===== Зведення =====
 +
 +Якщо деяка величина накопичується протягом усього циклу, а після виконання усіх паралельних потоків її необхідно "​зібрати"​ з усіх потоків,​ для цього використовується зведення змінної (reduction):​
 +
 +<code c>
 +#pragma omp for reduction(+:​summa)
 +for (i=0; i<12; i++)
 +{
 +    summa += i;
 +}
 +</​code>​
 +
 +В цьому прикладі після виконання усіх потоків змінну ''​summa''​ буде просто підсумовано,​ і результат збережено у змінній ''​summa''​ головного потоку.
 +
 +====== Компіляція ======
 +
 +  gcc -fopenmp -o program.bin program.c
 +
 +---------------------
 +
 +<code c>
 +#pragma omp critical
 +</​code>​
 +
 +FIXME
openmp.txt · В останнє змінено: 2016/09/14 21:03 by wombat