Платформа C / C ++ для распределенных вычислений (MPI?) - PullRequest
2 голосов
/ 25 июля 2011

Я изучаю вопрос о том, существует ли инфраструктура / библиотека, которая поможет мне реализовать распределенную вычислительную систему.

У меня есть мастер, который разбивает большой объем данных на несколько файловсто мегабайтФайлы будут разбиты на части по ~ 1 МБ и переданы работникам для обработки.После инициализации обработка каждого работника зависит от информации о состоянии, полученной из предыдущего чанка, поэтому работники должны оставаться в живых на протяжении всего процесса, и мастер должен иметь возможность отправлять нужные чанки нужным работникам.Еще одна вещь, которую стоит отметить, это то, что эта система является лишь частью более крупной цепочки обработки.

Я немного изучил MPI (в частности, Open MPI), но я не уверен, что этоправильно подходит.Похоже, что он предназначен для отправки небольших сообщений (несколько байтов), хотя я нашел несколько диаграмм, показывающих, что его пропускная способность увеличивается с увеличением файлов (до 1/5 МБ).

Я обеспокоен тем, чтоможет не быть способом поддержания состояния, если оно не было постоянно отправлено туда и обратно в сообщениях.Глядя на структуру некоторых примеров MPI, выглядело так, как хозяин (ранг 0) и рабочие (ранг 1-n) были частью одного и того же элемента, а их действия определялись условными выражениями.Могу ли я попросить рабочих остаться в живых (поддерживать состояние) и ждать, пока придут другие сообщения?

Теперь, когда я пишу это, я думаю, что это сработает.Секция ранга 1 ... n будет просто циклом с блокирующим приемом, за которым следует код обработки.Состояние будет поддерживаться в этом цикле до тех пор, пока не будет получено сообщение «больше нет данных», и в этот момент оно отправит результаты обратно.Я мог бы начать понимать структуру MPI здесь ...

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

Так что мой вопрос в том, является ли MPI подходящей платформой здесь?Есть что-то лучше подходит для этой задачи, или я собираюсь делать это с нуля?

Ответы [ 4 ]

2 голосов
/ 25 июля 2011

Если вы начинаете работать с кластером и mpi, то я рекомендую взглянуть на boost mpi. Это оболочка c ++ поверх базовой библиотеки mpi (например, openmpi или mpich2). Я нахожу это очень полезным.

Ваша идея отправки сообщений вперед и назад, когда каждый узел запрашивает новое сообщение, когда оно закончено, пока не произойдет рукопожатие с сообщением «больше сообщений нет», звучит неплохо. У меня была похожая идея, и я запустил простую версию. Я просто положил его на GitHub для вас, если вы хотите посмотреть. https://github.com/thshorrock/mpi_manager. Большая часть кода находится в заголовочном файле: https://github.com/thshorrock/mpi_manager/blob/master/include/mpi_manager/mpi_manager.hpp

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

2 голосов
/ 25 июля 2011

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

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

Запуск процесса MPI первоначально выполняется mpirun. Например, вы создаете некоторую программу program.c, а затем компилируете ее, используя mpicc -o program program.c. Затем вы должны запустить mpirun -np 20 ./program <params>, чтобы запустить 20 процессов. У вас будет 20 независимых процессов, каждый из которых имеет свой собственный ранг, поэтому дальнейшее продвижение по вашему заявлению. Способ, которым эти 20 процессов будут распределены между узлами / процессорами, контролируется такими вещами, как hostfile и т. Д., Следует более внимательно изучить документацию.

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

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

1 голос
/ 25 июля 2011

Посмотрите на FastFlow . Они используют модель потока данных для обработки данных. Это очень эффективно, если эта модель подходит для вас.

0 голосов
/ 03 февраля 2012

RayPlatform - это инфраструктура MPI для C ++. Вам нужно определить плагины для вашего приложения (например, модули в Linux).

RayPlatform распространяется по лицензии LGPLv3. Ссылка: https://github.com/sebhtml/RayPlatform

Это также хорошо задокументировано.

Пример приложения с использованием RayPlatform: https://github.com/sebhtml/RayPlatform-example

редактировать: добавлена ​​ссылка

...