Структурированный блок
[#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()); }
Оператор single Операторsingle определяет структурированный блок операторов, который выполняется только одной нитью в группе (не обязательно основной нитью). Такой участок кода будет выполнен нитью, первой дошедшей в данную точку программы.
Синтаксис директивы single: #pragma omp single [оператор [оператор] ...] Структурированный блок Операторможет иметь один из следующих типов: private(список) firstprivate(список) Nowait
Если nowait не указан, то single завершится неявной барьерной синхронизацией. В операторе single может использоваться только один оператор nowait. Пример: каждый блок инструкций выполняется только одной нитью. Количество нитей, используемых для выполнения программы равно 3. В начале конструкции каждая нить выводит сообщение о создании и свой номер.
#pragma omp parallel { printf("Create thread %d\n", omp_get_thread_num()); #pragma omp single { printf("Beginning work1.Thread %d\n", omp_get_thread_num()); work1(); } #pragma omp single printf("Finishing work1. Thread %d\n", omp_get_thread_num());// барьерная //синхронизация, в конструкции отсутствует nowait т.е. // блок ожидает окончания работы предыдущего блока #pragma omp single nowait { printf("Beginning work2. Thread %d\n", omp_get_thread_num());// нет барьерной //синхронизации, т.к. в конструкции используется nowait work2(); } } Лекция 10 ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|