MPI編程入門詳解

      網友投稿 728 2022-05-30

      MPI簡介

      說到并行計算,我們有一個不可繞開的話題——MPI編程。MPI是一個跨語言的通訊協議,用于編寫并行計算機。支持點對點和廣播。MPI是一個信息傳遞應用程序接口,包括協議和和語義說明,他們指明其如何在各種實現中發揮其特性。MPI的目標是高性能,大規模性,和可移植性。MPI在今天仍為高性能計算的主要模型。與OpenMP并行程序不同,MPI是一種基于信息傳遞的并行編程技術。消息傳遞接口是一種編程接口標準,而不是一種具體的編程語言。簡而言之,MPI標準定義了一組具有可移植性的編程接口。

      筆者在上一篇文章《如何在win10+vs2013上配置MPI并行編程環境》中詳細介紹了如何在win10環境下配置MPI環境,還沒有配置編程環境的小伙伴建議查看這邊文章,以便于以后的學習(畢竟并行機不是你想擁有就能擁有的)。

      MPI基本函數

      MPI調用借口的總數雖然龐大, 但根據實際編寫MPI的經驗, 常用的MPI調用的個數確什么有限。 下面是6個最基本的MPI函數。

      1.? MPI_Init(…);

      2.? MPI_Comm_size(…);

      3.? MPI_Comm_rank(…);

      4.? MPI_Send(…);

      5.? MPI_Recv(…);

      6.? MPI_Finalize();

      我們在此通過一個簡單的例子來說明這6個MPI函數的基本用處。

      函數介紹

      1. int MPI_Init (int* argc ,char** argv[] )

      該函數通常應該是第一個被調用的MPI函數用于并行環境初始化,其后面的代碼到 MPI_Finalize()函數之前的代碼在每個進程中都會被執行一次。

      –? 除MPI_Initialized()外, 其余所有的MPI函數應該在其后被調用。

      –? MPI系統將通過argc,argv得到命令行參數(也就是說main函數必須帶參數,否則會出錯)。

      2. int MPI_Finalize (void)

      –? 退出MPI系統, 所有進程正常退出都必須調用。 表明并行代碼的結束,結束除主進程外其它進程。

      –? 串行代碼仍可在主進程(rank = 0)上運行, 但不能再有MPI函數(包括MPI_Init())。

      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:消息狀態。接收函數返回時,將在這個參數指示的變量中存放實際接收消息的狀態信息,包括消息的源進程標識,消息標簽,包含的數據項個數等。

      示例

      基本函數都已經介紹完,現在我們來用一個示例來加強對這些基本函數的理解。

      #include #include #include "mpi.h" void main(int argc, char* argv[]) { int numprocs, myid, source; MPI_Status status; char message[100]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); if (myid != 0) { //非0號進程發送消息 strcpy(message, "Hello World!"); MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD); } else { // myid == 0,即0號進程接收消息 for (source = 1; source < numprocs; source++) { MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf("接收到第%d號進程發送的消息:%s\n", source, message); } } MPI_Finalize(); } /* end main */

      運行結果如下圖所示

      執行結果

      可以看到,當筆者開啟四線程運行時,1-3號進程發送消息,0號進程接收到消息并打印;當筆者開啟八線程運行時,1-7號進程發送消息,0號進程接收到消息并打印。

      消息發送示意

      消息發送與接收函數的參數的一些重要說明。

      1.MPI標識一條消息的信息包含四個域:

      –? 源:發送進程隱式確定,進程rank值唯一標識.

      –? 目的:Send函數參數確定.

      –? Tag:Send函數參數確定, (0,UB) 232-1.

      –? 通信子:缺省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,否則會導致死鎖.

      MPI編程入門詳解

      5. 消息傳送被限制在同一個通信域內。

      6. 在send函數中必須指定唯一的接收者。

      任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Opengl es2.0 學習筆記(二)渲染管線
      下一篇:深度學習模型編譯技術
      相關文章
      丰满亚洲大尺度无码无码专线| 亚洲国产精品久久久天堂| 亚洲精品无播放器在线播放| 亚洲老妈激情一区二区三区| www.亚洲色图| 亚洲人成色777777老人头| 亚洲国产综合在线| 亚洲性色成人av天堂| 亚洲性69影院在线观看| 亚洲国产日韩在线一区| 亚洲免费电影网站| 亚洲五月丁香综合视频| 亚洲国产区男人本色在线观看| 亚洲一区二区免费视频| 涩涩色中文综合亚洲| 亚洲精品天堂在线观看| 亚洲日韩一区二区三区| 亚洲爆乳AAA无码专区| 婷婷亚洲综合五月天小说在线| 国产偷国产偷亚洲高清在线| 亚洲AV无码成人精品区大在线| | 中文字幕在亚洲第一在线| 精品国产日韩亚洲一区| 亚洲宅男天堂在线观看无病毒| 国产亚洲福利精品一区| 亚洲欧洲日韩国产综合在线二区| 亚洲综合婷婷久久| 亚洲剧情在线观看| 亚洲狠狠婷婷综合久久蜜芽| 亚洲av午夜精品一区二区三区 | 亚洲AⅤ永久无码精品AA| 亚洲人成国产精品无码| 亚洲人成色77777| 亚洲视频2020| 久久精品国产亚洲AV久| 国产精品亚洲av色欲三区| 中文字幕中韩乱码亚洲大片| 亚洲AV人人澡人人爽人人夜夜| 亚洲最大免费视频网| 亚洲av中文无码乱人伦在线观看|