windows平台下在Visual Studio2019配置MPI環境
MPI下載安裝
MPI windows版本的下載地址:https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi?redirectedfrom=MSDN
然后點擊這里下載:
圖中兩個文件都要選擇,下載。
下載完成后,點擊這兩個文件,都需要進行安裝。
項目配置
嘗試了一下,貌似使用VS配置MPI環境,創建的項目要是Windows桌面向導,其他的項目類型試了會出錯誤。
右擊項目->屬性,進行配置:
-
右上角->配置管理器->活動解決方案平台,選擇:x64;
-
VC++目錄->包含目錄,添加:“C:\Program Files %28x86%29\Microsoft SDKs\MPI\Include;”
-
VC++目錄->庫目錄,添加:“C:\Program Files %28x86%29\Microsoft SDKs\MPI\Lib\x64;”
-
C/C++ -> 預處理器->預處理器定義,添加:“MPICH_SKIP_MPICXX;”
-
C/C++ -> 代碼生成 -> 運行庫,選擇:多線程調試(/MTd);
-
鏈接器 -> 輸入 -> 附加依賴項,添加:“msmpi.lib;”
至此,環境就配好了,接下來就可以開始編程了。
測試
項目源文件下,新建.cpp文件,寫入以下代碼:
#include<stdio.h>
#include<mpi.h>
int main(int argc, char* argv[]) {
int myid, numprocs;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
printf("%d Hello world from process %d \n", numprocs, myid);
MPI_Finalize();
return 0;
}
讓我們來分析一下上面的代碼:
對於SPMD編程,程序員必須知道(1)進程編號,(2)多少個進程,(3)進程通信
那么MPI久提供了下列函數來回答這些問題:
- 用MPI_Comm_size 獲得進程個數p:
int MPI_Comm_size(MPI_Comm comm, int *size)
- 用MPI_Comm_rank 獲得進程的一個叫rank的值,該rank值為0到p-1間的整數,相當於進程的ID
int MPI_Comm_rank(MPI_Comm comm, int *rank)
- 通信組/通信子: MPI_COMM_WORLD
一個通信組是一個進程組的集合。所有參與並行計算的進程可以組合為一個或多個通信組。
執行MPI_Init后,一個MPI程序的所有進程形成一個缺省的組,這個組被寫作MPI_COMM_WORLD
該參數是MPI通信操作函數中必不可少的參數,用於限定參加通信的進程的范圍
下面我們來運行一下,看看結果:
在控制台該項目(這里的項目名稱mpi_test)下的x64/Debug文件目錄下打開cmd命令行窗口(Shift+鼠標左鍵,選擇'在此處打開Powershell窗口',輸入start cmd),輸入mpiexec -n 10 test.exe。
運行結果如下圖:
Linux下配置MPI編程環境-Ubuntu 18.04
終端配置過程
-
在終端上先找到文件所在位置:sudo tar -zxvf mpich-3.3.2.tar.gz
-
解壓完畢,使用ls命令查看便可發現多出了一個mpich-3.3.2目錄, 然后進入該目錄:cd mpich-3.3.2
使用ls查看,會發現其中有configure這個文件。
-
運行命令./configure -prefix=/usr/local/mpich進行軟件配置與檢查,這里我們只設置安裝目錄即可。注:prefix參數是表示安裝路徑。
可能會報錯error: no acceptable C compiler found in $PATH
要先使用命令sudo apt-get install build-essential安裝好需要的編譯器
-configure成功后就開始進行編譯和安裝了,使用make 2>&1|tee m.txt,進行編譯,將錯誤重定向寫入到m.txt中,如下圖所示:
之后就是漫長的等待-_-||,這個速度我甚至一度懷疑是不是我的操作有問題 ̄へ ̄ -
使用make install進行安裝,如下圖所示。
-
配置環境變量sudo vim /etc/profile
在文件中添加以下內容:
#set MPI path
MPI_HOME=/home/thyme/mpich-install/bin
PATH=${PATH}:${MPI_HOME}
export MPI_HOME
其中MPI_HOME后的路徑是mpich安裝的路徑,這里大家要根據自己的情況進行修改的。
- 測試配置是否成功,如果像下圖這樣,就說明已經配置成功了。
不得不吐槽,Ubuntu下配置MPI編程環境真是耗時耗力,中間make編譯時,頻繁出錯,我差點想砸電腦放棄了QAQ。
然而安裝成功,才賣出了一小步,我們接下來還要開啟一個虛擬機,在另一個虛擬機上執行以上同樣的步驟,至此才搭建了一個最小的集群系統,才能進行並行計算。
如果只是一般的編程,還是建議大家直接在windows系統下配置,用vs對每次建立的新項目配置一下。
Windows系統下OpenMP配置
visual studio2019配置
項目屬性 --> C/C++ --> 語言 --> OpenMP支持,下拉菜單選擇“是(/openmp)”,同時要將符合模式設置成“否”,否則編譯會報錯,如下圖所示:
測試
在使用具體實例測試之前,我們先來測試一下自己的計算機是幾核的。
#include<omp.h>
#include<iostream>
int main()
{
std::cout << "parallel begin:\n";
#pragma omp parallel
{
std::cout << omp_get_thread_num();
}
std::cout << "\n parallel end.\n";
std::cin.get();
return 0;
}
這是我的運行結果,所以說明處理器是8核的。
OpenMP中使用parallel指令標識代碼中的並行段:
#pragma omp parallel
{
多核並行執行的代碼;
}
當編譯器發現#pragma omp parallel for后,自動將下面的for循環分成N份,(N為電腦CPU核數),然后把每份指派給一個核去執行,而且多個核之間為並行執行。
下面是一個小實例:
#include <iostream>
int main()
{
#pragma omp parallel for
for (int i=0;i<10;i++)
std::cout<<i<<std::endl;
return 0;
}
控制台輸出:
運行結果: