現在又有必要用這個東東了,不僅僅是在叢集環境下,當前的CPU多核已相當普遍,你會問用mpich2會不會提高效率呢?
好的,我也想知道,從mpich2中的一個內建的pi計算程式(定積分的方法)看看在我的Intel Core(TM) 2 Duo CPU 上是否有效率提升。
好的,先找到mpich2的包,google一個mpich2,第一個就是,呵呵,說明很潮地http://www.mcs.anl.gov/research/projects/mpich2/
news & events
MPICH2-1.3.1 released (Nov. 17th, 2010)
A new release of MPICH2, 1.3.1, is now available to download. This is primarily a bug-fix release. A few new features have also been added including complete support for the FTB MPI events, improvements to RMA operations, and ability to modify collective algorithm selection thresholds using environment variables.
嗯,是最新穩定版,找了個win32的版本下載了。
安裝:
首先開啟附件,找到命令提示字元表徵圖,點右鍵,選擇以管理員身份運行(注意一定要在管理員權限下才行).
接著輸入命令msiexec去卸載或安裝mpich2包。
比如你剛才下載的 mpich2-1.2.1p1-win-ia32.msi 檔案放在e盤根目錄下,則
msiexec /i e:/mpich2-1.2.1p1-win-ia32.msi 這樣就可以完成管理員權限下的mpich2安裝,執行安裝過程中的,只需預設(路徑也不要改,這樣省心不少)下一步下一步,,直到完成。。
有心的可以注意到,smpd.exe這個進程(Process manager service for MPICH2 applications)出現在Windows工作管理員中了(win7的話,可能要選擇顯示所有的使用者進程才能看到它)。
接著開啟mpich2包中的example的檔案夾中找到icpi.c程式,如下(也可以複製以下程式儲存):
/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* This is an interactive version of cpi */
#include <mpi.h>
#include <stdio.h>
#include <math.h>
#pragma comment (lib, "mpi.lib")
double f(double);
double f(double a)
{
return (4.0 / (1.0 + a*a));
}
int main(int argc,char *argv[])
{
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stdout,"Process %d of %d is on %s/n",
myid, numprocs, processor_name);
fflush(stdout);
while (!done) {
if (myid == 0) {
fprintf(stdout, "Enter the number of intervals: (0 quits) ");
fflush(stdout);
if (scanf("%d",&n) != 1) {
fprintf( stdout, "No number entered; quitting/n" );
n = 0;
}
startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0)
done = 1;
else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += f(x);
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (myid == 0) {
printf("pi is approximately %.16f, Error is %.16f/n",
pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
printf("wall clock time = %f/n", endwtime-startwtime);
fflush( stdout );
}
}
}
MPI_Finalize();
return 0;
}
編譯(實質是用vs系列的cl.exe編譯(很明顯可以交叉編譯組譯工具),所以可以用通用的vs IDE編譯環境,當然要把mpich2的包包含進來,我下面的只是對vc++6.0抽取了部分,也可以):
@echo off
set include=d:/Program Files/MPICH2/include;D:/vcPack/include;D:/vcPack/MFC/Include
set lib=d:/Program Files/MPICH2/lib;D:/vcPack/lib;D:/vcPack/MFC/lib
set path=d:/Program Files/MPICH2/bin;D:/vcPack/bin;%path%
echo ---------------=======By GoldenSpider 2010-11-27=======-------------------
echo on
cl /c /o2 pi.c
link /LIBPATH:"d:/Program Files/MPICH2/lib" pi.obj mpi.lib
del *.obj
pause
mpiexec -n 2 pi.exe
儲存為bat檔案運行。
需要注意的是,第一次運行,程式會叫你輸出使用者名稱和密碼(就是用開機的使用者名稱和密碼(有提示,很好懂的))
mpiexec -n 2 pi.exe 可實現多核運行,若直接開啟pi.exe則只有一個process,最好不要用多於核心數的命令
比如我的是雙核用mpiexec -n 2 pi.exe 較好,若為四核則mpiexec -n 4 pi.exe 較好,而mpiexec -n 8 pi.exe 不一定高效了。
運行效果如下:
雙Process並行如下(注意要在管理員權限下運行):
直接雙擊pi.exe,則是單Process運行,如下:
可以看出同一個程式用雙Process運行,用時有成倍的減少!!!!,不錯,呵呵..........