集群函式相對於點對點函式來說效率更高,mpi提供了豐富的通訊形式。而且3.0版本以後提供了非阻塞的集群通訊方式。
會更直觀一些
這個就比較優秀了,與廣播分發給每乙個程序的資料都不相同。
allgather是讓每乙個程序都獲取所有程序的資料。
重點理解一下函式各個引數就明白了,且來看函式原型
mpi_type_struct( oldtype_nums 結構體型別個數,相同型別一塊空間
,blocklens_array 每個型別所對應的那塊空間的長度
,displs_array 每塊的起始位址
,old_type_array 指定每個塊的起始位址與頭的偏移量
,&new_mpi_type 新型別
);
這裡假設有乙個集群,需要對每乙個電腦的運算速度進行排序,如果使用了結構體會更方便。
就下面這段**來說,用allgather讓每個電腦獲得所有電腦的速度,然後每個電腦遍歷一遍這個資料,記錄下比自己運算速度大的個數,最後就可以知道自己在急群眾運算速度的排名了。
#include
#include
"mpi.h"
#include
#include
#define oldtype_nums 2
#define int_nums 1
#define long_nums 1
int main (
int argc,
char
**ar**)
computer;
mpi_comm comm = mpi_comm_world;
mpi_status status;
int size,rank,speed,i,index;
mpi_init
(&argc,
&ar**)
;mpi_comm_size
(comm,
&size)
;mpi_comm_rank
(comm,
&rank)
;int blocklens_array[oldtype_nums]
;//用於存放每個塊的長度
mpi_aint displs_array[oldtype_nums]
;//使用mpi_aint,單個元素的存放空間可以放得下位址。
mpi_datatype old_type_array[oldtype_nums]
;//用於存放每個塊的型別
mpi_datatype mpi_computer;
computer mycomputer;
old_type_array[0]
=mpi_long;
old_type_array[1]
=mpi_int;
blocklens_array[0]
=1; blocklens_array[1]
=1;mpi_address
(&mycomputer.index,
&displs_array[1]
);mpi_address
(&mycomputer.speed,
&displs_array[0]
);displs_array[1]
=displs_array[1]
-displs_array[0]
; displs_array[0]
=0;mpi_type_struct
(oldtype_nums,blocklens_array,displs_array,old_type_array,
&mpi_computer)
;mpi_type_commit
(&mpi_computer)
; computer *computer=
null
; computer =
(computer*
)malloc
(sizeof
(computer));
computer *computers=
null
; computers =
(computer*
)malloc
(sizeof
(computer)
*size)
; computer->speed=rank;
computer->index=0;
mpi_allgather
(&computer->speed,
1,mpi_computer,
&computers->speed,
1,mpi_computer,comm)
;for
(i=0
;i)printf
("the index of process %d is %d ,speed is %ld\n"
,rank,computers[rank]
.index,computers[rank]
.speed)
;mpi_finalize()
;return0;
}
c 中Socket通訊函式之select
select函式決定乙個或者多個套接字 socket 的狀態,如果需要的話,等待執行非同步i o。int select in int nfds,inout fd set readfds,inout fd set writefds,inout fd set exceptfds,int const st...
c 中Socket通訊函式之select
select函式決定乙個或者多個套接字 socket 的狀態,如果需要的話,等待執行非同步i o。int select in int nfds,inout fd set readfds,inout fd set writefds,inout fd set exceptfds,int const st...
作業系統 程序間通訊函式
一 程序間通訊之訊息佇列 訊息佇列 是在訊息的傳輸過程中儲存訊息的容器。對訊息佇列有寫許可權的程序可以向訊息佇列中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊...