Разница между MPI_allgather и MPI_allgatherv - PullRequest
4 голосов
/ 03 мая 2011

В чем разница между MPI_allgather() и MPI_allgatherv()?

Ответы [ 2 ]

6 голосов
/ 03 мая 2011

Из стандарта MPI

MPI_GATHERV расширяет функциональность MPI_GATHER, позволяя варьировать количество данных от каждого процесса, так как recvcounts теперь является массивом. Это также позволяет больше гибкости относительно того, где данные помещаются в корень, предоставляя новый аргумент, отображает

MPI_ALLGATHERV является расширением этого.

Подписи для этих двух функций

int MPI_Allgather(void * sendbuff, int sendcount, MPI_Datatype sendtype, 
                  void * recvbuf, int recvcount, MPI_Datatype recvtype, 
                  MPI_Comm comm)
int MPI_Allgatherv(void * sendbuff, int sendcount, MPI_Datatype sendtype, 
                   void * recvbuf, int * recvcounts, int * displs, 
                   MPI_Datatype recvtype, MPI_Comm comm)

Вы можете указать размер и смещение назначения для данных каждого процесса, используя recvcounts и displs, используя вариант v.

3 голосов
/ 04 мая 2012

Просто для дополнения ответа, уже полученного @Scott Wales:

В общем, MPI предоставляет три типа коллективных вызовов:

  • простые, где одинаковое количествоэлементы данных и того же типа данных отправляются / принимаются от каждого ранга назначения.Типичные примеры: MPI_Scatter, MPI_Gather, MPI_Alltoall и т. Д. Там вы предоставляете только один аргумент для размера блока в элементах данных и один аргумент для типа данных;

  • векторные варианты, в которых можно отправлять / получать различное количество элементов в / из каждого ранга назначения, но тип данных остается одинаковым для всех отправлений / приемов.Эти варианты имеют суффикс "v": MPI_Scatterv, MPI_Gatherv, MPI_Alltoallv и т. Д. Они имеют почти такую ​​же сигнатуру, что и простые, за исключением того, что аргумент для размера блока заменяется двумя целочисленными векторными аргументами (следовательно, вектор ): один для количества элементов и один для смещения (в элементах) от начала буфера данных каждого блока данных (всегда в этом порядке);

  • самый общий тип, где также можно отправлять элементы различных типов данных каждому процессу в коммуникаторе.Эти варианты имеют суффикс "w".Не у всех коллективов есть такие варианты, когда MPI_Alltoallw является единственным в версии 2.2 стандарта MPI (последней опубликованной версии), и еще больше в версии 3.0.

СMPI является стандартом, и поскольку все реализации MPI должны соответствовать стандарту (а на самом деле большинство так и делают), вы можете просто найти интересующую функцию MPI с помощью вашей любимой поисковой системы, а затем просто прочитать первую страницу руководства, которая появляется.

...