MPI или сокеты?

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

Мой вопрос таков. Все традиционные и серьезные приложения HPC, выполняемые на кластерах, обычно реализуются с передачей сообщений, а не напрямую через сокеты. Каковы преимущества этого в производительности? Увидим ли мы ускорение при переходе с сокетов?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
7 136
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

MPI использует сокеты внизу, поэтому на самом деле единственной разницей должен быть API, с которым взаимодействует ваш код. Вы можете точно настроить протокол, если используете сокеты напрямую, но это все. Что именно вы делаете с данными?

MPI использует сокеты, и если вы знаете, что делаете, вы, вероятно, сможете получить большую пропускную способность из сокетов, потому что вам не нужно отправлять столько метаданных.

Но вы должны знать, что делаете, и это может быть более подвержено ошибкам. по сути, вы заменили бы mpi своим собственным протоколом обмена сообщениями.

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

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

Для обмена сообщениями бизнес с большими объемами и низкими накладными расходами вы можете проверить OAMQ с несколькими продуктами. Вариант с открытым исходным кодом OpenAMQ предположительно управляет торговлей в JP Morgan, так что он должен быть надежным, не так ли?

Ответ принят как подходящий

MPI МОЖЕТ использовать сокеты. Но есть также реализация MPI для использования с SAN (системная сеть), которые используют прямую распределенную разделяемую память. Конечно, если у вас есть для этого оборудование. Таким образом, MPI позволяет использовать такие ресурсы в будущем. В этом случае вы можете добиться значительного повышения производительности (по моему опыту работы с кластерами еще в университетское время, вы можете достичь прироста на несколько порядков). Поэтому, если вы пишете код, который можно портировать на более высокие кластеры, использование MPI - очень хорошая идея.

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

Я не использовал MPI, но довольно часто использовал сокеты. При выборе высокопроизводительных сокетов следует учитывать несколько моментов. Вы делаете много маленьких или больших пакетов? Если вы обрабатываете много небольших пакетов, рассмотрите возможность отключения алгоритма Нэгла для более быстрого ответа:

setsockopt (m_socket, IPPROTO_TCP, TCP_NODELAY, ...);

Кроме того, использование сигналов может быть намного медленнее при попытке передать большой объем данных. Давным-давно я сделал тестовую программу, в которой читатель ждал сигнала и читал пакет - получал около 100 пакетов / сек. Затем я просто заблокировал чтение и получил 10000 чтений в секунду.

Дело в том, чтобы посмотреть на все эти варианты и проверить их на практике. Различные условия сделают разные техники более быстрыми / медленными. Важно не просто получить мнения, но и проверить их. Стив Магуайр говорит об этом в «Написании твердого кода». Он использует множество примеров, которые противоречат интуиции, и тестирует их, чтобы выяснить, что делает код лучше / быстрее.

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

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

По крайней мере, использование MPI и последующий рефакторинг его с вашей собственной системой - хороший подход, который требует затрат на установку и зависимость MPI.

Мне особенно нравится замечание OldMan о том, что MPI дает вам гораздо больше, чем просто связь через сокеты. Вы получаете множество реализаций параллельных и распределенных вычислений с прозрачной абстракцией.

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

Каким образом ограничивается ввод-вывод вашего приложения? Привязан ли он к передаче блоков данных рабочим узлам или связан из-за связи во время вычислений?

Если ответ - «из-за связи», то проблема в том, что вы пишете сильно связанное приложение и пытаетесь запустить его в кластере, предназначенном для слабосвязанных задач. Единственный способ повысить производительность - получить лучшее оборудование (более быстрые переключатели, бесконечную полосу пропускания и т. д.) ... может быть, вы могли бы занять время на чужой HPC?

Если ответ - передача «блока данных», рассмотрите возможность назначения работникам нескольких блоков данных (чтобы они дольше оставались занятыми) и сжимайте блоки данных перед передачей. Это стратегия, которая может помочь в слабосвязанных приложениях.

Ввод-вывод отправляет данные задания перед запуском и отправляет результаты после слов.

Nicholas Mancuso 30.09.2008 22:54

В этом случае производительность - не единственное соображение, даже в высокопроизводительных кластерах. MPI предлагает стандартный API и является «переносимым». Переключение приложения между различными версиями MPI относительно тривиально.

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

Кроме того, если у вас когда-нибудь появится возможность запустить свой код в кластере с InfiniBand, уровень MPI будет абстрагироваться от любых этих изменений кода. Это нетривиальное преимущество - очень сложно написать приложение для прямого использования OFED (или другой реализации IB Verbs).

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

Мне любопытно, почему вы используете «переносимый» как ласковое слово (своего рода), а не просто говорите, что MPI переносим.

Jeff Hammond 02.01.2015 01:24

Я заключил «переносимые» в кавычки, потому что приложения с поддержкой MPI зависят от более крупной экосистемы, чем большинство типичных приложений с одним хостом. Эта зависимость от экосистемы вызывает проблемы при переносе приложений с поддержкой MPI. Во многих случаях приложение MPI не «просто запускается», но ошибка выходит за рамки MPI и приложения. Реализация MPI может зависеть от конкретных библиотек, драйверов, микропрограмм, настроек сети, политик аутентификации пользователей, версий демонов или служб, сетевых файловых систем и т. д.

Stan Graves 07.01.2015 02:06

Преимущество MPI в том, что вы можете осуществлять коллективное общение. Выполнение трансляций / сокращений в O (log p) / * p - ваше количество процессоров * / вместо O (p) - большое преимущество.

Допускает ли многоадресная рассылка UDP реализацию журнала (p)?

Jeff Hammond 02.01.2015 01:22

UDP находится на транспортном уровне, MPI - на прикладном уровне. Вы можете реализовать MPI поверх UDP, если хотите.

Chad Brewbaker 02.01.2015 02:41

Другие вопросы по теме