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 своим узлам. Вы хотите то же самое, но отсортировано.

Другие вопросы по тегам