Додаткові можливості openmp
2.3 Додаткові можливості OpenMP
Змінні середовища і допоміжні функції
Перед запуском програми кількість ниток, що виконують паралельну область, можна задати, визначивши значення змінної середовища OMP_NUM_THREADS. Значення за замовчуванням змінної OMP_NUM_THREADS залежить від реалізації. З програми її можна змінити за допомогою виклику функції omp_set_num_threads ().
void omp_set_num_threads (int num)
Наступний приклад демонструє застосування функції omp_set_num_threads () і опції num_threads. Перед першою паралельної областю викликом функції omp_set_num_threads (2) виставляється кількість ниток, рівне 2. Але до першої паралельної області застосовується опція num_threads (3). яка вказує, що дану область слід виконувати трьома нитками. Отже, повідомлення "Паралельна область 1" буде виведено трьома нитками. До другої паралельної області опція num_threads не застосовується, тому діє значення, встановлене функцією omp_set_num_threads (2). і повідомлення "Паралельна область 2" буде виведено двома нитками.
У деяких випадках система може динамічно змінювати кількість ниток, використовуваних для виконання паралельної області, наприклад, для оптимізації використання ресурсів системи. Це дозволено робити, якщо змінна середовища OMP_DYNAMIC встановлена в true. У системах з динамічною зміною кількості ниток значення за замовчуванням не визначено, інакше значення за замовчуванням: false. Змінну OMP_DYNAMIC можна встановити за допомогою функції omp_set_dynamic ().
void omp_set_dynamic (int num)
Як значення параметра функції omp_set_dynamic () задається 0 або 1. Якщо система не підтримує динамічна зміна кількості ниток, то при виконанні функції omp_set_dynamic () значення змінної OMP_DYNAMIC не зміниться. Дізнатися значення змінної OMP_DYNAMIC можна за допомогою функції omp_get_dynamic ().
int omp_get_dynamic (void)
Наступний приклад демонструє застосування функцій omp_set_dynamic () і omp_get_dynamic (). Спочатку роздруковується значення, отримане функцією omp_get_dynamic () - це дозволяє дізнатися значення змінної OMP_DYNAMIC за замовчуванням. Потім за допомогою функції omp_set_dynamic () змінна OMP_DYNAMIC встановлюється в true. що підтверджує видача ще один раз значення функції omp_get_dynamic (). Потім породжується паралельна область, виконувана заданою кількістю ниток (128). У паралельній області друкується реальне число виконують її ниток. Директива master дозволяє забезпечити друк тільки процесом-майстром. У системах з динамічною зміною числа ниток видане значення може відрізнятися від заданого (128).
# include
# include
int main (int argc. char * argv [])
<
printf ( "Значення OMP_DYNAMIC.% d \ n". omp_get_dynamic ());
omp_set_dynamic (1);
printf ( "Значення OMP_DYNAMIC.% d \ n". omp_get_dynamic ());
# Pragma omp parallel num_threads (128)
<
# Pragma omp master
<
printf ( "Паралельна область.% d ниток \ n".
omp_get_num_threads ());
>
>
>
Функція omp_get_max_threads () повертає максимально допустиму кількість ниток для використання в наступній паралельної області.
int omp_get_max_threads (void)
Функція omp_get_num_procs () повертає кількість процесорів, доступних для використання програмою користувача на момент виклику. Потрібно враховувати, що кількість доступних процесорів може динамічно змінюватися.
int omp_get_num_procs (void)
Паралельні області можуть бути вкладеними; за замовчуванням вкладена паралельна область виконується однією ниткою. Це управляється установкою змінного середовища OMP_NESTED. Змінити значення змінної OMP_NESTED можна за допомогою виклику функції omp_set_nested ().
void omp_set_nested (int nested)
Функція omp_set_nested () дозволяє або забороняє вкладений паралелізм. Як значення параметра задається 0 або 1. Якщо вкладений паралелізм дозволений, то кожна нитка, в якій зустрінеться опис паралельної області, породить для її виконання нову групу ниток. Сама породила нитка стане в новій групі ниткою-майстром. Якщо система не підтримує вкладений паралелізм, ця функція не буде мати ефекту.
Наступний приклад демонструє використання вкладених паралельних областей і функції omp_set_nested (). Виклик функції omp_set_nested () перед першою частиною дозволяє використання вкладених паралельних областей. Для визначення номера нитки в поточній паралельної секції використовуються виклики функції omp_get_thread_num (). Кожна нитка зовнішньої паралельної області породить нові нитки, кожна з яких надрукує свій номер разом з номером породила нитки. Далі виклик omp_set_nested () забороняє використання вкладених паралельних областей. У другій частині вкладена паралельна область буде виконуватися без породження нових ниток, що і видно по одержуваної видачі.
Дізнатися значення змінної OMP_NESTED можна за допомогою функції omp_get_nested ().
int omp_get_nested (void)
Функція omp_in_parallel () повертає 1, якщо вона була викликана з активною паралельної області програми.
int omp_in_parallel (void)
Наступний приклад ілюструє застосування функції omp_in_parallel (). Функція mode демонструє зміну функціональності в залежності від того, викликана вона з послідовною або з паралельної області. У послідовній області буде надруковано "Послідовна область а в паралельній -" Паралельна область ".
Вимірювання часу
Повертає витрачений час в секундах:
double omp_get_wtime (void);
Повертає точність таймера, використовуваного попередньої описаної функцією:
double omp_get_wtick (void);