Разница между MPI allgather и MPI allgatherv


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

2 3

2 ответа:

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

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

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.

Просто чтобы дополнить ответ, уже данный @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 с помощью вашей любимой поисковой системы, а затем просто прочитать первую страницу руководства, которая появляется.