3.4 Варианты распределения работы между нитями 3.4.1 Низкоуровневое программирование Все нити в параллельной области нумеруются последовательными
целыми числами от 0 до N-1, где N — количество нитей, выполняющих
данную область.
Можно программировать на самом низком уровне, распределяя
работу
с
помощью
функций
omp_get_thread_num() и
omp_get_num_threads(), возвращающих номер нити и общее количество
порождённых нитей в текущей параллельной области, соответственно.
Вызов функции omp_get_thread_num()позволяет нити получить
свой уникальный номер в текущей параллельной области.
Вызов функции omp_get_num_threads() позволяет нити получить
количество нитей в текущей параллельной области.
Использование
функций
omp_get_thread_num() и
omp_get_num_threads()позволяет назначать каждой нити свой кусок кода
для выполнения. Однако использование этого стиля программирования в
OpenMP далеко не всегда оправдано – разработчик в этом случае должен
явно организовывать синхронизацию доступа к общим данным [11].
Пример 3.10. #include #include int main() {
60
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); } return 0; } В данном примере в параллельной области определен условный
оператор, в результате выполнения которого главный поток выведет на
экран количество нитей, а остальные потоки свой номер.