2013年8月21日 星期三

MPI基本函式介紹

MPI_Init (ierr)
啟動 MPI,所有 MPI 指令之前要有這個初始化指令,唯一個引數是必須宣告成整數的 ierr,如果初始化成功,則 ierr 的傳回值是零。

MPI_Finalize (ierr)
關閉 MPI,結束多個 CPU 協同工作的狀態。正常關閉的話則整數 ierr 的回傳值是零。

MPI_Comm_rank (communicator, my_rank, ierr)
獲得此 CPU 在全體多 CPU 中的排行順序,排名的編號會存在整數變數 my_rank 裏(從零開始),每個參與的 CPU 都會分到一個連號但不重覆的數字(像到郵局辦事領號碼牌那樣)。communicator 是在選通訊裝置,一般都是用預設的 MPI_COMM_WORLD 不用自己改(參見範例),至於 ierr 則是和前面一種作為錯誤或正常的旗標。

MPI_Comm_size (communicator, nproc, ierr)
獲得全體有多少個 CPU 的數目(通常用於切割工作份量的基礎),整數變數 nproc 回傳給每一個 CPU 同樣的數值,即共有多少個 CPU 正在一起工作。ierr 是錯誤回傳檢查用,communicator 的定義與用法跟前面的定義一樣。

MPI_Send (buf, count, datatype, dest, tag, communicator, ierr)
送出(由現在這個 CPU 送出一串資料給另一個 CPU),buf 是指要傳送的那一串資料變數的名稱(也就是第一筆資的位址),count 是資料的長度(從前面定的起點開始算起),datatype 是要被傳送之資料的數值型態,只有幾種常見的固定類型,如 MPI_REAL、MPI_INTEGER 等;整數 dest 是要傳的目的地 CPU 的 rank 編號,至於 整數 tag 則是寫程式的人自已設定的標籤。標籤的功能在這裏可以說明一下,當來源端 CPU 發送資料時,送出來的資料未必會被目的地 CPU 收到相同名稱的變數裏,有可能不止送一包資料,也有可能到達的先後順序會打亂,因此一定要利用標簽來設定每一包資料串有精準被接收到。
MPI_Send 指令是一個阻擋性 (blocking) 的指令,也就是說它要等到收到它在等待的東西才會釋放控制權給主程式去執行下一個指令。

MPI_Recv (buf, count, datatype, source, tag, communicator, status, ierr)
接收。其中前三個引數 buf、count、datatype 與前面定義一樣,souce 是來源 CPU 的編號,tag 則是要與送方指令相同的整數值,作為接收的認證。隨後的 communicator 與 ierr 與前面同。值得注意是 status ,它是用來表示接收的狀態。接收與送出有一點點不同,送出是可以立即動作的,然而接收就並不是下了接收指令就可以馬上進行完成,因為總是要等待資料到達。

MPI_Bcast(buf,n,mpi_datatype,i_src_node,MPI_COMM_WORLD,ierr)
廣播 (Broadcast),意指一個 CPU 放送資料出來,其他 CPU 接收,共同取得該比資料的內容。欲傳送資料的啟始位置是 buf 、長度(資料筆數)是 n 、 i_src_node 是 發送源 之 CPU 編號,其他 mpi_datatype 、MPI_COMM_WORLD、ierr 則是與前面的定義的一樣

MPI_Reduce(buf,result,n,mpi_datatype,mpi_op_type,i_trgt_node, MPI_COMM_WORLD,ierr)
收集各個 CPU 上的結果。其中 mpi_op_type 可以是 MPI_SUM 或 MPI_PRODUCT, 而結果則收集到 i_trgt_node 的 result 變數上(並不是每個 node 的 result 都更新)。

MPI_Get_processor_name (nodename,nchar,ierr)
nodename 是字串變數,它會回傳該 CPU 所在的機器名稱; nchar 是整數,回傳 nodename 內含的字元數

資料來源:

沒有留言:

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...