Общение между отдельными MPI-программами - PullRequest
5 голосов
/ 23 мая 2010

У меня следующая проблема:

Программа 1 содержит огромное количество данных, например, 10 ГБ. Данные, о которых идет речь, состоят из больших целых и двойных массивов. Программа 2 имеет процессы MPI 1..n, которые используют фрагменты этих данных для вычисления результатов.

Как отправить данные из программы 1 в процессы MPI?

Использование файлового ввода-вывода исключено. Вычислительный узел имеет достаточно оперативной памяти.

Ответы [ 4 ]

5 голосов
/ 23 мая 2010

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

 mpirun -n 1 big_program : -n 20 little_program

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

1 голос
/ 25 мая 2010

На основании вашего описания «Программа 1» не является приложением MPI, а «Программа 2» является приложением MPI. Кратчайший путь к решению, вероятно, откроет сокет между двумя программами и отправит данные таким образом. Это не требует, чтобы «Программа 1» была изменена, чтобы быть программой MPI. Я бы начал с сокета между «Программой 1» и «Программой 2: ранг 0», причем ранг 0 распределял данные по оставшимся рангам.

Несколько предложений до сих пор включали запуск гетерогенного набора исполняемых файлов в качестве одного из возможных решений. Не требуется, чтобы все ранги в одном задании MPI были одним и тем же исполняемым файлом. Для этого необходимо, чтобы оба исполняемых файла были «программами MPI» (например, включать в себя как минимум вызовы MPI_Init и MPI_Finalize). Уровень модификации, требуемый для «Программы 1», и невозможность его запуска вне среды MPI могут сделать эту опцию непривлекательной.

Я бы рекомендовал вам избегать подхода «динамического процесса», если только вы не используете коммерческую реализацию, которая предлагает поддержку. Поддержка connect / accept имеет тенденцию быть нечеткой в ​​реализациях MPI с открытым исходным кодом. Это может "просто работать", но получение технической помощи, если это не может быть открытой проблемой.

1 голос
/ 23 мая 2010

Одним из ответов может быть размещение двух программ в отдельных коммуникаторах; один исполняемый файл может запускать оба набора приложений с использованием динамического управления процессами MPI-2, а программа «продюсер» связывается через MPI_COMM_WORLD с «потребительским» приложением. Впоследствии все IPC для потребительского приложения должны будут работать внутри субкоммуникатора, который исключает часть производителя. Однако это будет означать переписывание, чтобы избежать прямых вызовов MPI_COMM_WORLD.

0 голосов
/ 04 марта 2011

Не рекомендуется смешивать сокеты и MPI.Самый простой способ добиться этого - перенести процесс 1 и процесс 2 в одно приложение MPI.

Лучший способ реализовать это - использовать модель программирования под названием - MPMD или Multi-Program Multi-Data.Как следует из названия, ваше приложение MPI будет иметь несколько программ, работающих с несколькими данными.Даже если Программа 1 не является приложением MPI, вам не нужно вносить слишком много изменений.Просто вызовите MPI_Init и добавьте подпрограммы для отправки / получения данных.Вы можете думать об этом как о некой модели Master-Slave, в которой Prg1 является ведущим, а остальные являются рабами, получающими фрагменты данных для работы от ведущего.

Другой способ может заключаться в том, чтобы реализовать пул рабочих, сделав программу 1 такой же, как и программу 2, и каждый читает часть файла данных и начинает работать.Но вы исключили файловый ввод-вывод, поэтому я предполагаю, что у prog2-n нет доступа к файлу во время выполнения.Master-Slave будет работать лучше всего для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...