MPI_Scatter избыточные параметры?
Мой вопрос довольно прост, определение функции MPI_Scatter:
#include <mpi.h>
void MPI::Comm::Scatter(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype, void* recvbuf,
int recvcount, const MPI::Datatype& recvtype,
int root) const
Являются ли "sendcount" и "sendtype" избыточными? В каком случае это может произойти: sendcount!= Recvcount?
Изменить: Может быть, некоторые уточнения по этому вопросу. Я понимаю, что, возможно, причина в том, что для корня данные - это какая-то "структура X", а для получателей - какая-то "структура Y", что так или иначе имеет смысл (все это соответствует "ОК").
Если это так... Я не понимаю, почему нужно еще раз сказать, что общий размер ожидаемых данных, которые будут получены, равен размеру отправленных данных. Если это просто вопрос представления данных, я бы только сделал приведение. Фактически, буфер является (void *).
2 ответа
MPI позволяет разным типам данных на отправляющем и принимающем концах при условии, что они составлены из одних и тех же базовых типов данных. Во многих случаях это удобно, например, разбрасывание строк матрицы из корневого процесса в столбцы других процессов. Отправка и получение строк просты в C и C++, так как структура памяти матриц является основной строкой. Для отправки и получения столбцов требуется, чтобы вначале был создан специальный шаговый векторный тип. Обычно этот тип создается для определенного числа строк и столбцов, а затем необходимо указать количество 1
при получении данных.
Есть также много других случаев, когда sendcount
а также recvcount
может отличаться Имейте в виду также, что recvcount
не определяет размер сообщения, которое будет получено, а скорее емкость приемного буфера, и эта емкость может быть намного больше, чем размер сообщения.
MPI_scatter() предназначен для разбивки сообщения на равные части и обработки каждого в дочерних узлах и в ваших собственных. Зная это:
Являются ли "sendcount" и "sendtype" избыточными?
-Как это может произойти?, если sendCount - это количество отправленных элементов, а sendType - это тип этих элементов. Оба содержат разную информацию.
И последний вопрос:
В этом случае это может произойти: sendcount!= Recvcount?.
Когда вы хотите отсортировать последовательность чисел, вы отправляете блоки размера N и типа =int своим узлам. Вы хотите то же самое, но отсортировано.