92
CALL MPI_TYPE_HVECTOR(9, 1, 100*sizeofreal, oneslice, twoslice, ierr)
! создает тип данных для секции в целом
CALL MPI_TYPE_HVECTOR( 9, 1, 100*100*sizeofreal, twoslice, threeslice, ierr)
CALL MPI_TYPE_COMMIT( threeslice, ierr)
CALL MPI_SENDRECV(a(1,3,2), 1, threeslice, myrank, 0,e, 9*9*9, REAL,
myrank, 0,MPI_COMM_WORLD, status, ierr)
Пример 3.22. Копирование нижней треугольной части матрицы
REAL a(100,100), b(100,100)
INTEGER disp(100), blocklen(100), ltype, myrank, ierr
INTEGER status(MPI_STATUS_SIZE)
! копирует нижнюю треугольную часть массива a в нижнюю
! треугольную часть массива b
CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank)
! вычисляет начало и размер каждого столбца
DO i=1, 100
disp(i) = 100*(i-1) + i
block(i) = 100-i
END DO
! создает тип данных для нижней треугольной части
CALL MPI_TYPE_INDEXED(100,block, disp, MPI_REAL, ltype, ierr)
CALL MPI_TYPE_COMMIT(ltype, ierr)
CALL MPI_SENDRECV(a, 1, ltype, myrank, 0, b, 1, ltype, myrank, 0,
MPI_COMM_WORLD,status, ierr)
Пример 3.23. Транспонирование матрицы.
REAL a(100,100), b(100,100)
INTEGER row, xpose, sizeofreal, myrank, ierr
INTEGER status(MPI_STATUS_SIZE)
! транспонирование матрицы a в матрицу b
CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank)
CALL MPI_TYPE_EXTENT( MPI_REAL, sizeofreal, ierr)
! создание типа данных для одной строки
CALL MPI_TYPE_VECTOR( 100, 1, 100, MPI_REAL, row, ierr)
! создание типа данных для матрицы с расположением по строкам
CALL MPI_TYPE_HVECTOR( 100, 1, sizeofreal, row, xpose, ierr)
CALL MPI_TYPE_COMMIT( xpose, ierr)
! посылка матрицы с расположением по строкам
! и получение матрицы с расположением по столбцам
CALL MPI_SENDRECV( a, 1, xpose, myrank, 0, b, 100*100,
MPI_REAL, myrank, 0, MPI_COMM_WORLD, status,ierr)
Пример 3.24. Другой способ транспонирования матрицы.