Рассмотренные директивы показывают, что в 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 печатает общее количество нитей, а остальные нити - свой порядковый номер.