Вперед: 3.2.11. Синхронизация нитей. Директива BARRIER
Назад: 3.2.9. Директива ORDERED
К содержанию: Оглавление


3.2.10. Явное управление распределением работы

Рассмотренные директивы показывают, что в OpenMP имеется широкий набор средств для автоматического распределения работы между нитями в параллельных областях. Однако не всегда алгоритмы укладываются в стандартные шаблоны. Для распределения работ между нитями можно использовать подход, который применяется при программировании для систем с распределенной памятью. Точно так же, как процессы в MPI, нити в параллельной области нумеруются от 0 до n-1, где n - количество нитей в параллельной области. С помощью специальной функции omp_get_thread_num() каждая нить может получить свой уникальный номер, а с помощью функции omp_get_num_threads() - общее число нитей в параллельной области. Использование функций omp_get_thread_num() и omp_get_num_threads() позволяет назначить каждой нити свой фрагмент кода для выполнения или блок данных для обработки, и таким образом распределить работу между нитями в стиле MPI.

Программа get.c

 #include <stdio.h>
 #include <omp.h>
 int main(int argc, char *argv[])
 {
 int count, num;
 #pragma omp parallel
 {
 count=omp_get_num_threads();
 num=omp_get_thread_num();
 if (num == 0) printf("Всего нитей: %d\n", count);
 else printf("Нить номер %d\n", num);
 }
 }

Программа get.f

 program get
include "omp_lib.h"
integer count, num
!$omp parallel
count=omp_get_num_threads()
num=omp_get_thread_num()
if (num .eq. 0) then
print *, "Всего нитей: ", count
else
print *, "Нить номер ", num
end if
!$omp end parallel
   end

В данном примере нить с номером 0 печатает общее количество нитей, а остальные нити - свой порядковый номер.



Вперед: 3.2.11. Синхронизация нитей. Директива BARRIER
Назад: 3.2.9. Директива ORDERED
К содержанию: Оглавление