Как правильно использовать MPI.Allgather() в python для сбора массивов разного размера из разных процессов

#python #mpi #mpi4py

#python #mpi #mpi4py

Вопрос:

В настоящее время я использую mpi4py, и у меня есть куча процессов, которые генерируют списки кортежей (или массивы кортежей numpy). В конце каждого процесса я хочу вызвать allgather, чтобы каждый процесс получал каждый список (в идеале, они объединяются).

К сожалению, документация на странице mpi4py не охватывает allgather() , поэтому мне было интересно, может ли кто-нибудь мне помочь. Я не понимаю, нужно ли мне использовать allgather() или allgatherv() или Allgather(), и, по сути, как это будет работать, поскольку я не разбрасываю какие-либо данные заранее.

Комментарии:

1. Хотя scatter и gather являются взаимодополняющими операциями и часто используются в тандеме, ничто не мешает вам использовать каждую из них по отдельности для достижения распределения или сбора данных. (All)gather просто берет меньшие фрагменты данных, хранящиеся локально в каждом ранге, и объединяет их в большую часть. Для фрагментов разного размера вам нужно Allgatherv() . Поскольку ему необходимо знать размер данных в каждом ранге, вам нужно сначала Allgather() указать длину массива.

2. GitHub — хороший способ найти примеры того, как все работает. Поиск comm.Allgatherv в коде Python дает большой результат. Вот один из них .