初步的 MPI訊息傳遞函式

2021-06-18 23:19:31 字數 3587 閱讀 6784

1.點對點通訊(point-to-point) 

定義:給定屬於同一通訊器內的兩個程序,其中乙個傳送訊息,乙個接收訊息; 

mpi 系統定義的所有通訊方式均建立在點對點通訊之上; 

四種模式:標準模式、快取區模式、同步模式、就緒模式;

2.標準模式點對點通訊 

程序可以隨意地傳送(接收)訊息,與是否存在匹配的訊息接收(傳送)程序無關;

兩類:阻塞式:訊息傳送函式返回,使用者可以對訊息快取區進行處理,不會影響已傳送的訊息資料;接受函式返回,使用者可以使用接受到的訊息資料; 

非阻塞式:傳送和接受函式返回後,必須呼叫另一類函式來確保它們的正確完成;

阻塞式 

非阻塞式 

integer 

a integer 

a a=100 

a=100

mpi_send(a,1,… .) 

mpi_isend(a,1,… )

a=200 

a=200

訊息資料: a=100 

a=100 或 a=200

mpi_isend(a,1,… flag,… )

mpi_wait(flag,… )

a=200

訊息資料: a=100 

a=100 

3.點對點通訊函式舉例 

阻塞式標準訊息傳送函式

mpi_send(buf,count,datatype,dest,tag,comm,ierr) 

real*8(integer,…)buf

: 訊息傳送快取區起始位址(fortran,  使用者的待傳送的第乙個資料)

integer  count

:buf 起始的資料單元個數

integer  datatype

:資料型別(基本或使用者定義的) 

integer  dest

: 接收程序序號

integer  tag

: 訊息的標號

integer  comm 

: 通訊器

integer  ierr 

: 函式呼叫返回錯誤碼

real *8  a(100,100)

integer  b(60,60)

c-----傳送50 個雙精度數「a(5,20) : a(54,20)」 到2 號程序

call mpi_send( a (5,20),

50,mpi_double_precision,2, 

99999,mpi_comm_world,ierr )

c-----傳送20 個整型數「b(20,40) : b(39,40)」 到5 號程序

call mpi_send( b (20,40),20,mpi_double_precision,5, 99999,mpi_comm_world,ierr )

阻塞式標準訊息接收函式

mpi_recv(buf,count,datatype,dest,tag,comm,status, ierr) 

real*8(integer,…)buf 

: 訊息接收快取區起始位址(fortran,  使用者用於接受的第乙個資料)

integer  count 

:buf 起始的資料單元個數

integer  datatype 

:資料型別(基本或使用者定義的) 

integer  dest 

: 傳送程序序號

integer  tag 

: 訊息的標號

integer  comm 

: 通訊器

integer 

status(mpi_status_size) : 接收狀態陣列;

integer  ierr 

: 函式呼叫返回錯誤碼

real *8  a(100,100)

integer  b(60,60)

c-----從2 號程序接收50 個雙精度數到「a(5,20) : a(54,20)」 

call mpi_recv( a (5,20),50,mpi_double_precision,2, 99999,mpi_comm_world,status,ierr )

c-----從5 號程序接收20 個整型數到「b(20,40) : b(39,40)」 

call mpi_recv( b (20,40),20,mpi_double_precision,5, 99999,mpi_comm_world,status,ierr )

4.聚合通訊(collective communication)

定義:屬於同一通訊器的所有 mpi 程序均必須參與的通訊操作;

參與方式:呼叫同一聚合通訊函式; 

函式型別:

同步通訊函式:所有程序在某個程式點上同步; 

mpi_barrier ( comm , ierr )

全域性通訊函式:

廣播: mpi_bcast(buf,count,dtype,root,comm,ierr)

root 

傳送 other  接受

收集:mpi_gather(bufs,bufr,count,dtype,root,comm,ierr)

all 傳送大小一致的資料塊 

root 接受並按序號連續存放

全收集:mpi_allgather()

all 傳送 

all接受 

索引收集:mpi_gatherv() 

all 傳送大小不等的資料塊 

root 接受並按索引間斷存放

索引全收集:mpi_allgatherv()

all 傳送大小不等的資料塊 

all接受並按索引間斷存放 

分散:mpi_scatter(bufs,bufr,count,dtype,root,comm,ierr)

root 傳送連續的大小一致資料塊

all  接受 

索引分散: mpi_scatterv()

root 傳送間斷的大小不一致資料塊

all  接受

全交換:  mpi_alltoall() 

all 傳送大小一致資料塊到各程序

all接受大小一致資料塊並按序號連續存放 

索引全交換: mpi_alltoallv()

全域性規約(global reduction)函式:

規約: 

mpi_reduce(sbuf,rbuf,count,dtype,op,root, comm,ierr);

規約操作型別 op : 

mpi_sum, mpi_min, mpi_max,  mpi_prod等12種; 

全規約: mpi_allreduce(),  除要求將結果返回到所有程序外,與 mpi_reduce()一致;

規約分散: mpi_reduce_scatter(),將規約結果分散到各程序;

並行字首計算:mpi_scan()  

例子: 

求兩個向量的內積,並將結果返回程序0 

subroutine par_blas1(m,a,b,c,comm) 

real  a(m),b(m) 

! local slice of array

real  c 

如何傳遞函式

摘自 非同步 庫提供了一些函式,這些函式使您可以在元件之間傳遞訊息。這些訊息傳遞函式與各種訊息塊型別一起使用。有關併發執行時所定義的訊息塊型別的更多資訊,請參見非同步訊息塊。各節內容 本主題描述以下訊息傳遞函式 send 和 asend concurrency send 函式一條訊息傳送到指定目標同...

c 傳遞函式引數

傳遞普通函式和類的成員函式方式不同,原因是傳遞函式引數實際傳的是函式的位址,但是普通函式和成員函式的位址獲取方式不太相同。普通函式只要傳遞乙個函式名稱即可,但是成員函式在類的內部中沒有位址,選擇乙個成員函式就意味著得知道該函式在類中的偏移量,因此需要知道該物件和對應的偏移量,才能得到真實的位址。當然...

matlab傳遞函式構建函式tf

基本用法 tf num,den 其中num為分子的係數陣列,den為分母的係數陣列,都是按照自變數的冪進行降序排列,輸出為tf型別的連續時間傳遞函式 舉例 num 0 1224020 den 2 4622 tf num,den ans 12 s 3 24 s 2 20 2 s 4 4 s 3 6 s...