Платформа C/C++ для распределенных вычислений (MPI?)
Я изучаю, существует ли инфраструктура / библиотека, которая поможет мне реализовать распределенную вычислительную систему.
У меня есть мастер, который имеет большой объем данных, разбитых на файлы размером в несколько сотен мегабайт. Файлы будут разбиты на части по ~1 МБ и разосланы рабочим для обработки. После инициализации обработка каждого работника зависит от информации о состоянии, полученной из предыдущего чанка, поэтому работники должны оставаться в живых на протяжении всего процесса, и мастер должен иметь возможность отправлять нужные чанки нужным работникам. Еще одна вещь, которую стоит отметить, это то, что эта система является лишь частью более крупной технологической цепочки
Я немного изучил MPI (в частности, Open MPI), но я не уверен, что он подходит. Кажется, он предназначен для отправки небольших сообщений (несколько байтов), хотя я нашел несколько диаграмм, которые показывают, что его пропускная способность увеличивается при увеличении файлов (до 1/5 МБ).
Я обеспокоен тем, что не может быть способа сохранить состояние, если оно не будет постоянно отправляться в сообщениях. Глядя на структуру некоторых примеров MPI, выглядело, как будто хозяин (ранг 0) и рабочие (ранг 1-n) были частью одного и того же элемента, а их действия определялись условными выражениями. Могу ли я попросить рабочих остаться в живых (поддерживать состояние) и ждать поступления новых сообщений?
Теперь, когда я пишу это, я думаю, что это сработает. Секция ранга 1...n будет просто циклом с блокирующим приемом, за которым следует код обработки. Состояние будет поддерживаться в этом цикле до тех пор, пока не будет получено сообщение "больше нет данных", и в этот момент оно отправит результаты обратно. Я мог бы начать понимать структуру MPI здесь...
Другой мой вопрос о MPI - как запустить код. Помните, что эта система является частью более крупной системы, поэтому ее необходимо вызывать из некоторого другого кода. В примерах, которые я видел, используется mpirun, с помощью которого вы можете указать количество процессоров или файл hosts. Могу ли я получить то же поведение, вызывая мою функцию MPI из другого кода?
Так что мой вопрос - это MPI правильная структура здесь? Есть что-то лучше подходит для этой задачи, или я собираюсь делать это с нуля?
4 ответа
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.
Если вы начинаете работать с кластером и 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
Обратите внимание, что это был всего лишь небольшой фрагмент кода, который использовался для запуска и работы, он не полностью документирован и не является окончательной версией, но довольно коротким, отлично подходит для моих целей и должен послужить отправной точкой для вас.
Посмотрите на FastFlow. Они используют модель потока данных для обработки данных. Это очень эффективно, если эта модель подходит для вас.
RayPlatform - это инфраструктура MPI для C++. Вам нужно определить плагины для вашего приложения (например, модули в Linux).
RayPlatform распространяется по лицензии LGPLv3. Ссылка: https://github.com/sebhtml/RayPlatform
Это также хорошо задокументировано.
Пример приложения с использованием RayPlatform: https://github.com/sebhtml/RayPlatform-example
редактировать: добавлена ссылка