Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top