Организация параллельных потоков. Часть 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).

На экран дополнительно выводим столбец значений счётчика цикла (строки 6, 10, 12).

После завершения цикла в колонке значений счётчика выводим число 20 (строка 12). Обратим внимание, что при выполнении цикла счётчик принимает значения от до 19.


Рис. 4.23. Отслеживание инициализации


Далее проделаем знакомые нам шаги по выполнению программы и анализу результатов в Excel.

Компилируем программу и убеждаемся в отсутствии ошибок.

Переходим в командное окно.

Задаём три потока:

set OMP_NUM_THREADS=3.

Запускаем программу на выполнение.

Перенаправляем вывод в текстовый файл.

Загружаем файл в Excel.

Форматируем таблицу и сортируем по номеру потока (рис. 4.24).

Теперь можно немного отдышаться и рассмотреть результаты работы.

При входе в параллельную область каждая локальная копия переменной