mpi學習日誌 2 mpi4py與點對點通訊

2021-07-15 04:11:53 字數 1858 閱讀 8808

前文說到,mpi是資訊傳遞介面,因此資訊傳遞是mpi的重點.而程序中的資訊傳遞就是程序通訊!今天我們將看看mpi建立的一組程序是怎麼相互通訊的.

程序通訊有許多種,點對點通訊,廣播,散播等.今天我們先學習點對點通訊.

什麼是點對點通訊?其實就是最簡單的程序a向程序b傳送資訊,而程序b向程序a接收資訊.這是關於兩個程序之間的通訊.

執行結果:

**解釋:

我們看見,程序1得到了程序0的資料,乙個int,值為1.

使用到的一組方法是comm物件的send和recv.

send方法的第乙個引數就是你要傳送的資料,這個資料可以是乙個int,乙個float,還可以是列表,字典,甚至是numpy的array物件(你可以試一下)

send方法還有乙個dest引數,這就是你想傳送的程序的rank.

而recv方法在這裡只使用了乙個引數source,就是你要指定的傳送方程序的rank.

阻塞or非阻塞?

一談到訊息傳遞,大家都會想到同步非同步的問題,這就涉及到函式的阻塞性.那麼,上面的send和recv方法是阻塞函式還是非阻塞函式?

recv是阻塞函式,也就是說程序要收到傳送方的資料,這個函式才返回.

而send是不確定的,也就是說它有時候是阻塞,有時候是非阻塞.當傳送的資料不多的時候,mpi會將資料存到乙個系統緩衝區,然後馬上進行send方法的返回.而當資料量很大超過緩衝區的大小的時候,mpi需要等待接收方接收,然後把資料拷貝給接收方,再進行send方法的返回.

簡單來說,資料量少->非阻塞,資料量大->阻塞.

小寫or大寫?

細心的同學還會發現,comm物件除了send和recv方法,還有send和recv方法.乙個字母小寫和大寫之差,到底意味著什麼?

事實上,不止send和recv方法,以後學到的所有資訊傳遞方法都會有這小寫大寫兩個版本.

這裡參考官方文件說法,這樣區分是由於要傳遞的資料的性質差異.當我們要傳遞int,float,list,dict等python內建型別的資料的時候,我們使用小寫的方法.而當使用buffer型別的資料的時候,我們要使用大寫的方法.

buffer型別是什麼意思我還未理解,希望有人告訴我一下.

send的多個版本:

事實上,除了大寫小寫的版本,send還有不同的版本,這個不同是基於不同的傳送策略的,而這些版本都有大小寫之分.

bsend:緩衝模式,資料寫入緩衝區,馬上返回,使用者必須確保緩衝區大小足夠

ssend:同步模式,等接收方接收才返回

rsend:就緒模式,傳送時必須確保接收方處於等待接收的狀態,否則產生錯誤

send:標準模式(bsend+ssend)

send實際上就是bsend和ssend的結合體.而rsend的意義我暫時不知道,一般在初學的時候,我們就使用標準模式send就好了.

另一種意義的阻塞or非阻塞

除了大小寫之外,mpi還為大部分的通訊函式提供了阻塞和非阻塞這兩種方式,非阻塞的在阻塞版本的前面加i或者i.例如isend,ibsend,issend,irsend.

不是說bsend就是非阻塞了嗎,那ibsend又是什麼意思?

這裡的阻塞是針對資訊的拷貝工作的.當使用bsend的時候,資料拷貝到緩衝區後,函式才返回.而使用ibsend的時候,拷貝的工作是交給mpi後台來完成,而在實際進行拷貝的時候,函式早已經返回了.

總結:

實際上,除了send,其他版本的send我都沒有用過,這些版本在這裡也只是知識的拓展,以後如果有需要,會另外詳細說明其原理和用法.

mpi學習日誌 13 mpi4py與非阻塞型函式

繼續填坑.前面第二篇也說過,很多函式有分阻塞型版本和非阻塞型版本,非阻塞型版本的名字比阻塞型的名字多乙個i字首.那麼,非阻塞型函式又是怎麼回事?我們知道,點對點通訊裡的recv函式是乙個阻塞函式,也就是接收方要等傳送方傳送了資訊,函式才能返回.那麼對應的,非阻塞型函式就是,不管傳送方是否傳送了資訊,...

mpi學習日誌 5 mpi4py與多點通訊續

在多點通訊裡我們已經學習了廣播bcast,散播scatter,收集gather,規約reduce.今天我們再來簡略看一些可能更為少用的多點通訊.簡單來說就是收集 廣播.gather中只有根程序會得到收集到的資訊,而allgather則是所有程序都會得到收集到的資訊,就相當於收集後再廣播一次.redu...

mpi學習日誌 1 mpi與python

mpi是什麼?它用來幹什麼?mpi是資訊傳遞介面 message passing inte ce 簡單來說就是乙個用來實現程序通訊的庫.它很多時候用於並行演算法的設計.下面我們先使用windows環境下python語言來了解mpi的使用.mpi在python的環境還是很好配置的.首先你得安裝好pyt...