Разница между MPI allgather и MPI allgatherv
В чем разница между MPI_allgather()
и MPI_allgatherv()
?
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 с помощью вашей любимой поисковой системы, а затем просто прочитать первую страницу руководства, которая появляется.