µ±Ç°Î»ÖãºÊ×Ò³ > 并行算法讲义 - 百度文库
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_elementsÓëMPI_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Öвð°ü
¹²·ÖÏí92ƪÏà¹ØÎĵµ