Валентин Юльевич Арьков - Организация параллельных потоков. Часть 2 стр 13.

Шрифт
Фон

Щелкаем по полю Sum of Tomp в области значений Values и выбираем в выпадающем меню Value Field Settings (рис. 5.24).


Рис. 5.24. Настройка значений


В диалоговом окне Value Field Settings выбираем вычисление среднего значения:

Summarize value field by  Average.

Настраиваем вычисления среднего для обоих отсчётов времени.

Убеждаемся, что в сводной таблице появились средние вместо сумм (рис. 5.25).


Рис. 5.25. Вычисление среднего


Задание. Настройте сводную таблицу, как описано выше.


Мы определили среднее время выполнения программы.

Сравним измерения времени, полученные двумя разными библиотечными функциями  Windows и OpenMP.

Найдём разность (Twin  Tomp) и выразим её в процентах от Tomp (рис. 5.26).

Поскольку мы ссылаемся на ячейки сводной таблицы, в формуле появляется вызов специальной функции

GETPIVOTDATA

При этом мы не можем копировать формулы. Нам придётся ввести формулы во все ячейки вручную.


Рис. 5.26. Оценка погрешности


Построим график в логарифмическом масштабе (рис. 5.27).

По оси «иксов»  логарифм числа итераций.

По оси «игреков»  логарифм времени выполнения.

Настраиваем масштаб по осям так, чтобы всё поле графика было занято нами данными.

Устанавливаем цвет маркеров и линий.

Можно видеть, что начиная с 108 начинается практически прямая линия.

Так что в дальнейших опытах можно ограничиться меньшим количеством вычислений.


Рис. 5.27. Логарифмический масштаб


Задание. Сравните оценки времени выполнения, полученные разными способами.

5.5.3. Организация экспериментов

Нам предстоит провести несколько экспериментов. В этом разделе и в следующих разделах. И в следующих работах тоже. Мы много раз запустим одну и ту же программу. С разными настройками. На разном количестве ядер. Затем мы обработаем результаты и сделаем свои выводы.


Сейчас нас интересует ускорение параллельной программы.

Немного упростим предыдущий вариант параллельного суммирования. Пусть всё делается автоматически.

Текст программы приводится на рис.5.28.

В командной строке вводим количество параллельных потоков (строка 5).

Преобразуем введённую строку в целое число (строка 10).

Задаём число потоков в параметрах директивы parallel (строка 12).

Мы выбрали постоянное количество итераций в цикле. Пусть это будет совсем небольшое число. Всего несколько миллиардов (строка 13).

Определяем продолжительность расчётов (строки 11 и 15). Для используем библиотечную функцию omp_get_wtime. Мы уже убедились в точности её работы.

В конце программы выводим на экран число потоков, полученную сумму и время работы (строка 16).

Сумма должна быть всегда одна и та же. Это просто проверка правильности работы программы. На всякий случай. Если не выводить результат работы S на экран и никак его не использовать, компилятор может немного оптимизировать нашу программу. За ним нужен глаз да глаз.

КОНЕЦ ОЗНАКОМИТЕЛЬНОГО ОТРЫВКА

Рис.5.28. Параллельное суммирование


Задание. Составьте программу (рис. 5.28).


Программа готова.

Незабываем выбрать конфигурацию Release и включить поддержку OpenMP.

Скомпилируем её:

Build  Build Solution.

Исполняемый файл готов.

Создаём пакетный файл для многократного запуска с разным числом потоков (рис. 5.29).

Мы уже познакомились с использованием цикла в пакетных файлах.

Отключаем вывод команд на экран.

Выводим заголовок таблицы.

Далее вызываем по пять прогонов с числом потоков от одного до двенадцати.

Это решение задачи «в лоб».

Немного громоздко, но работоспособно.


Рис. 5.29. Пакетный файл


Задание. Составьте пакетный файл (рис. 5.29).


На самом деле, мы можем организовать вложенные циклы. Ведь пакетный файл  это язык программирования. Почти как настоящий.

В результате у нас осталось всего три строчки в нашем пакетном файле (рис. 5.30). Такой файл легко отлаживать. Меньше шансов ошибиться.


Рис. 5.30. Вложенные циклы


Задание. Составьте пакетный файл (рис. 5.30).


Переходим в командную строку.

Меняем текущий диск и каталог.

Запускаем наш пакетный файл и перенаправляем вывод в файл:

19> 19.txt.

Мы называем пакетный и текстовый файл одинаково просто чтобы немного запутать читателя.

Загружаем полученный текстовый файл в Excel.

Обрабатываем данные с помощью сводной таблицы.

Строим график изменения времени выполнения от числа потоков (рис. 5.31).

Как ни странно, скорость работы почти не меняется, начиная с четырёх потоков.


Рис.5.31.


Задание. Загрузите данные в Excel и постройте график (рис. 5.31).


Теперь наконец-то мы сможем найти показатели ускорения и эффективности.

У нас есть число потоков и время выполнения.

Будем считать, что число потоков равно числу логических процессоров. Мы притворимся, что запускали программу с р потоков на р процессорах.

Для дальнейших расчётов мы выделим сводную таблицу и скопируем её в буфер обмена. Затем мы вставим её на свободном месте листа  но только как значения:

Paste Options  Values.

Добавим столбцы показателей Sp и Ep (рис. 5.32).

Мы сравниваем длительность работы параллельной программы с последовательной. Поэтому в формулах для расчёта ускорения мы фиксируем адрес первой ячейки E18, нажав клавишу F4. За счёт этого мы можем копировать нашу формулу в остальные ячейки столбца.

Строим графики ускорения и эффективности в зависимости от числа потоков (и ядер).

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub ios.epub fb3