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