標籤:mpi 並行 visual studio 2012 windows 每天編程一小時
因為課程作業的緣故需要編寫並行計算的程式,準備寫一下MPI程式,MPI的全稱是Message Passing Interface即標準訊息傳遞介面,可以用於並行計算。MPI的具體實現一般採用MPICH。下面介紹如何在Windows 8系統下visual studio 2012中搭建MPI環境來編寫MPI程式。
安裝MPI實現庫
MPICH官網上給出了windows下的。可以看出連結到了微軟的官網,根據我的版本下載並安裝了HPC Pack 2012 SDK。然而在網上尋找資料發現都是關於MPICH2的,所以又下載安裝了這個,並根據部落格的內容進行了配置。後文的結果是我寫的hello world程式能夠成功運行,但前面安裝了兩次這個過程卻給我後面工作帶來了很大麻煩。
實現第一個MPI程式在visual studio 2012中建立控制台程式,配置mpi的include和Lib路徑。開啟應用程式屬性->VC目錄下變更。
加入代碼:
#include "stdafx.h"#include "mpi.h"#include <stdio.h>#include <math.h>#pragma comment (lib, "msmpi.lib")int _tmain(int argc, char* argv[]){int myid, numprocs;int namelen;char processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &myid);MPI_Comm_size(MPI_COMM_WORLD, &numprocs);MPI_Get_processor_name(processor_name, &namelen);fprintf(stderr, "Hello World! Process %d of %d on %s\n", myid, numprocs, processor_name);MPI_Finalize();return 0;}
運行得到:
說明程式正確運行。但是從程式運行中看到只運行了一個進程,沒有看到所謂的並行運算呀。別著急下一節進行介紹。
MPI並行運算
使用控制台命令調用上面的helloworld.exe程式,得到並行運算結果。輸入命令:
mpiexec -n 4 helloworld.exe
結果出現了下面的問題:
ERROR:unable to read the cmd header on the pmi context, Error = -1
stackoverflow上的大牛說明產生這個問題的原因在於系統中安裝了兩個版本的mpi,分別是c:\program files\mpich2\bin和c:\program files\microsoft hpc pack 2012\bin.
根據上面的方法,我將hpc pack 2012卸載了(因為到處都是MPICH的使用,所以就卸載了微軟提供的了),重新運行上面的命令,又產生了問題:
Please specify an authentication passphrase for smpd:
stackoverflow上提供的解決方案是使用wmpiregister進行註冊,具體方法參考資料1中提供了,但仍然沒有解決該問題。又卸載並重新安裝了MPICH這次,直接提示沒有mpiexec命令了。我猜想MPICH是由第三方庫提供的,而hpc pack 2012是微軟自己的東西,因此使用MPICH時需要進行一些環境上的配置,而hpc pack 2012不需要,所以又卸載了MPICH並安裝會pc pack 2012。這次再運行mpiexec命令竟然成功了!得到運行10次結果如下:
從上面結果還可以看出,系統調用不同線程的順序由系統隨機決定的,線程的結束時間無法確定。
一點感想:編程不光是個技術活也是個體力活,很多時候遇到一個問題需要不停的去google尋找解決方案,但我們平時遇到的大部分問題都是有很多人遇到過的,這個過程就要求我們不急不躁,仔細去尋找前人的解決方案了。
參考資料:
- windows xp下配置MPICH:http://blog.csdn.net/morewindows/article/details/6823436
- Error = -1問題的解決方案:http://stackoverflow.com/questions/10977026/mpi-runtime-errorunable-to-read-the-cmd-header-on-the-pmi-context-error-1
- authentication問題解決方案:http://stackoverflow.com/questions/13926882/please-specify-an-authentication-passphrase-for-smpd