Здавалка
Главная | Обратная связь

Структурированный блок



[#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 Все права принадлежат авторам размещенных материалов.