Связь между отдельными MPI-программами

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

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

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

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


person Fyg    schedule 23.05.2010    source источник
comment
Достаточно ли оперативной памяти для использования общей памяти для хранения данных? Это всего 10 ГБ; в наши дни большие серверы имеют больше памяти.   -  person Jonathan Leffler    schedule 23.05.2010


Ответы (4)


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

 mpirun -n 1 big_program : -n 20 little_program

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

person Scott Wales    schedule 23.05.2010
comment
Я делаю это, и это прекрасно работает (используя Microsoft msmpi). Вы можете использовать переменную MPI_APPNUM (доступную в msmpi как переменную окружения как PMI_APPNUM), чтобы определить, кто есть кто: в приведенном выше случае big_program будет иметь MPI_APPNUM = 0, а все small_programs будут иметь MPI_APPNUM = 1. - person David Glaubman; 24.05.2010

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

person Matt    schedule 23.05.2010

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

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

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

person Stan Graves    schedule 25.05.2010

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

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

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

person powerrox    schedule 04.03.2011