經過安裝MPICH構建MPI編程環境,從而進行並行程序的開發。MPICH是MPI(Message-Passing Interface)的一個應用實現,支持最新的MPI-2接口標準,是用於並行運算的工具。MPICH的開發與MPI規範的制訂是同步進行的,所以MPICH最能反映MPI的變化和發展。linux
open mpi 和mpich都是mpi的應用。它們都是採用MPI標準,在並行計算中,實現節點間通訊的開源軟件。各自有各自的函數,指令和庫。而MPICH2是MPICH的一個版本。(通常來講,open mpi 更適合Mac,mpich更適合linux。)編程
『win10:【教程】http://blog.csdn.net/wr132/article/details/48285789windows
【共享網盤:安裝包32-64】http://pan.baidu.com/s/1qWGFXQs』 api
win7中安裝軟件都須要管理員權限,而在安裝MPICH2的時候須要始終以同一個用戶以管理員的身份安裝。不然, mpiexec在具體執行的時候,會出現要求要求管理員權限的錯誤。網絡
MPICH2下載地址:http://www.mcs.anl.gov/research/projects/mpich2/多線程
win7下smpd.exe這個組件沒有自動運行安裝,須要你在管理員的帳戶下運行,進行安裝註冊。方法就是:以管理員身份運行cmd,改變路徑到到MPICH2的路徑下找bin,進入以後,smpd -install -phrase pwd;ide
後面具體的配置過程在網上能夠找到,記錄一下:函數
1)而後用VS建立一個C++的Win32控制檯空項目,加入你的資源文件。
2)打開項目屬性對話框。
3)進入配置屬性
1>配置爲Debug和Release的時候,「C/C++」選項卡里面的「代碼生成」選項卡,選擇「運行時庫」爲「多線程(/MT)」;
2>配置爲全部配置的時候,「C/C++」選項卡里面的「常規」選項卡,爲「附加包含目錄」加入目錄「C:\Program Files\MPICH2\Include」;
3>配置爲全部配置的時候,「連接器」選項卡里面的「常規」選項卡,爲「附加庫目錄」加入目錄「C:\Program Files\MPICH2\Lib」;
4>配置爲全部配置的時候,「連接器」選項卡里面的「命令行」選項卡,爲「附加選項」加入「mpi.lib fmpich2.lib」。
5>配置爲Debug的時候,「連接器」選項卡里面的「命令行」選項卡,爲「附加選項」加入「cxxd.lib」;
6>配置爲Release的時候,「連接器」選項卡里面的「命令行」選項卡,爲「附加選項」加入「cxx.lib」。
7>上面庫文件中mpi.lib是用於C語言庫,cxx.lib是用於C++語言庫(cxxd.lib是debug版本),fmpich2.lib是用於Fortran語言庫,可根據使用狀況相應增減。
8>進入常規->(項目默認值)MFC的使用,右邊選擇->在靜態庫中使用 MFC,可以使生成的.exe文件拷貝到其它電腦也能單獨運行。
4)配置完成,能夠編譯並運行你的並行程序了。工具
這個過程在官網上也有說明:性能
http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.3.2-windevguide.pdf
最後,因爲mpiexec執行是經過port進行線程間交換數據的,因此若是遇到問題,還要注意配置防火牆配置。除了一些第三方防火牆,好比360防火牆要設置外,也不要設置windows自身帶的防火牆。若是不會設置,最簡單的方法就是將防火牆通通關閉。在不使用mpiexec的時候再打開防火牆。
問題:未解析外部符號「符號」
代碼引用連接器在庫和目標文件中找不到的東西(如函數,變量或標籤)。
【http://blog.csdn.net/tianguokaka/article/details/43409707】
該網友基本上講的是他在使用MFC函數庫時與默認庫衝突了,因此要先連接(在連接器配置)你要使用的。
而後我又查了一下什麼樣的衝突,多是兩個庫存在使用相同名稱的函數等,產生使用時指代不明或不能實現相應效果,【http://bbs.csdn.net/topics/120098536】裏面有人建議使用bll動態庫,或者從新包裝庫,或者使用函數指針加載並執行(即每次使用函數時都要指明出處)、或者只用名字空間。
而後又查了一下MFC,有人問::做用,有人答:::取全局做用域,對於MFC而言加了的是調用win api,不加的是調用mfc的庫。通常調用win api的參數中會多個窗口或者DC句柄。
#include "mpi.h"
#include <cstdio>
#include < math.h>
int main(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," Process %d of %d SAY HELLO TO MPI on %s\n",
myid, numprocs, processor_name);
MPI_Finalize();/**//*結束*/
return 0;
}
附:【http://stackoverflow.com/questions/2427399/mpich-vs-openmpi】
一個關於MPICH的常見投訴是它不支持InfiniBand,而OpenMPI則不支持。 然而,MVAPICH和英特爾MPI(二者都是MPICH衍生產品)支持InfiniBand,所以若是有人願意將MPICH定義爲「MPICH及其衍生產品」,則MPICH具備極其普遍的網絡支持,包括InfiniBand和專有 互連如Cray Seastar,Gemini和Aries以及IBM Blue Gene(/ L,/ P和/ Q)。 OpenMPI也支持Cray Gemini,但它不是Cray不支持的。 最近,MPICH經過netmod支持InfiniBand,但MVAPICH2具備普遍的優化,使其成爲幾乎全部狀況下的首選實現。
MPICH已是MPI標準的每一個單獨版本的第一個實現,從MPI-1到MPI-3。 OpenMPI最近只支持MPI-3,我發現一些平臺上的一些MPI-3功能是有缺陷的。 此外,OpenMPI仍然沒有對MPI_THREAD_MULTIPLE的總體支持,這對於某些應用程序相當重要。 它可能在某些平臺上支持,但一般不能假定工做。 另外一方面,MPICH已經對MPI_THREAD_MULTIPLE已經有多年的總體支持。
平臺評估
1. Mac OS:OpenMPI和MPICH都應該工做正常。 若是你想要一個支持全部MPI-3或MPI_THREAD_MULTIPLE的發行版本,你可能須要MPICH。 若是你在Mac筆記本電腦上運行,絕對沒有理由考慮MPI性能。
2. Linux與共享內存:OpenMPI和MPICH應該工做很好。 若是你想要一個支持全部MPI-3或MPI_THREAD_MULTIPLE的發行版本,你可能須要MPICH。 我不知道兩個實現之間的任何顯着的性能差別。 若是操做系統容許,它們都支持單拷貝優化。
3. Linux與Mellanox InfiniBand:使用OpenMPI或MVAPICH2。 若是你想要一個支持全部MPI-3或MPI_THREAD_MULTIPLE的發行版本,你須要MVAPICH2。 我發現MVAPICH2性能很是好,但沒有與InfiniBand上的OpenMPI進行直接比較,部分是由於性能對我最重要的功能(RMA aka單方面)已經在OpenMPI中每次我嘗試 使用它們。
4. Linux與Intel / Qlogic True Scale InfiniBand:我沒有在這方面的OpenMPI的任何經驗,但基於MPICH的英特爾MPI是這個網絡的支持產品,MVAPICH2也支持它。
5. Cray或IBM超級計算機:MPI在這些機器上自動安裝,而且在兩種狀況下都基於MPICH。
6. Windows:除了經過Linux虛擬機以外,我在Windows上運行MPI絕對沒有意義,可是Microsoft MPI和Intel MPI都支持Windows而且基於MPICH。
二者都是標準兼容的,因此從正確的角度來看,你使用哪個都沒關係。 除非有一些功能,如特定的調試擴展,你須要,而後基準和選擇哪個更快你的應用程序的硬件上。 還要考慮有其餘MPI實現可能提供更好的性能或兼容性,例如MVAPICH(能夠有最好的InfiniBand性能)或英特爾MPI(普遍支持的ISV)。