MPI(Message-Passing Interface),並不是一種新的語言,而是訊息傳遞介面,它定義了一個可以被C、C++和Fortran程式呼叫的函數庫[1]。我們可以用MPI來進行進程間的通訊,以訊息傳遞的方式來對分佈式記憶體系統進行程式設計。通過安裝MPICH構建MPI程式設計環境,從而進行並行程式的開發。MPICH是MPI(Message-Passing Interface)的一個應用實現,支援最新的MPI-2介面標準,是用於並行運算的工具[2]。
直接執行利用apt安裝,執行下面 下麪的命令,按照提示操作即可,但是我安裝後使用還是有問題。
apt安裝命令:
apt-get install mpich
安裝之後可以利用第三部分提供的程式碼進行測試。
利用原始碼安裝。
gcc --version
g++ --version
cmake --version
gfortran --version
如果沒有直接sudo apt-get install xxx
安裝即可。
如果gfortran
安裝有問題,可以參考下面 下麪的:
sudo apt-get install gfortran
如果上面的命令,無法安裝gfortran
,則需要,顯示:
gfortran : 依賴: gfortran-7 (>= 7.3.0-12~) 但是它將不會被安裝 E: 無法修正錯誤,因爲您要求某些軟體包保持現狀,就是它們破壞了軟體包間的依賴關係
這表示有衝突了,所以可以採取如下命令安裝,aptitude
會提供一套解決衝突的方案,你可以根據提示選擇合適方案安裝,如果aptitude
沒有安裝的,那麼可以按照下面 下麪的安裝即可:
sudo apt install aptitude
sudo aptitude install gfortran
在你希望儲存的檔案路徑下執行下載命令:
wget http://www.mpich.org/static/downloads/3.3.2/mpich-3.3.2.tar.gz
如果一次下載失敗,可以繼續執行下面 下麪的命令,進行斷電重傳:
wget -c http://www.mpich.org/static/downloads/3.3.2/mpich-3.3.2.tar.gz
繼續執行下面 下麪的命令:
sudo tar -zxvf mpich-3.2.tar.gz
解壓完後, 進入解壓後的資料夾,進行設定(我的設定安裝位置爲 /home/mpi/mpich3。如果沒有root許可權,可以選擇使用者目錄/home/XXX/mpich3)(這個安裝路徑隨自己選的)。
./configure -prefix=/home/mpi/mpich3
如果出現以下錯誤
configure: error: No Fortran 77 compiler found. If you don't need to
build any Fortran progr
可能就是沒有安裝gfortran
.
設定完成後,執行編譯和安裝工作
make
make install
sudo gedit ~/.bashrc
在最後添上下面 下麪幾句話
export MPI_ROOT=/home/mpi/mpich3
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH
隨便找個地方新建一個測試檔案,mpi_hello.cpp,程式碼如下:
#include <iostream>
#include <string.h>
#include <mpi.h>
using namespace std;
const int max_string = 100;
int main ()
{
int comm_sz=0;
int my_rank=0;
char greeting[max_string];
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
if(my_rank!=0){
sprintf(greeting,"Greetings from process %d of %d!",my_rank,comm_sz);
MPI_Send(greeting,strlen(greeting),MPI_CHAR,0,0,MPI_COMM_WORLD);
}
else{
cout<<"Greetings from process "<<my_rank<<" of "<<comm_sz<<"!"<<endl;
for(int i=1;i<comm_sz;i++){
MPI_Recv(greeting,max_string,MPI_CHAR,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
cout<<greeting<<endl;
}
}
MPI_Finalize ();
return 0;
}
然後開啓terminal,進行編譯
mpicxx -g -Wall -o mpi_hello.o mpi_hello.cpp
注意: 如果用root身份執行,會提示不能直接執行,他會提示你要麼新增參數,要麼換個非root使用者身份執行,推薦換個身份執行。
其中:
mpicc 是編譯C程式的
mpicxx 是編譯C++程式的
-g 允許使用偵錯程式
-Wall 顯示警告(W大寫)
-o outfile.o 編譯出可執行的檔案,檔名爲outfile.o
-02 告訴編譯器對程式碼進行優化
編譯完成後,開始執行,可由-n後面的數位來調節建立進程數。
mpirun -n 4 ./mpi_hello.o
最後得到的結果爲,有可能順序不一樣
Greetings from process 0 of 4!
Greetings from process 1 of 4!
Greetings from process 2 of 4!
Greetings from process 3 of 4!
至此,MPI的安裝和測試全部完成。
[1] [美]Peter S.Pacheco.並行程式設計導論[M].鄧倩妮等譯註.北京:機械工業出版社,2012.8
[2] 百度百科, https://baike.baidu.com/item/MPICH/7488372?fr=aladdin
[3]Ubuntu18.10安裝MPICH, https://www.jianshu.com/p/74d30935f277
[4]我的並行計算之路(一)Ubuntu 16.04下的MPI安裝, https://blog.csdn.net/qq_30239975/article/details/77703321