Найти в Дзене
Pavlov Dmitry

Численное интегрирование в контексте параллельных вычислений

Оглавление

Введение

В данной статье мы поговорим о параллельном программировании. Наверное, нет смысла рассказывать о том, что параллельное программирование, то есть подход использующий все возможности многоядерных процессоров, является ключевым фактором построения быстрых и красивых программ. Более того, в наши дни можно утверждать, что каждый разработчик должен владеть методами параллельного программирования.

Современный процессоры часто имеют несколько ядер, и при наличии большого объема выполняемой работы было бы неправильно поручить всю работу одному ядру, в то время когда остальные ядра простаивают. Подход в программировании, который позволяет выполнять сразу несколько действий в одно и тоже время называется конкурентностью. Параллельная обработка является частным случаем конкурентности и позволяет выполнять большой объем работы за счет распределения ее между несколькими потоками. За счет такого подхода время работы многих алгоритмов сокращается в несколько раз.

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

Приближенные вычисления определенных интегралов. Метод трапеций.

Если f(x) принимает на отрезке [a, b] значения больше или равные нулю, то как известно интеграл представляет собой площадь криволинейной трапеции, ограниченной сверху графиком функции y=f(x), снизу отрезком [a, b], а с боков прямыми x=a и x=b. Метод трапеций состоит в том, чтобы разбить указанный сегмент [a, b] на n равных частей и площадь под кривой на каждом участке заменить площадью трапеции. В этом случае интеграл можно приближенно вычислять с помощью формулы:

Формула трапеций
Формула трапеций

Формула очень проста и легко может быть реализована на каком-либо языке программирования. Отметим, что формула тем точнее, чем больше n. На языке C# ее реализация выглядит следующим образом:

листинг на языке C#
листинг на языке C#

Где Function - некоторый делегат, описывающий функцию одного параметра. Он может быть объявлен следующим образом:

delegate double Function(double x);

Параллельные вычисления

За счет аддитивного свойства интеграла численное интегрирование является хорошим вариантом для демонстрации возможностей параллельного программирования:

Аддитивное свойство интеграла
Аддитивное свойство интеграла

c - произвольная точка в интервале (a, b). Чтобы вычислить исходный интеграл стоящий в левой части, можно разбить его на два и каждый интеграл в правой части вычислять на отдельном ядре процессора. Ниже приводим первый вариант вычисления интеграла в параллельном режиме:

листинг на языке C#
листинг на языке C#

В данной функции используется метод Get, код которого был приведен выше. Приведем еще один вариант распараллеливания, основанный на использовании Parallel.For.

листинг на языке C#
листинг на языке C#

Методы GetParallel1 и GetParallel2 демонстрируют примерно одинаковую производительность. Ниже приведены результаты тестирования производительности всех трех методов. В качестве подынтегрального выражения использовалась функция:

-6

Интегрирование производилось на отрезке [10000, 10000].

Get (не использует распараллеливание) 486 мс

GetParallel1 305 мс

GetParallel2 293 мс

Как видно из результатов, параллельные методы показывают гораздо лучшую производительность.

Исходный код можно скачать здесь:

https://github.com/digitalmodelsru/IntegralParallel

-7

Наука
7 млн интересуются