Windows和Linux系統下並行計算環境MPI和OpenMP的搭建


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;
}

控制台輸出:

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM