Ubuntu 18.04下的MPICH安裝

2020-08-11 22:33:48

MPI(Message-Passing Interface),並不是一種新的語言,而是訊息傳遞介面,它定義了一個可以被C、C++和Fortran程式呼叫的函數庫[1]。我們可以用MPI來進行進程間的通訊,以訊息傳遞的方式來對分佈式記憶體系統進行程式設計。通過安裝MPICH構建MPI程式設計環境,從而進行並行程式的開發。MPICH是MPI(Message-Passing Interface)的一個應用實現,支援最新的MPI-2介面標準,是用於並行運算的工具[2]。

1.安裝方案一

直接執行利用apt安裝,執行下面 下麪的命令,按照提示操作即可,但是我安裝後使用還是有問題。
apt安裝命令:

apt-get install mpich

安裝之後可以利用第三部分提供的程式碼進行測試。

2.安裝方案二

利用原始碼安裝。

1. 確保已經安裝瞭如下軟體:

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

2.下載原始碼:

在你希望儲存的檔案路徑下執行下載命令:

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

3.解壓

繼續執行下面 下麪的命令:

sudo tar -zxvf mpich-3.2.tar.gz

4.設定路徑

解壓完後, 進入解壓後的資料夾,進行設定(我的設定安裝位置爲 /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.

5.編譯和安裝

設定完成後,執行編譯和安裝工作

make
make install 

6.新增環境變數

sudo gedit ~/.bashrc

在最後添上下面 下麪幾句話

export MPI_ROOT=/home/mpi/mpich3
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH

3.測試

隨便找個地方新建一個測試檔案,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