1. 程式人生 > >MPI windows+VS環境下的配置+快速入門

MPI windows+VS環境下的配置+快速入門

簡述

MPI用於在windows下的高效能運算
目前主要用於在超級計算機上的平行計算
所以有興趣的做超級計算方面的,或者對這個感興趣的,學習下這個也蠻好的

可見下圖知乎內容,李沐大神的回答
在這裡插入圖片描述

安裝

進入到微軟的連結

https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi

  • 點選下圖中位置
    在這裡插入圖片描述

  • 在點選下圖示記位置

在這裡插入圖片描述

這時就會下載兩個檔案。點選這個兩個檔案,然後一路預設就好了(軟體非常小,不用擔心空間問題)

vs配置

按照下面圖的要求配置就好了

  • 先設定為debug模式,再設定為X64
    • 再給個提示,下面的配置中,每寫一頁的內容,就點應用一次。保證覆蓋掉原來的~

在這裡插入圖片描述

  • 這個寫對應的地址,如果你是預設的話,應該是跟我一樣的,你也可以去檢查下是否有對應的資料夾

在這裡插入圖片描述

  • 再改連結器
    這個無論你是否跟我一樣的安裝目錄,都寫一樣的

在這裡插入圖片描述

測試

測試的話,當然是使用類似於hello world的方式

MPI的邏輯

先簡單講講MPI的邏輯,MPI的話,會用一個mpiexec程式,去呼叫我們已經編譯好的mpi程式(.app或.exe或.out之類的) 然後,設定節點數目,讓同一個程式在不同的節點上跑起來。之後,給每個節點分配一個rank。

所以,在程式碼上我們就需要交待這個互動的邏輯,在一份程式碼中實現不同的節點的不同任務。
但是,注意到我們之前說的,是一份程式,讓不同節點來操作,唯一可以區分彼此的就是rank不同。因此,在程式碼中我們需要對rank進行判斷,根據不同的rank給出不同的操作的程式碼空間(一般是用if-else來實現的)

根據我們之前說的,除了匯入包之外,這裡我們一般必用的有四個函式。

  • 根據名字也能猜出對應的作用
    • 第一個做初始化的
    • 第二個獲取所有的節點數
    • 第三個獲取當前的rank數目
    • 第四個做收尾工作的
MPI_Init
(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Finalize();

例項程式碼

#include <mpi.h>
#include <stdio.h>
#include <string>
#include <string.h>
#pragma warning(disable : 4996)
const int MAX_STRING = 100;

int main() {
	char greeting[MAX_STRING];
	int comm_sz;
	int my_rank;

	MPI_Init(NULL, NULL);
	MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

	if (my_rank != 0) {
		sprintf(greeting, "Greetings from process %d of %d\n", my_rank, comm_sz);
		MPI_Send(greeting, strlen(greeting) + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
	}
	else {
		printf("Greetings from process %d of %d\n", my_rank, comm_sz);
		for (int i = 1; i < comm_sz; ++i) {
			MPI_Recv(greeting, MAX_STRING, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
			printf(greeting);
		}
	}
	MPI_Finalize();
}

在VS上編譯好,之後,找到.exe所在的資料夾

在這裡插入圖片描述

  • 用shift+滑鼠右鍵 會看到有命令列開啟(或者powershell)
    • 輸入下面的內容,就會輸出下面的節點數。注意,最好是數字不要超過電腦的數目,因為超過了也沒用,最多就是電腦的核數來進行計算,剩餘的都要來排隊。
PS D:\Code\C++\repo\MPITest\x64\Debug>mpiexec -n 4 ./MPITest.exe
Greetings from process 0 of 4
Greetings from process 1 of 4
Greetings from process 2 of 4
Greetings from process 3 of 4

在這裡插入圖片描述