Планирование параллелизма
-
03-07-2019 - |
Вопрос
Если вы планируете написать параллельное приложение с высокой вычислительной нагрузкой, какие рекомендации вы бы использовали при проектировании своих объектов (будь то классы, структуры или что-либо еще), чтобы максимизировать свой потенциал получения максимальной отдачи от параллелизма.
Я имею в виду приложение, которое, скажем, интерпретирует / компилирует древовидный граф объектов, требующих создания материала, передачи его другому объекту для обработки и так далее, с древовидной структурой.
Что следует учитывать на ранних этапах проектирования?
Решение
Если вы создаете материал, а затем передаете его для обработки, то почти наверняка вы можете спроектировать свое приложение таким образом, чтобы оно использовало передача сообщений и изоляция объекта.
Первым шагом будет определение обязанностей, то есть определение того, кто с чем будет справляться.Каждый, кто заключен в прямоугольник.
Вторым шагом будет определение информационного потока между вашими блоками, то есть, если A выдает X...кто его потребляет?
После этих двух шагов у вас будет простой график с листьями, представляющими работников, и стрелками, представляющими сообщения. Каждая стрелка представляет собой порядок зависимостей (то есть, если стрелка идет от A к B, то A должно быть выполнено перед B).
С помощью этого вы сможете легко увидеть, какие действия можно выполнить параллельно, а какие действительно последовательны, в графическом виде, который легко увидеть и показать.
Затем просто реализуйте Труба структура, позволяющая вам передача сообщений между работниками так что у каждого работника есть свой конвейер работы.
На заключительной ноте:Как только оригинальный дизайн готов, его относительно легко реорганизовать, чтобы улучшить.Например, узлы, которые выполняют одну и ту же работу, могут совместно использовать рабочие КАНАЛЫ, так что синтаксический анализатор 8 использует канал "лексический токен" или изменяет его так, чтобы рабочие могли "красть" работу из других рабочих каналов и т.д.
Другие советы
Если вам сойдет с рук использование большого количества неизменяемых структур данных, это сэкономит вам массу времени, время набора текста и головную боль.
Схема, описанная Хорхе Кордобой выше, - это всего лишь один из подходов.Следующее, безусловно, стоит прочитать:
http://www.amazon.com/Patterns-Parallel-Programming-Software/dp/0321228111
Это очень сильно зависит от зависимостей между вашими данными относительно наилучшего способа декомпозиции вашей проблемы.Например, такие шаблоны, как Master-Worker и single program multiple data (SPMD), как правило, являются очень простыми подходами, если ваша проблема поддается анализу и подходу.