Тестирование эффективности многопоточной реализации исполнения локальных узлов в библиотеке GridMD - Повышение производительности работы библиотеки GridMD

Тестирование эффективности многопоточной реализации исполнения локальных узлов производилось на примере расчета определенного интеграла функции. Расчет был реализован средствами GridMD (см Приложение), где он был представлен в виде графа, продемонстрированном на Рис. 11.

граф исполнения gridmd для расчета определенного интеграла

Рис. 11 Граф исполнения GridMD для расчета определенного интеграла

Распараллеливание интегрирования функции возможно путем разбиения области интегрирования на отдельные интервалы, параллельного интегрирования функции на каждом из интервалов и итогового суммирования результатов интегрирования на интервалах разбиения. Именно такую схему изображает представленный граф исполнения, в узле Start которого разбивается исходная область интегрирования на интервалы, в узлах Split происходит интегрирование функции на каждом из интервалов и в узле End суммируется результат исполнения всех узлов Split. Рассмотренная схема концептуально является шаблоном ветвления, поддерживаемым в GridMD, и реализуется с помощью класса GmFork. Каждый из узлов графа был объявлен как локальный.

В текущей реализации менеджер сценариев по результатам разбора графа спланирует параллельное исполнение узлов Split и отправит их на исполнение в пул потоков.

При тестировании рассчитывался определенный интеграл функции F(x) = sin(x) На отрезке [-1000,1000] c переменным шагом интегрирования. Тестирование производилось на ОС Ubuntu 14.04 и четырехядерном процессоре Intel Core i7 2670QM. Число рабочих потоков в пуле устанавливалось равным числу виртуальных ядер, а именно восьми. Сравнение времени расчета интеграла с помощью GridMD без поддержки многопоточности и при использовании пула потоков представлено на Рис. 12.

сравнение времени расчета с помощью многопоточной реализации gridmd и без поддержки потоков

Рис. 12 Сравнение времени расчета с помощью многопоточной реализации GridMD и без поддержки потоков

При сравнении область определения разбивалась на 25 интервалов, создавая 25 параллельных ветвей графа исполнения и равное им количество заданий для пула потоков. На каждом шаге теста уменьшался шаг интегрирования (увеличивалось число разбиений всей области интегрирования). Результат интегрирования на каждом из шагов был равен нулю с точностью до ошибки интегрирования, так как интегрировалась четная функция на симметричном относительно нуля интервале. По результатам теста можно сказать, что производительность библиотеки с внедрением пула потоков увеличилась в среднем в 2.5 раза.

Далее было проведено сравнение расчета интеграла с помощью многопоточной версии GridMD и пула потоков, реализованного с помощью средств библиотеки Boost в виде отдельного компонента с аналогичным классу GmThreadPool интерфейсом. (Рис. 13).

оценка накладных расходов, вносимых служебными действиями gridmd при расчете

Рис. 13 Оценка накладных расходов, вносимых служебными действиями GridMD при расчете

Тaкое сравнение помогает оценить степень влияния накладных расходов GridMD по разбору графа менеджером сценариев, планированию и генерации заданий, разрешение зависимостей узлов по данным через файловую систему. На Рис. 13 видно, что кривые лежат близко друг к другу, и в среднем GridMD своими служебными действиями дает увеличение времени расчета в 6 секунд.

Похожие статьи




Тестирование эффективности многопоточной реализации исполнения локальных узлов в библиотеке GridMD - Повышение производительности работы библиотеки GridMD

Предыдущая | Следующая