並行環境搭建:Windows環境下的vs2013配置MPI
阿新 • • 發佈:2019-02-05
下載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:無法解析的外部符號問題:
解決控制檯視窗閃退問題: