Оператор sections
Оператор sections определяет набор программных конструкций не итерационного типа (т.е. не цикл), которые делятся между нитями в группе. Каждая секция выполняется каждой нитью один раз. Синтаксис директивы sections: #pragma omp sections [оператор [оператор]...] { [#pragma omp section] Структурированный блок [#pragma omp section] Структурированный блок … } Оператор может иметь один из следующих типов: private (список) firstprivate (список) lastprivate (список) reduction (операция: список) Nowait Каждой секции операторов предшествует оператор sections. Каждый внутренний блок операторов должен содержать оператор section. Если оператор nowait не указан, то конструкция sections завершится барьерной синхронизацией. Ограничения к применению директивы sections: 1. Оператор section не должен появляться вне оператора sections. 2. Только один оператор nowait может появиться в директиве sections. Пример:каждый блок section выполняется индивидуальной нитью. Если количество нитей равно 3, то выделенные в директиве sections три блока инструкций, определенные директивой section будут выполнены параллельно.
int s=0, p=1; #pragma omp parallel sections { #pragma omp section // блок 1, вычисляющий сумму элементов массива a for (i=0; i<10; i++) { s = s + b[i]; } #pragma omp section // блок 2, вычисляющий сумму элементов массива b for (i=0; i<10; i++) { p = p * b[i]; } #pragma omp section //блок 3, вычисляющий значения элементов массива c for (i=0; i<10; i++) { // как сумму числовых значений элементов массивов a и b c[i] = a[i] + b[i]; } } Пример:каждый блок выводит на экран номер нити, на котором он выполняется. В первом блоке отсутствует директива section, такой синтаксис допускается стандартом OpenMP, но только в первом блоке.
#pragma omp parallel sections { // блок инструкций 1, директива section отсутствует printf ("Hello from thread %d\n", omp_get_thread_num()); #pragma omp section // блок инструкций 2 printf ("Hello from thread %d\n", omp_get_thread_num()); #pragma omp section // блок инструкций 3 printf ("Hello from thread %d\n", omp_get_thread_num()); }
|