Правила соответствия типа для связи в MPI не изменены: спецификация типа
данных за каждый посланный элемент должна соответствовать, в сигнатуре типа,
спецификации типа данных, которое использовалось для получения этого
элемента (если один из типов не MPI_PACKED
). Также, тип элемента
сообщения должен соответствовать объявлению типа для соответствующего
расположения буфера связи, если тип не MPI_BYTE
или
MPI_PACKED
. Межъязыковая связь позволяется, если она выполняет эти
правила.
Пример 4.14 В примере ниже, массив ФОРТРАНА послан из языка ФОРТРАН и получен в Си.
! КОД ФОРТРАНА
REAL R(5)
INTEGER TYPE, IERR, MYRANK
INTEGER(KIND=MPI_ADDRESS_KIND) ADDR
! Создать абсолютный тип данных для массива R
CALL MPI_GET_ADDRESS(R, ADDR, IERR)
CALL MPI_TYPE_CREATE_STRUCT(1, 5, ADDR, MPI_REAL, TYPE, IERR)
CALL MPI_TYPE_COMMIT(TYPE, IERR)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, MYRANK, IERR)
IF (MYRANK.EQ.0) THEN
CALL MPI_SEND(MPI_BOTTOM, 1, TYPE, 1, 0, MPI_COMM_WORLD, IERR)
ELSE
CALL C_RQUTINE(TYPE)
END IF
/* Код Си */
void C_ROUTINE(MPI_Fint *fhandle)
{
MPI_Datatype type;
MPI_Status status;
type = MPI_Type_f2c(*fhandle);
MPI_Recv(MPI_BOTTOM, 1, type, 0, 0, MPI_COMM_WORLD, &status);
}
Разработчики MPI могут смягчить эти правила соответствия типа, и
позволять сообщениям быть посланными с типами ФОРТРАН и полученными с
типами Си, и наоборот, когда эти типы соответствуют. То есть, если тип
INTEGER
ФОРТРАН идентичен типу int
Си, то реализация MPI может позволять данным быть посланными с типом данных
MPI_INTEGER
и быть полученными с типом данных MPI_INT
.
Однако, такой код не является мобильным.