C 平行計算 MPI Tutorial 2

2021-10-24 12:00:08 字數 3948 閱讀 8145

傳送和接收是 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平行計算區別的有效方式。一種分類...