Организация параллельных потоков. Часть 2 | страница 16
Home — Styles — Format as Table.
Выбираем оформление таблицы.
Рис. 4.21. Таблица из файла
Задание. Загрузите текстовый файл в Excel.
Сортируем таблицу по колонке S (рис. 4.22).
Для этого нажимаем кнопку в виде стрелочки справа от названия столбца. Выбираем в выпадающем списке сортировку по возрастанию:
Sort Smallest to Largest.
Изучаем порядок выполнения потоков.
Наблюдаем совершенно непредсказуемую картину.
Рис. 4.22. Сортировка по S
Задание. Выполните сортировку и изучите порядок выполнения потоков.
4.2.4. Локальные копии переменной
Вернёмся к редукции и рассмотрим локальные копии общей переменной.
Итак, в директиве parallel мы организуем редукцию переменной S путём сложения частичных, промежуточных значений:
reduction (+:S).
Это означает, что при входе в параллельную область создаётся несколько параллельных потоков. В каждом из этих потоков (включая и главный поток) берётся наша общая переменная S и для неё создаётся локальная копия. То есть в каждом потоке появляется своя внутренняя переменная.
Мало того, в момент создания локальная копия ещё и получает начальное значение. Это называется ИНИЦИАЛИЗАЦИЯ — «присвоение начального значения». Если редукция делается путём суммирования, то локальные копии получают нулевое начальное значение.
Немного изменим предыдущею программу (рис. 4.23).
Перед началом параллельной области присвоим общей переменной S начальное значение 10 (строка 5).
Добавляем редукцию для параллельной области (строка 7).
В цикле делаем 20 итераций, чтобы более наглядно показать процесс выполнения программы (строка 8).
После завершения параллельной области и редукции выводим собранное из локальных копий суммарное значение общей переменной S (строка 12).
На экран дополнительно выводим столбец значений счётчика цикла i (строки 6, 10, 12).
После завершения цикла в колонке значений счётчика выводим число 20 (строка 12). Обратим внимание, что при выполнении цикла счётчик принимает значения от 0 до 19.
Рис. 4.23. Отслеживание инициализации
Далее проделаем знакомые нам шаги по выполнению программы и анализу результатов в Excel.
Компилируем программу и убеждаемся в отсутствии ошибок.
Переходим в командное окно.
Задаём три потока:
set OMP_NUM_THREADS=3.
Запускаем программу на выполнение.
Перенаправляем вывод в текстовый файл.
Загружаем файл в Excel.
Форматируем таблицу и сортируем по номеру потока (рис. 4.24).
Теперь можно немного отдышаться и рассмотреть результаты работы.
При входе в параллельную область каждая локальная копия переменной