MPI並行程序設計原理--基礎知識

MPI並行程序設計原理–基礎知識

前言

消息傳遞並行程序設計

指用戶必須通過顯式地發送和接收消息來實現處理機間的數據交換。在這種並行編程中,每個並行進程均有自己獨立的地址空間,相互之間訪問不能直接進行,必須通過顯式的消息傳遞來實現。
這種編程方式是大規模並行處理機(MPP)和機羣( luster)採用的主要編程方式。
並行計算粒度大,特別適合於大規模可擴展並行算法。
由於消息傳遞程序設計要求用戶很好地分解問題,組織不同進程間的數據交換,並行計算粒度大,特別適合於大規模可擴展並行算法。
消息傳遞是當前並行計算領域的一個非常重要的並行程序。

什麼是MPI?

Massage Passing Interface:是消息傳遞函數庫的標準規範,由MPI論壇開發,支持 Fortran和C。
MPI是一種新的庫描述,不是一種語言。共有上百個函數調用接口,在 Fortran和C語言中可以直接對這些函數進行調用。
MPI是一種標準或規範的代表,而不是特指某一個對它的具體實現。
MP是一種消息傳遞編程模型,併成爲這種編程模型的代表和事實上的標準。

C中的MPI約定

1.必須包含mpi.h頭文件。
2.MPI_ 前綴,只有MPI以及MPI_標誌後的第一個字母大寫,其餘小寫。

MPI中基本函數

1.MPI_Init(int *argc,char *argv)
—MPI程序的第一個調用,完成MPI程序的所有初始化工作。所有的MPI的第一條可執行語句都是這個語句。
–  啓動MPI環境,標誌並行代碼的開始。
–  並行代碼之前,第一個MPI函數(除MPI_Initialize()外)。
–  main函數必須帶參數運行,否則出錯。

2.MPI_Finalize(void)
–  MPI程序的最後一個調用,結束MPI程序的運行,是MPI程序的最後一條可執行語句。否則程序的運行結果是不可預知的。
–  標誌並行代碼的結束,結束除主進程外的其他進程。
–  之後串行代碼仍可在主進程(rank=0)上運行。

3.int MPI_Comm_size (MPI_Comm comm ,int* size )
–  獲得進程個數 size。
–  指定一個通信子,也指定了一組共享該空間的進程, 這些進程組成該通信子的group(組)。
–  獲得通信子comm中規定的group包含的進程的數量。

4.int MPI_Comm_rank (MPI_Comm comm ,int* rank)
–  得到本進程在通信空間中的rank值,即在組中的邏輯編號(該 rank值爲0到p-1間的整數,相當於進程的ID。)

5.int MPI_Send( void *buff, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
– void *buff:你要發送的變量。
– int count:你發送的消息的個數(注意:不是長度,例如你要發送一個int整數,這裏就填寫1,如要是發送“hello”字符串,這裏就填寫6(C語言中字符串未有一個結束符,需要多一位))。
– MPI_Datatype datatype:你要發送的數據類型,這裏需要用MPI定義的數據類型,可在網上找到,在此不再羅列。
– int dest:目的地進程號,你要發送給哪個進程,就填寫目的進程的進程號。
– int tag:消息標籤,接收方需要有相同的消息標籤才能接收該消息。
– MPI_Comm comm:通訊域。表示你要向哪個組發送消息。

6.int MPI_Recv( void *buff, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
– void *buff:你接收到的消息要保存到哪個變量裏。
– int count:你接收消息的消息的個數(注意:不是長度,例如你要發送一個int整數,這裏就填寫1,如要是發送“hello”字符串,這裏就填寫6(C語言中字符串未有一個結束符,需要多一位))。它是接收數據長度的上界. 具體接收到的數據長度可通過調用MPI_Get_count 函數得到。
– MPI_Datatype datatype:你要接收的數據類型,這裏需要用MPI定義的數據類型,可在網上找到,在此不再羅列。
– int dest:接收端進程號,你要需要哪個進程接收消息就填寫接收進程的進程號。
– int tag:消息標籤,需要與發送方的tag值相同的消息標籤才能接收該消息。
– MPI_Comm comm:通訊域。
– MPI_Status *status:消息狀態。接收函數返回時,將在這個參數指示的變量中存放實際接收消息的狀態信息,包括消息的源進程標識,消息標籤,包含的數據項個數等。

消息發送與接收函數的參數的一些重要說明。
1.MPI標識一條消息的信息包含四個域:
–  源:發送進程隱式確定,進程rank值唯一標識.
–  目的:Send函數參數確定.
–  Tag:Send函數參數確定.
–  通信子:缺省MPI_COMM_WORLD
•  Group:有限/N,有序/Rank [0,1,2,…N-1]
•  Contex:Super_tag,用於標識該通訊空間.
2. buffer的使用
buffer必須至少可以容納count個由datatype指明類型的數據. 如果接收buf太小, 將導致溢出、 出錯
3. 消息匹配
–  參數匹配source,tag,comm/dest,tag,comm.
–  Source == MPI_ANY_SOURCE: 接收任意處理器來的數據(任意消息來源).
–  Tag == MPI_ANY_TAG: 匹配任意tag值的消息(任意tag消息).
4. 在阻塞式消息傳送中不允許Source == dest,否則會導致死鎖。
6. 消息傳送被限制在同一個通信域內。
7. 在send函數中必須指定唯一的接收者。

MPI程序的編譯與執行

需要已經裝好MPICH

以Hello.c文件爲例
編譯:

mpicc -o hello hello.c
--生成可執行文件hello	

執行:

mpirun -np 4 hello
--4 指定np的實參,表示進程數,由用戶指定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章