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*).


person Matthew Azkimov    schedule 20.09.2012    source источник


Ответы (2)


MPI допускает, чтобы оба типа данных на отправляющей и принимающей стороне были разными, если они созданы из одних и тех же базовых типов данных. Есть много случаев, когда это удобно, например. разбрасывание строк матрицы из корневого процесса по столбцам в других процессах. Отправка и получение строк в C и C++ осуществляется просто, поскольку расположение матриц в памяти является основным по строкам. Для отправки и получения столбцов требуется, чтобы сначала был создан специальный векторный тип. Обычно этот тип строится для определенного количества строк и столбцов, а затем при получении данных необходимо указать количество 1.

Есть также много других случаев, когда sendcount и recvcount могут отличаться. Имейте в виду, что recvcount не определяет размер получаемого сообщения, а определяет емкость приемного буфера, и эта емкость может быть намного больше, чем размер сообщения. .

person Hristo Iliev    schedule 21.09.2012
comment
Я до сих пор не понимаю, зачем добавлять два дополнительных параметра, если все можно исправить (а на самом деле это будет) с помощью приведения. - person Matthew Azkimov; 22.09.2012
comment
MPI обеспечивает как можно более универсальный интерфейс. Это исходит от людей, занимающихся научными и техническими вычислениями, где обычно используются функции с множеством аргументов вместо множества разных версий одной и той же функции. Существуют и другие оболочки C++ над MPI, которые скрывают ненужные для вас аргументы (кроме того, текущие привязки MPI C++ устарели и будут удалены в MPI 3.0). - person Hristo Iliev; 23.09.2012

MPI_scatter() предназначена для разбиения сообщения на равные части и обработки каждого из них в дочерних узлах и в вашем собственном. Зная это:

Являются ли «sendcount» и «sendtype» избыточными?

-Как это может случиться?, если sendCount — это количество отправленных элементов, а sendType — это тип этих элементов. Оба содержат разную информацию.

И на последний вопрос:

В этом случае может произойти: sendcount!=recvcount?.

-Когда вы хотите отсортировать последовательность чисел, вы отправляете своим узлам блоки размера N и type=int. Вы хотите то же самое, но отсортировано.

person ferbuntu    schedule 21.09.2012
comment
Почему «sendcount» и «recvcount» разные? Оба N. - person Matthew Azkimov; 22.09.2012
comment
О, моя вина: я все время видел != как ...количество=.... - person ferbuntu; 22.09.2012