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...