傳送和接收是 mpi 裡面兩個基礎的概念,接下來介紹 mpi 的同步(或阻塞, blocking)傳送和接收方法。
mpi 的傳送和接收方法是按以下方式進行的:開始的時候,a 程序決定要傳送一些訊息給 b 程序。a程序就會把需要傳送給b程序的所有資料打包好,放到乙個快取裡面。
所有資料會被打包到乙個大的資訊裡面,因此快取常常會被比作信封資料打包進快取之後,通訊裝置(通常是網路)就需要負責把資訊傳遞到正確的地方。這個正確的地方也就是根據特定秩確定的那個程序。
儘管資料已經被送達到 b 了,但是程序 b 依然需要確認它想要接收 a 的資料。一旦它確定了這點,資料就被傳輸成功了。程序 a 會接收到資料傳遞成功的資訊,然後去幹其他事情。
mpi_send
(void
* data,
int count,
mpi_datatype datatype,
int destination,
int tag,
mpi_comm communicator)
mpi_recv
(void
* data,
int count,
mpi_datatype datatype,
int source,
int tag,
mpi_comm communicator,
mpi_status* status)
方法定義是類似的。第乙個引數是資料快取。第二個和第三個引數分別描述了資料的數量和型別。mpi_send
會精確地傳送 count 指定的數量個元素,mpi_recv
會最多接受 count 個元素。第四個和第五個引數指定了傳送方/接受方程序的秩以及資訊的標籤。第六個引數指定了使用的 communicator。mpi_recv
方法特有的最後乙個引數提供了接受到的資訊的狀態。
舉例來說,如果乙個程序想要傳送乙個整數給另乙個程序,它會指定 count 為 1,資料結構為mpi_int
。預設的 mpi 資料結構以及它們在 c 語言裡對應的結構如下:
mpi datatype
c equivalent
mpi_short
short int
mpi_int
intmpi_long
long int
mpi_long_long
long long int
mpi_unsigned_char
unsigned char
mpi_unsigned_short
unsigned short int
mpi_unsigned
unsigned int
mpi_unsigned_long
unsigned long int
mpi_unsigned_long_long
unsigned long long int
mpi_float
float
mpi_double
double
mpi_long_double
long double
mpi_byte
char
之後可以建立自己的 mpi 資料型別來構建更複雜的訊息型別
#include
#include
#include
intmain()
else
if(world_rank ==1)
}
>>
> mpirun -n 2 ./send_recv
process 1 received number -1 from process 0
#include
#include
#include
intmain()
// 假設兩個程序一直互動直到到達限制次數
int ping_pong_count =0;
int partner_rank =
(world_rank +1)
%2;while
(ping_pong_count < ping_pong_limit)
else
}mpi_finalize()
;}
接收列印順序隨機器不同可能列印不同
>>
> mpirun -n 2 ./ping_pong
0 sent and incremented ping_pong_count 1 to 1
0 received ping_pong_count 2 from 1
0 sent and incremented ping_pong_count 3 to 1
0 received ping_pong_count 4 from 1
0 sent and incremented ping_pong_count 5 to 1
0 received ping_pong_count 6 from 1
0 sent and incremented ping_pong_count 7 to 1
0 received ping_pong_count 8 from 1
0 sent and incremented ping_pong_count 9 to 1
0 received ping_pong_count 10 from 1
1 received ping_pong_count 1 from 0
1 sent and incremented ping_pong_count 2 to 0
1 received ping_pong_count 3 from 0
1 sent and incremented ping_pong_count 4 to 0
1 received ping_pong_count 5 from 0
1 sent and incremented ping_pong_count 6 to 0
1 received ping_pong_count 7 from 0
1 sent and incremented ping_pong_count 8 to 0
1 received ping_pong_count 9 from 0
1 sent and incremented ping_pong_count 10 to 0
#include
#include
#include
intmain()
else
mpi_send
(&token,
1, mpi_int,
(world_rank +1)
% world_size,
0, mpi_comm_world)
;// 程序0保證了在想要接受資料之前傳送了 token
if(world_rank ==0)
mpi_finalize()
;}
列印出來的資料是跟資料傳遞的次序一樣的
>>
> mpirun -n 5 ./ping_pong
process 1 received token -1 from process 0
process 2 received token -1 from process 1
process 3 received token -1 from process 2
process 4 received token -1 from process 3
process 0 received token -1 from process 4
mpi 教程 python平行計算 python平行計算
0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...
平行計算模型
平行計算模型通常指從並行演算法 的設計和分析出發,將各種並行計算機 至少某一類並行計算機 的基本特徵抽象出來,形成乙個抽象的計算模型。從更廣的意義上說,平行計算模型為平行計算提供了硬體和軟體介面 在該介面的約定下,並行系統硬體設計者和軟體設計 者可以開發對並行性 的支援機制,從而提高系統的效能。有幾...
平行計算模型
平行計算指的在同一時刻存在多於乙個計算任務被執行。由於cpu主頻提高的上限,使用多核心處理器進行平行計算早已成為主流。gpu也是乙個多核心的處理器,但它的平行計算模型與多核的cpu有很大區別。我們有必要了解gpu的並計算模型。對平行計算模式進行分類是了解cpu和gpu平行計算區別的有效方式。一種分類...