Организация параллельных потоков. Часть 2 | страница 11
4. Управление распараллеливанием
Мы познакомились с основными инструментами создания параллельных программ. Теперь немного углубимся в управление параллельными потоками.
4.1. Вычислительная среда
Чтобы эффективно распараллелить решение задачи, нужно разделить большую задачу на части и раздать эти части параллельным потокам. При этом и главный поток, и каждый поток в группе должны в момент выполнения сориентироваться в обстановке. Нам нужно изнутри программы получить определённые сведения, например, такие:
— число процессоров в компьютере;
— число потоков в группе;
— номер текущего потока в группе.
4.1.1. Число процессоров
Начнём с числа процессоров.
Напомним, что слово «процессор» в нашем случае — это указание на «виртуальный процессор». Другими словами, это любой вычислительный элемент, который может выполнять один поток. Физическая реализация сейчас не важна.
Число «процессоров» можно узнать с помощью библиотечной функции
int omp_get_num_procs (void).
Функция возвращает количество доступных процессоров. Доступных именно нашей программе, а точнее ПРОЦЕССУ. В предыдущей работе мы уже немного познакомились с привязкой процесса к конкретным ядрам.
Создадим новую программу и познакомимся с описанной функцией (рис. 4.1).
Рис. 4.1. Число доступных процессоров
Запускаем программу и видим сообщение (рис. 4.2).
Убеждаемся, что заявленное число процессоров соответствует действительности.
Рис. 4.2. Число процессоров
Задание. Создайте и запустите программу (рис. 4.1). Проверьте, как изменится сообщение программы, если установить число процессоров через параметр окружения NUMBER_OF_PROCESSORS и запустить программу в командной строке.
4.1.2. Число потоков
Рассмотрим, как узнать число потоков в текущей параллельной области программы.
Для организации параллельной работы нужно знать, на сколько частей делить задачу. И вообще, надо следить за событиями. Даже если всё как бы само собой делается, за результаты отвечает почему-то не компьютер, а программист.
Итак, вот библиотечная функция, которая сообщает нам количество параллельных потоков в группе:
int omp_get_num_threads (void).
Расшифровывается название так:
Number of Threads — «число потоков».
Аргументов у функции нет, но скобки при вызове придётся использовать.
Вторая полезная библиотечная функция сообщает номер текущего потока в группе:
int omp_get_thread_num (void).
Название расшифровывается так:
Thread Number — «номер потока».
Номера потоков начинаются с нуля. Это будет главный поток.