mpi c++實現示例
1.<!--[endif]-->什麼是MPI
MPI是一個在平行計算中傳遞訊息的庫的標準,由實現人員和使用人員來遵守。目前的實現版本有MPICH2, 實現,他還有好幾個派生子專案。
2.安裝MPICH2
使用VC7和windows版本的MPICH2。
下載windows版本,是一個msi標準的windows程式安裝包。但是它需要dotNet frameworks 1.1,所以要先下載安裝dotNet frameworks1.1。假設MPICH2安裝在%MPICH2ROOT%目錄,下面會有include, lib, bin, examples, jumpshot。將lib和include加入到
MPICH2會建立一個服務MPICH2 Process Manager, Argonne National Lab,提供服務的映象是%MPICH2ROOT%/bin/smpd。這個程式是MPICH2的程序管理器。MPICH2還需要一個帳號來執行。假設建立本地帳號mpiaccount,注意所有參加叢集的機器的執行帳號最好一致。執行wmpiregister程式向MPICH2註冊這個帳號。可以將%MPICH2ROOT%/bin加入系統的PATH中,方便後面的使用。下面進入%MPICH2ROOT%/examples
3.多臺機器一起並行
在要加入叢集的機器上安裝MPICH2,並建立同樣的帳號。在所有的機器上建立一個工作目錄,這個目錄的結構應該一致(比如都是E:/MPIWORK/)。將要執行的程式拷貝到工作目錄下。在一臺機器上執行“mpiexec –hosts x C<?xml:namespace prefix = st1 />1 C2…cpi”,其中x是主機的總數,C1,C2都是主機的名字。
4.Hello world
讓我們開始這個著名的程式。
首先MPI不是一個自動工具,它是一個
建立一個Hello控制檯工程,保證%MPICH2ROOT%/include,和%MPICH2ROOT%/lib加入到VC對應的目錄。在工程的編譯選項加入/D "MPICH_IGNORE_CXX_SEEK",因為MPI2有一個bug,它定義了和標準C庫中一樣的巨集,所以必須定義這個巨集,否則會有編譯錯誤。下在連線選項中加入cxxd.lib和mpi.lib。下面是Hello world。
<?xml:namespace prefix = o />
#include
#include "mpi.h"
using namespace std;
int main(int argc,char **argv)
{
int rank ,size;
MPI::Init(argc,argv);
size=MPI::COMM_WORLD.Get_size();
rank=MPI::COMM_WORLD.Get_rank();
printf("Hello world! , I am %d,in %d/n computer", rank, size);
MPI::Finalize();
}
build之後,將它拷貝到工作目錄下,確保每一個叢集內的機器都工作目錄下都有同樣的版本。執行“mpiexec –hosts x C1 C2…Hello”,會看到參與的機器分別打印出自己的id。
5. 傳遞訊息
MPI並不能自動將你的程式變成一個並行的程式,就像你不使用多執行緒就不能利用兩個CPU的好處一樣。你需要適當的分解任務,並且需要在任務之間互相通訊協作。
最常用的是MPI_Send( start, count, datatype, dest, tag, comm ) 和MPI_Recv(start, count, datatype, source, tag, comm, status)