1. 程式人生 > >並行環境搭建:Windows環境下的vs2013配置MPI

並行環境搭建:Windows環境下的vs2013配置MPI

下載MPICH,官方地址:

Windows下的MPI下載地址為:

因為MPI在Windows下只能支援到1.4版本,所以我只下載了1.4版本。

安裝完成後,在開始選單可以看到:


下面解決與vs的關聯問題:

新建專案,開啟屬性,包含目錄為MPICH2安裝目錄下的include,庫目錄為lib:


在前處理器中新增“ MPICH_SKIP_MPICXX ”:


在程式碼生成中選擇多執行緒除錯:


在連結器的輸入中,選擇附加依賴項,新增mpi.lib,如果下載的MPI檔案為Microsoft MPI (ms mpi)那麼需要新增的檔案為msmpi.lib:


執行程式碼進行測試:

#include<stdio.h>  
#include<string.h>  
#include"mpi.h"  

int main(int argc, char *argv[])  // main必須帶引數執行
{
	int myid, numprocs, source;
	MPI_Status status;

	char message[100];

	MPI_Init(&argc, &argv);//完成MPI程式的所有初始化,啟動MPI環境,標誌並行程式碼的開始

	printf("Hello World ! \n");
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*獲取程序的id,函式為int MPI_Common_rank(MPI_Comm comm,  int *rank) */
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs); /*獲取程序個數,函式為int MPI_Common_size(MPI_Comm comm,  int *size) */
	/*MPI_COMMON_WORLD為通訊組,一個通訊組是一個程序組和上下文的集合,上下文可以看作為組的超級標籤,用於區分不同的通訊組,該引數用於限定參加通訊的程序的範圍*/
	printf("I am %d of %d \n", myid, numprocs);

	if (myid != 0) //注意程序為非0
	{
		strcpy(message, "Hello World !");
		MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
		/*先將字串拷貝到傳送緩衝區message中,然後呼叫MPI_Send語句將它發出,用
		strlen(message)指定訊息的長度,用MPI_CHAR指定訊息的資料型別1,指明發往程序0, 使
		用的訊息標識是99 ,MPI_COMM_WORLD是包含本程序 和接收訊息的程序進
		程0 的通訊域,傳送方和接收方必須在同一個通訊域中,由通訊域來統一協調和控制訊息
		的傳送和接收*/
	}
	else
	{
		for (source = 1; source < numprocs; source++)
		{
			MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status);
			printf("%s\n", message);
			/*程序0直接執行接收訊息的操作,這裡它使用message作為接收緩衝區,由此可見,對於同一個變數在傳送程序和接收程序中的作用是不同的,它指定接收訊息的最大長度為100,訊息的資料型別為MPI_CHAR字元型,接收的訊息來自程序source ,而接收訊息攜帶的標識必須為99,使用的通訊域也是MPI_COMM_WORLD, 接收完成後的各種狀態資訊存放在status中,接收完成後它直接將接收到的字串列印在螢幕上*/

		}
	}
	MPI_Finalize(); // 結束MPI程式的執行,標誌並行程式碼結束,結束除主程序外其它程序
	return 0;
}

結果為:

程式已經生成完畢,現在可以進行並行運算:

首先開啟“開始-程式-MPICH2-wmpiregister.exe"進行身份登入:


這裡的賬號密碼為計算機登入時的賬號密碼,填寫完成後點選“Register”,結果如下:


點選“ok”,進行下一步,開啟“開始-程式-MPICH2-wmpiregister.exe"把剛生成的hello world程式放入到該程式中:

解決this  function or variable may be unsafe問題:


需要在“屬性”中的前處理器裡面新增“ _CRT_SECURE_NO_WARNINGS ”:


解決error LNK2019:無法解析的外部符號問題:


這是因為vs建立的專案系統和安裝的mpi系統不匹配,所以我們要把32位的專案更改3為64位的:

解決控制檯視窗閃退問題: