Я пишу приложение MPI, A
в C ++, который ссылается на внешнее приложение, B
, который также использует MPI. В приложении A
Мне нужно запустить параллельные функции в B
в параллели. Количество процессоров, m
требуется для вызова параллельных функций в B
известен и постоянен. Кроме того, количество параллельных экземпляров B
вызов функции, n
в пределах А известен и постоянен.
В настоящее время планирую расщепление MPI_COMM_WORLD
в n
коммуникаторы размера m
и работает B
Функция внутри каждого сгенерированного коммуникатора. Однако если B
имеет жесткий код MPI_COMM_WORLD
как его коммуникатор для всех вызовов MPI, есть ли способ для меня, чтобы отличить это MPI_COMM_WORLD
следует рассматривать как соответствующий коммуникатор, недавно созданный в A
вместо глобального коммуникатора для всех процессоров?
Я знаю, что это может быть странно, но я был вдохновлен этот статья, которая читает
Хотя MPI_Comm_split является наиболее распространенной функцией создания коммуникатора, существует множество других. MPI_Comm_dup является наиболее простым и создает дубликат коммуникатора. Может показаться странным, что существует функция, которая создает только копию, но это очень полезно для приложений, которые используют библиотеки для выполнения специализированных функций, таких как математические библиотеки. В таких приложениях важно, чтобы коды пользователей и коды библиотек не мешали друг другу. Чтобы избежать этого, первое, что должно сделать каждое приложение, — это создать дубликат MPI_COMM_WORLD, что позволит избежать проблем других библиотек, также использующих MPI_COMM_WORLD. Сами библиотеки также должны делать дубликаты MPI_COMM_WORLD, чтобы избежать той же проблемы.
Означает ли это, что то, что я предлагаю, возможно, или я просто неправильно понимаю статью? Если нет, есть ли подобная стратегия для достижения того, что я описал?
Задача ещё не решена.
Других решений пока нет …