Рассмотрим график. Картина довольно неожиданная. Получается, что ускорение нашей программы не достигает 8 раз на восьми ядрах. Мы не достигли даже ускорения в четыре раза.
В нашей пробной программе мы работали с целыми числами. Складывали единички. Зато мы полностью отработали схему эксперимента и обработки данных. Это пригодится нам в следующем разделе.
Рис. 5.32. Ускорение и эффективность
Задание. Постройте таблицу и графики (рис. 5.32). Сделайте выводы об ускорении программы.
Мы рассмотрели работу параллельной программы, которой потоки выполняются на любых ядрах. К тому же, операционная система норовит перебрасывать потоки с одного ядра на другое.
Интересно, что будет, если привязать каждый поток к своему ядру? Станет ли от этого программа работать быстрее?
Задание. Добавьте в программу параллельного суммирования привязку потоков к ядрам. Повторите исследование и выясните, как влияет привязка к ядрам на ускорение расчётов.
6. Численное интегрирование
Мы рассмотрели основы распараллеливания. Можем переходить к решению более реалистичной задачи.
Посмотрим, как покажет себя компьютер на задаче численного интегрирования. Там придётся работать с вещественными числами. А ведь операции с плавающей точкой выполняются гораздо дольше.
Мы рассмотрели основы распараллеливания. Можем переходить к решению более реалистичной задачи.
Посмотрим, как покажет себя компьютер на задаче численного интегрирования. Там придётся работать с вещественными числами. А ведь операции с плавающей точкой выполняются гораздо дольше.
6.1. Варианты заданий
В данной работе мы продолжаем рассматривать задачу численного интегрирования методом прямоугольников.
Формула приводится на рис. 6.1.
Рис. 6.1. Определённый интеграл
Мы используем те же самые варианты заданий, что и предыдущей работе (рис. 6.2).
Рис. 6.2. Варианты заданий
Номер варианта последняя цифра номера зачётки. Для цифры ноль берём десятый вариант
Нам предстоит выбрать приемлемую продолжительность расчетов и определить ускорение и эффективность для различного числа потоков. Как и в предыдущих разделах, мы будем использовать в расчётах среднее время вычислений по нескольким запускам программы.
Задание. Опишите в отчёте свой вариант задания.
6.2. Аналитическое решение
Мы будем определять значение определенного интеграла с помощью аналитических и численных методов.
В предыдущей работе [1] мы разработали и отладили программу. Теперь можно сосредоточиться на исследовании эффективности распараллеливания и не углубляться в тонкости программирования как такового.
В предыдущей работе мы уже выполнили следующие этапы:
аналитическое решение задачи;
последовательная программа;
параллельные потоки.
В данной работе мы исследуем технологию автоматического создания параллельных потоков.
Точное аналитическое решение используется в дальнейшем для определения погрешности вычислений.
Задание. Запишите в отчёте аналитическое решение задачи формулы и найденное значение.
6.3. Последовательная программа
Первый этап данной работы последовательная программа численного интегрирования. Вычислим значение определенного интеграла, задавая разные значения числа прямоугольников и числа потоков.
6.3.1. Одинарная точность
В этом разделе мы исследуем точность вычислений при использовании чисел одинарной точности.
Напомним, что тип float может обеспечить всего 7 десятичных разрядов для значащей части числа (мантиссы).
При численном интегрировании это приводит к потере точности. Когда значение накопленной суммы больше нового слагаемого в десять миллионов раз, значение практически полностью оказывается за пределами разрядной сетки. Новое число просто теряется, и сумма перестаёт расти. Таким образом, начиная с десяти миллионов итераций можно ожидать существенный рост ошибки.
Составим последовательную программу (рис. 6.3). Здесь мы используем приёмы, успешно отработанные в предыдущих разделах.
Вводим число итераций через параметр командной строки (строка 5).
Объявляем переменные одинарной точности типа float (строка 9).
Преобразуем вводимую строку символов в длинное целое (строка 10).
Время вычислений определим через библиотечную функцию OpenMP (строки 11 и 18).
Вычисляем шаг по оси «иксов» (строка 12).
На каждом шаге вычислений находим текущее значение аргумента функции (строка 14).
Прибавляем новое значение функции в середине очередного интервала по «икс» (строка 15).
После завершения цикла умножаем сумму значений функции на длину интервала, то есть на основание прямоугольника (строка 17).
В конце программы выводим на экран значения числа итераций, полученную оценку интеграла и время вычислений (строка 19). Значения разделяем символом табуляции. Так будет легче загрузить результаты в Excel.
Рис. 6.3. Последовательная программа
Задание. Составьте программу (рис. 6.3) для своего варианта задания. Проверьте работу программы в командной строке, задавая разное количество итераций.
Запустим программу через пакетный файл (рис. 6.4).
Запустим программу через пакетный файл (рис. 6.4).
Мы используем почти логарифмическое приращение числа итераций. Это позволит нам подробно рассмотреть начало графика и быстрой пройтись по большим значениям.