Если используется декартова топология, то операцию MPI_SENDRECV можно выполнить путем сдвига данных вдоль направления координаты. В качестве входного параметра MPI_SENDRECV использует номер процесса-отправителя для приема и номер процесса-получателя - для передачи. Если функция MPI_CART_SHIFT выполняется для декартовой группы процессов, то она передает вызывающему процессу эти номера, которые затем могут быть использованы для MPI_SENDRECV. Пользователь определяет направление координаты и величину шага (положительный или отрицательный). Эта функция является локальной.
Синтаксис функции MPI_CART_SHIFT представлен ниже.
MPI_CART_SHIFT(comm, direction, disp, rank_source, rank_dest)
IN | comm | коммуникатор с декартовой топологией (дескриптор) | |
IN | direction | координата сдвига (целое) | |
IN | disp | направление смещения (> 0: смещение вверх, < 0: смещение вниз) (целое) | |
OUT | rank_source | номер процесса-отправителя (целое) | |
OUT | rank_dest | номер процесса-получателя (целое) |
int MPI_Cart_shift(MPI_Comm comm, int direction,
int disp, int *rank_source, int *rank_dest)
MPI_CART_SHIFT(COMM, DIRECTION, DISP,
RANK_SOURCE, RANK_DEST, IERROR)
INTEGER COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR
void MPI::Cartcomm::Shift(int direction, int disp,
int& rank_source, int& rank_dest) const
Аргумент direction указывает размерность, то есть координату, по которой сдвигаются данные. Координаты маркируются от 0 до ndims-1, где ndims - число размерностей.
В зависимости от периодичности декартовой группы в указанном направлении координаты, MPI_CART_SHIFT указывает признаки для кольцевого сдвига или для сдвига без переноса. В случае сдвига без переноса в rank_source или rank_dest может быть возвращено значение MPI_PROC_NULL для указания, что процесс-отправитель или процесс-получатель при сдвиге вышли из диапазона.
Пример 6.4 Коммуникатор comm имеет двумерную периодическую декартову топологию. Двумерная матрица элементов типа REAL хранит один элемент на процесс в переменной A. Нужно выполнить скошенное преобразование матрицы путем сдвига столбца i (вертикально, то есть вдоль столбца) i раз.
....
C определяется номер процесса
CALL MPI_COMM_RANK(comm, rank, ierr)
C опеределяются декартовы координаты
CALL MPI_CART_COORDS(comm, rank, maxdims, coords, ierr)
C вычисляются номера процесса-отправителя и процесса-получателя при сдвиге
CALL MPI_CART_SHIFT(comm, 0, coords(2), source, dest, ierr)
C "скошенный" массив
CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, dest, 0, source, 0,
comm, status, ierr)
Совет пользователям: В языке ФОРТРАН размерность, обозначенная как DIRECTION = i, имеет DIMS (i + 1) узлов, где DIMS - массив, который был использован для создания решетки. В языке Си размерность, обозначенная DIRECTION =i есть размерность, указаная DIMS [i].[]