1 ...6 7 8 10 11 12 ...19
Более грамотный стиль параллельного программирования включает использование специальных возможностей. Мы рассмотрим одну из них.
При параллельном решении большой задачи возникает проблема «сбора промежуточных (частичных) сумм». Каждый поток обсчитывает свою часть задачи и получает часть общей суммы. После этого нужно собрать все частичные суммы и сложить их. Такая операция нужна очень часто. Поэтому была разработана готовая процедура «редукции».
Английское слово REDUCTION в данном конкретном случае означает «сворачивание, собирание, соединение, объединение, сведение».
Мы будем использовать параметр reduction в директиве pragma:
#pragma omp parallel for reduction (+: S).
Эта конструкция позволяет автоматически организовать параллельные вычисление и сбор частичных сумм.
Знак [+]указывает, что будет найдена сумма (есть и другие операции).
S — переменная, с которой будем работать.
Составляем программу (рис. 4.12).
При входе в параллельную область в каждом потоке создаётся локальная копия переменной S. Это механизм напоминает создание локальной переменной внутри подпрограммы. Из других модулей к локальной переменной доступа нет.
Слово ЛОКАЛЬНЫЙ буквально означает «местный, внутренний».
Рис. 4.12. Редукция
Создаём пакетный файл, аналогичный рассмотренному.
Переходим в командное окно и задаём разное количество параллельных потоков.
Запускаем пакетный файл.
Смотрим на результаты (рис. 4.13).
Последовательный запуск даёт правильные результаты.
Рис. 4.13. Последовательный запуск
Задаём несколько потоков.
Запуск тоже даёт правильные результаты (рис. 4.14).
Мы применили редукцию и попутно исключили ситуацию гонки.
Рис. 4.14. Параллельный запуск
Задание.Запустите параллельную программу с разным количеством потоков и изучите полученные результаты.
4.2.3. Порядок выполнения потоков
Следующий эксперимент — изучим порядок запуска и выполнения параллельных потоков.
Составим программу на основе предыдущих (рис. 4.15). Обратите внимание, что мы временно убрали редукцию из директивы parallel. Все потоки обращаются к одной и той же общей переменной S.
Программа печатает заголовок таблицы (строка 6).
Затем выводит номер потока и значение суммы (строка 10).
Так мы сможем проследить, в каком порядке работает программа.
Рис. 4.15. Порядок потоков
Запускаем программу, получаем таблицу (рис. 4.16).
Как видим, номера потоков печаются в случайном порядке.
Рис. 4.16. Порядок потоков
Задание. Создайте программу (рис. 4.15) и запустите её. Обратите внимание на порядок выполнения потоков.
Перейдём в командное окно.
Запускаем нашу программу и направим вывод в файл — вместо вывода на экран:
omp-10-order> order. txt.
Эта манипуляция называется «перенаправление стандартного вывода». Экран — это стандартное устройство вывода, с которым работает функция printf. Вместо экрана, весь текстовый вывод отправляется в файл.
Итак, теперь вся таблица вместе с заголовком записана в текстовый файл. Открываем файл в Блокнотеи убеждаемся в том, что вся информация здесь (рис. 4.17).
Рис. 4.17. Вывод в файл
Задание.Запустите программу и направьте вывод в файл. Откройте файл в Блокноте и изучите его содержимое.
Загрузим текстовый файл для анализа в электронную таблицу.
Запускаем Excel. Вызываем в верхнем меню открытие файла:
File — Open — Other locations — Browse.
Переходим в каталог Release и находим текстовый файл: order. txt.
Устанавливаем загрузку текстовых файлов:
Text Files (*prn, *.txt, *csv).
В правой части окна видим содержимое файла (рис. 4.18).
Нажимаем ОК.
Рис. 4.18. Загрузка файла
В окне Мастера импорта файла настраиваем параметры:
Original data type — Delimited;
My data has headers(рис. 4.19).
Нажимаем Next.
Рис. 4.19. Первый шаг импорта
На втором шаге импорта указываем разделитель полей — символ табуляции:
Delimiters — Tab.
Вспоминаем, что при выводе на экран мы использовали табуляцию.
Нажимаем Next(рис. 4.20).
Рис. 4.20. Второй шаг импорта
После импорта файла получаем таблицу в Excel(рис. 4.21).
Выделяем диапазон ячеек — заголовок и данные.
Выбираем в верхнем меню форматирование таблицы:
Home — Styles — Format as Table.
Выбираем оформление таблицы.
Читать дальше
Конец ознакомительного отрывка
Купить книгу