Для полноты картины я также цитирую ответ Жиля.
Тип вектора описывает серию блоков одинакового размера с интервалом
с постоянным шагом. [...] Векторный тип данных дает первое
нетривиальная иллюстрация того, что типы данных у отправителя могут быть разными
и получатель. Если отправитель отправляет b блоков длиной l каждый,
приемник может получать их как непрерывные элементы, либо как
непрерывный тип данных или как непрерывный буфер элементарного типа;
см рисунок В этом случае получатель не знает о
шаг типа данных на отправителя. ![Figure](https://i.stack.imgur.com/v84sl.jpg)
[...] В этом примере векторный тип создается только в отправителе, в
порядок отправки выделенного подмножества массива; получатель получает
данные как непрерывный блок.
В качестве примера этого типа данных рассмотрим пример транспонирования
матрица, например, для преобразования между массивами C и Fortran [...]
Предположим, что процессор имеет матрицу, хранящуюся в C, мажор строки, макет,
и он должен отправить столбец на другой процессор. Если матрица
объявлен как int M,N; double mat[M][N]
, тогда столбец имеет M блоков
одного элемента, разнесенных на N мест. Другими словами:
MPI_Datatype MPI_column;
MPI_Type_vector(
/* count= */ M, /* blocklength= */ 1, /* stride= */ N,
MPI_DOUBLE, &MPI_column );
Простая отправка первого столбца:
MPI_Send( mat, 1,MPI_column, ... );
Второй столбец немного сложнее: теперь вам нужно выбрать
элементы с одинаковым шагом, но начинающиеся с A 0 .
MPI_Send( &(mat[0][1]), 1,MPI_column, ... );
Вы можете сделать это немного более эффективным (и труднее читать)
заменив индексное выражение на mat + 1.