1. 程式人生 > >mpi c++實現示例

mpi c++實現示例

1.<!--[endif]-->什麼是MPI

MPI是一個在平行計算中傳遞訊息的庫的標準,由實現人員和使用人員來遵守。目前的實現版本有MPICH2 實現,他還有好幾個派生子專案。

2.安裝MPICH2

使用VC7windows版本的MPICH2

下載windows版本,是一個msi標準的windows程式安裝包。但是它需要dotNet frameworks 1.1,所以要先下載安裝dotNet frameworks1.1。假設MPICH2安裝在%MPICH2ROOT%目錄,下面會有include, lib, bin, examples, jumpshot。將libinclude加入到

VC的對應的目錄中。examples下是一個例子程式cpi,有c, c++,fortun的原始碼。我們將使用這個例子測試。

MPICH2會建立一個服務MPICH2 Process Manager, Argonne National Lab,提供服務的映象是%MPICH2ROOT%/bin/smpd。這個程式是MPICH2的程序管理器。MPICH2還需要一個帳號來執行。假設建立本地帳號mpiaccount,注意所有參加叢集的機器的執行帳號最好一致。執行wmpiregister程式向MPICH2註冊這個帳號。可以將%MPICH2ROOT%/bin加入系統的PATH中,方便後面的使用。下面進入%MPICH2ROOT%/examples

下執行“mpiexec –n 2 cpi”,即在本地以兩個CPU執行cpi程式。執行的過程中你會發現建立了兩個cpi程序。表示已經正常工作了。

3.多臺機器一起並行

在要加入叢集的機器上安裝MPICH2,並建立同樣的帳號。在所有的機器上建立一個工作目錄,這個目錄的結構應該一致(比如都是E:/MPIWORK/)。將要執行的程式拷貝到工作目錄下。在一臺機器上執行“mpiexec –hosts x C<?xml:namespace prefix = st1 />1 C2…cpi”,其中x是主機的總數,C1C2都是主機的名字。

4Hello world

讓我們開始這個著名的程式。

首先MPI不是一個自動工具,它是一個

Message-Passing Interface的簡寫,即訊息傳遞介面。想要編寫並行程式需要使用MPI庫。

建立一個Hello控制檯工程,保證%MPICH2ROOT%/include,和%MPICH2ROOT%/lib加入到VC對應的目錄。在工程的編譯選項加入/D "MPICH_IGNORE_CXX_SEEK",因為MPI2有一個bug,它定義了和標準C庫中一樣的巨集,所以必須定義這個巨集,否則會有編譯錯誤。下在連線選項中加入cxxd.libmpi.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)