mpi學習日誌 1 mpi與python

2021-07-15 04:02:51 字數 1652 閱讀 1731

mpi是什麼?它用來幹什麼?

mpi是資訊傳遞介面(message passing inte***ce),簡單來說就是乙個用來實現程序通訊的庫.它很多時候用於並行演算法的設計.

下面我們先使用windows環境下python語言來了解mpi的使用.

mpi在python的環境還是很好配置的.首先你得安裝好python和pip.然後直接用pip安裝mpi在python的庫,mpi4py.

然後我們需要安裝mpi,去mpi的官網找.**

安裝後在安裝目錄的bin資料夾裡會有很重要的乙個程式mpiexec.exe:

為了方便執行程式,安裝的時候,這個路徑會自動新增到環境變數裡.如果你開啟命令列cmd,輸入mpiexec回車發現cmd沒有找到這個程式,你最好手動新增這個環境變數.

環境變數設定好後,在cmd執行mpiexec會輸出一些幫助資訊.

是msmpi而不是mpich2.,詳情我也不太清楚.不過對於py上的開發,只要安裝目錄裡有mpiexec.exe這個程式就行了.

安裝完mpi和mpi4py之後,我們就可以編寫**了.**樣例是最簡單的每個程序輸出它的rank(什麼是rank?下面解釋).

**很簡單,執行命令和結果為下圖:

我們先看命令,注意到執行命令不是簡單的python ***.py,因此使用未配置好的ide執行這個py檔案可能導致執行失敗.

在命令中,-n表示程序數.mpiexec在執行的時候會建立一組完全相同的程序,而這個程序組有多少個程序就是由這個引數-n決定,圖中例子為4個.

4後面的引數實際上是要執行的乙個exe,由於py不是c/c++那樣先編譯出乙個exe後執行它,而是動態解釋.因此我們要執行的就是python.exe這個直譯器,而這個python又帶有引數test.py,表示要執行的是test.py這個py檔案.

看完命令再看**.第2行是乙個import語法,把mpi這個名字import進來.

第4行的comm是乙個很重要的物件,之後的操作都圍繞它來展開.

第5行通過comm物件的get_rank()方法獲取當前程序的rank.什麼是rank,你當成是程序id去理解吧.這裡的rank是從0開始,不斷加1.第6行則是用get_size方法獲取這組程序的程序數.

可能你已經發現了,在**裡我只print了一行,但在實際執行卻輸出了4行,並且輸出的東西還是不同的,並且是亂序的.

這其實就是mpiexec做的工作,它讓這個test.py檔案並行地執行了4次,而不需要像python的thread庫那樣在**裡先宣告多少個執行緒.

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

前文說到,mpi是資訊傳遞介面,因此資訊傳遞是mpi的重點.而程序中的資訊傳遞就是程序通訊 今天我們將看看mpi建立的一組程序是怎麼相互通訊的.程序通訊有許多種,點對點通訊,廣播,散播等.今天我們先學習點對點通訊.什麼是點對點通訊?其實就是最簡單的程序a向程序b傳送資訊,而程序b向程序a接收資訊.這...

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

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

並行作業1 MPI安裝,及示例程式執行

1.1 安裝環境 1 作業系統 ubuntu 16.04.4 64位 2 g 版本 gcc version 5.4.0 2 安裝包 mpich 3.2.1.tar.gz 1.3安裝與測試 1 將安裝包壓縮到 usr local mpich目錄下 建立mpich資料夾 cd usr local sud...