MPI против Microsoft WCF против Microsoft TPL - PullRequest
4 голосов
/ 07 сентября 2011

У меня есть научная программа, написанная на F #, которую я хочу распараллелить и запустить на 1 сервере с несколькими процессорами (64) и в будущем также в облаке (Windows Azure?). Программа будет иметь простое соединение 1-1 между узлами (без трансляции и т. Д.).

Если бы я использовал WCF, это было бы так же быстро, как MPI? Что имеет MPI, чего нет у WCF? Существует чистый MPI .NET, написанный для WCF, который еще больше меня озадачивает. Я не знаю, использовать ли WCF или MPI.NET или Pure Mpi, работающие на WCF.

PS: Полагаю, что TPL вне игры для 64 и более процессоров, верно?

Ответы [ 4 ]

2 голосов
/ 07 сентября 2011

Если вы делаете это на 1 сервере, вы можете просто выполнить один процесс и выполнить код параллельно. Таким образом, вы могли бы делить память проще и быстрее, чем делать это с помощью сообщений типа MPI и WCF. Хотя издержки на общение могут быть не такими большими, в зависимости от вашей проблемы + решения.

Кроме того, изменения в вашем коде будут намного меньше, F # обычно можно превратить в параллельный код без особых усилий. Переход на MPI / WCF потребует от вас переписать большие порции.

Поиск в Google для параллели F # + дает много полезной информации, которую вы должны прочитать в первую очередь, например, для хорошего начала: http://blogs.msdn.com/b/dsyme/archive/2010/01/09/async-and-parallel-design-patterns-in-f-parallelizing-cpu-and-i-o-computations.aspx

Так что на 1 сервере я буду использовать параллельные функции F #, он предназначен для простого распараллеливания.

Позже, когда вы захотите перейти в облако, это превратит его в cleint-сервер. Это другая проблема, чем парализация. Я бы лечил и решал их отдельно.

На MPI против WCF. WCF разработан как технология RPC, то есть вы вызываете удаленные процедуры и получаете ответы. Если вы хотите использовать его для параллельного программирования с отдельными процессами, вам придется создать шаблонный код для этого. (Следите за подписанными клиентами и т. Д.)

MPI был разработан для работы с такой архитектурой и упрощает ее обработку. (первый процесс получает номер 0 и является ведущим, остальные - рабами нумеруются постепенно и т. д.)

Как бы то ни было, я не думаю, что MPI будет очень хорошо работать в облаке, поскольку это включает http, протоколы, безопасность и т. Д. Не уверен, насколько хорошо MPI работает для такого рода вещей, WCF действительно справится с этим очень хорошо.

Тот факт, что существует MPI.NET для WCF, заключается в том, что MPI - это определенный стиль парализующего кода, с которым многие люди знакомы. Таким образом, вы можете использовать концепции программирования и использовать их на платформе .NET, используя WCF для коммуникации.

Если вы хотите обмениваться большим количеством данных по проводам, вам может понадобиться еще кое-что - протокол-буферы (см., Например, protobuf-net ). Это можно легко комбинировать с WCF для связи и очень легко сериализировать структурированные данные, чтобы вы могли эффективно передавать по проводам.

Герт-Ян

2 голосов
/ 07 сентября 2011

Сложно дать конкретный ответ, потому что все зависит от конкретных аспектов вашего приложения, его текущей архитектуры (я полагаю, у вас уже есть какое-то приложение) и т. Д.

  • Поскольку вы упоминаете MPI и WCF, я предполагаю, что приложение написано как несколько компонентов, которые взаимодействуют друг с другом. Лучший способ структурировать приложения такого типа - использовать F # агентов . Насколько я понимаю, вы хотите сначала запустить приложение на одном сервере. Если вы пишете это с помощью агентов, агенты могут просто общаться напрямую друг с другом (поэтому вам не нужны MPI или WCF).

  • TPL должен хорошо работать на одном сервере (с большим количеством процессоров), но он не будет масштабироваться до распределенной настройки - вы не можете запустить Task на другой машине. Однако вы можете использовать его внутри отдельных компонентов (например, агентов), которые будут распространяться.

Относительно MPI против WCF - у меня недостаточно опыта, чтобы ответить на этот вопрос. Однако, если вы используете агентную архитектуру, вам будет легко попробовать различные варианты. Вы также можете проверить fracture и связанные проекты, целью которых является внедрение высокопроизводительных сокетов для F # (и, возможно, распределенных агентов в будущем).

1 голос
/ 08 сентября 2011

Возможно, вы захотите воспользоваться продуктом 'mbrace', который предоставляет облачную монаду (http://blogs.msdn.com/b/dsyme/archive/2011/08/23/m-brace-f-in-the-cloud.aspx). Хотя это все еще на довольно ранней стадии. Я не эксперт, но, возможно, вы можете запустить mbrace-решение, основанное на использовании 64-процессорного процессора. Когда вы перерастете его, переход на Azure будет беспроблемным.

1 голос
/ 07 сентября 2011

WCF и MPI - это разные понятия. WCF подобен человеку A, который просит человека B сделать что-то, в то время как MPI похож на человека A, создающего клоны самого себя (все клоны имеют одинаковую способность / логику), и затем эти клоны работают над определенными частями проблемы, которую нужно решить, и один раз сделано они объединяют свои результаты.

Таким образом, выбор между тем, который подходит вашему конкретному приложению, зависит от проблемы, которую пытается решить ваше приложение. Это может быть даже комбинация WCF и MPI. Когда ваше клиентское приложение просит WCF выполнить некоторую задачу, а WCF создает клоны «решателя проблем» с использованием MPI, а когда клон завершает решение проблемы (параллельно), они возвращают агрегированный результат обратно в WCF, а затем результат отправляется клиентскому приложению.

...