1 ...7 8 9 11 12 13 ...19 Рис. 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).
Теперь можно немного отдышаться и рассмотреть результаты работы.
При входе в параллельную область каждая локальная копия переменной Sполучила нулевое значение. На каждой итерации цикла к ней прибавляли по единичке.
Нулевой и первый потоки получили в своё распоряжение по семь итераций, второй поток — шесть. Так что работу поделили почти поровну.
После выхода из параллельной области частичные суммы сложили, да ещё к этой сумме добавили первоначальное значение 10:
S = 7 +7 +6 +10 = 30.
Так работает редукция в параллельном цикле for.
Рис. 4.24. Изменение локальных копий
Задание.Составьте программу (рис. 4.23) и изучите поведение локальных копий общей переменной при распараллеливании цикла с редукцией.
4.3. Вычислительная нагрузка
В этом разделе мы познакомимся с тем, как распределяется вычислительная нагрузка между виртуальными процессорами. Проще говоря, между ядрами процессора.
Наша конечная цель — загрузить все ядра работой на 100%. Только тогда можно будет измерить эффективность распараллеливания.
Первый эксперимент — полная загрузка процессора.
Чтобы обеспечить работой все вычислительные элементы процессора, сделаем побольше итераций в нашем цикле. А для этого придётся взять другой целый тип счётчика — «длинное-длинное целое»:
long long.
Это восемь байт, или 8 * 8 = 64 бита. Максимальное значение соответствует 2 64. Для целого числа со знаком получится раза в два поменьше, но всё равно хорошо.
Текст программы с нашей «большой задачей» приведён на рис. 4.25.
Мы объявляем тип счётчика и суммы (строка 4).
Число итераций нашего цикла берём много, но не больше максимально возможного (строка 7).
Тело цикла — прибавление единичек к сумме (строка 8).
Рис. 4.25. «Большая» задача
Компилируем программу и переходим в командную строку.
Читать дальше
Конец ознакомительного отрывка
Купить книгу