Fortran 77
MPI_ADDRESS(BUFF, ADDRESS, IERR)
INTEGER ADDRESS, IERR
C ָͨʵֶԵַκβ Fortran 77 ͨõķʽֱʹһַΪ Fortran 77 ʹ MPI_ADDRESSصĵַMPI һMPI_BOTTOM൱ھԵַ 0ˣ CALL MPI_ADDRESS(BUFF, ADDRESS, IERR)
MPI_BOTTOM(ADDRESS) BUFF ͬһڴַ
4.10
REAL A(N), B(N)
INTEGER TYPE, IA, IB ......
CALL MPI_ADDRESS(A, IA, IERR) CALL MPI_ADDRESS(B, IB, IERR)
CALL MPI_TYPE_HVECTOR(2, N, IB-IA, MPI_REAL, TYPE, IERR) ......
CALL MPI_SEND(A, 1, TYPE, ...) ... ...
ͬʱͬ A B
4.11
PARAMETER (N=1024, M=512, L=256)
REAL A(N) INTEGER B(M) COMPLEX C(L)
INTEGER LEN(3), DISP(3), TYPE(3), NEWTYPE, IA, IB, IC DATA TYPE /MPI_REAL, MPI_INTEGER, MPI_COMPLEX/, + LEN /N, M, L/
... ...
CALL MPI_ADDRESS(A, IA, IERR) CALL MPI_ADDRESS(B, IB, IERR) CALL MPI_ADDRESS(C, IC, IERR) DISPS(1)=0 DISPS(2)=IB-IA DISPS(3)=IC-IA
CALL MPI_TYPE_STRUCT(3, LEN, DISP, TYPE, NEWTYPE, IER) ... ...
CALL MPI_SEND(A, 1, NEWTYPE, ...) ... ...
ͬʱͬ A B C
4.12 4.ll пԸijɣ ... ...
DISPS(1)=IA DISPS(2)=IB DISPS(3)=IC
CALL MPI_TYPE_STRUCT(3, LEN, DISP, TYPE, NEWTYPE, IER) ... ...
CALL MPI_SEND(MPI_BOTTOM, 1, NEWTYPE, ...) ... ...
4.3 ͵ʹ ԭʼ⣬״Ϣ֮ǰͨ MPI_Type_commitύһԭʼ ڲҪʱӦõ MPI_Type_free ͷţԱͷռõϵͳԴ 4.3.1 ͵ύ C
int MPI_Type_commit(MPI_Datatype *datatype)
Fortran 77
MPI_TYPE_COMMIT(DATATYPE, IERR) INTEGER DATATYPE, IERR
һڱύͿԺ MPI ԭʼȫһϢʹá
һͽڴ͵м䲽ֱϢʹãؽύһʹϼͷš
4.3.2 ͵ͷ C
int MPI_Type_free(MPI_Datatype *datatype)
Fortran 77
MPI_TYPE_FREE(DATATYPE, IERR) INTEGER DATATYPE, IERR
MPI_Type_freeͷָ͡غdatatype ó
MPI_DATATYPE_NULLڽеʹø͵ͨŽɡһ͵ͷŶĻϴͲӰ졣
4.13
REAL U(N,M), V(N,M)
INTEGER IU, IV, CTYPE, LTYPE ... ...
CALL MPI_ADDRESS(U, IU, IERR) CALL MPI_ADDRESS(V, IV, IERR)
CALL MPI_TYPE_VECTOR(M, 1, N, MPI_REAL, CTYPE, IERR)
CALL MPI_TYPE_HVECTOR(2, 1, IV-IU, CTYPE, LTYPE, IERR) CALL MPI_TYPE_FREE(CTYPE, IERR)
CALL MPI_TYPE_HVECTOR(2, N, IV-IU, MPI_REAL, CTYPE,IERR) ... ...
! ux U(1:N,1),V(1:N,1)
CALL MPI_SEND(U(1,1), 1, CTYPE, ...) ! ux U(1,1:M),V(1,1:M)
CALL MPI_SEND(U(1,1), 1, LTYPE, ...) ! ux U(1:N,M),V(1:N,M)
CALL MPI_SEND(U(1,M), 1, CTYPE, ...) ! ux U(N,1:M),V(N,1:M)
CALL MPI_SEND(U(N,1), 1, LTYPE, ...) ... ...
4.14
REAL U(N,M), V(N,M)
INTEGER IU, IV, EX, CTYPE, LTYPE INTEGER LENS(3), DISPS(3), TYPES(3)
DATA LENS/1, 1, 1/, TYPES/MPI_REAL, MPI_REAL, MPI_UB/ ... ...
CALL MPI_ADDRESS(U, IU, IERR) CALL MPI_ADDRESS(V, IV, IERR)
CALL MPI_TYPE_EXTENT(MPI_REAL, EX, IERR) DISPS(1) = 0
DISPS(2) = IV - IU DISPS(3) = EX
CALL MPI_TYPE_STRUCT(3, LENS, DISPS, TYPES, CTYPE, IERR) DISPS(3) = EX*N
CALL MPI_TYPE_STRUCT(3, LENS, DISPS, TYPES, LTYPE, IERR) ... ...
! ux U(1:N,1),V(1:N,1)
CALL MPI_SEND(U(1,1), N, CTYPE, ...) ! ux U(1,1:M),V(1,1:M)
CALL MPI_SEND(U(1,1), M, LTYPE, ...) ! ux U(1:N,M),V(1:N,M)
CALL MPI_SEND(U(1,M), N, CTYPE, ...) ! ux U(N,1:M),V(N,1:M)
CALL MPI_SEND(U(N,1), M, LTYPE, ...) ... ...
4.3.3 MPI_Get_elements
MPI_Get_elementsMPI_Get_countƣصϢ MPI ԭʼ͵ĸMPI_Get_elementsص count ֵ MPI_UNDEFINEDĻȻMPI_Get_countصcountֵı
C
int MPI_Get_elements(MPI_Status *status, MPI_Datatype datatype, int *count)
Fortran 77
MPI_GET_ELEMENTS(STATUS, DATATYPE, COUNT, IERR)
INTEGER STATUS(MPI_STATUS_SIZE), DATATYPE, COUNT, IERR
~ 4.15 MPI Get elements:=04-ex4.f>
4.15 MPI Get elements 04-ex4.f 4.4 ݵĴ
MPIУͨʹ MPI_PACKEDû PVM еķʽͬݽдһηͳȥշյϢٽв 4.4.1 ݴ C
int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype, void *outbuf,
int outsize, int *position, MPI_Comm comm)
Fortran 77
MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE, + POSITION, COMM, IERR)
INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, + IERR
ú inbuf е incount Ϊ datatype ݽд ݷڻ outbuf outsize outbuf ܳ ֽǷԽãcomm ǷʹݽʹõͨpositionǴеλƣÿδһε MPI-PackǰûӦpositionΪ 0 MPI_Pack Զʹָδʹòֵʼλáÿε MPI-Pack positionʵϾѴݵܳȡ 4.4.2 ݲ C
int MPI_Unpack(void *inbuf, int insize, int *position, void *outbuf, int outcount,
MPI_Datatype datatype, MPI_Comm comm)
Fortran 77
MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, + DATATYPE, COMM, IERR)
INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, + IERR
MPI_UNPACKݲ MPI_Pack inbufв