mpich2 + windows 环境 DIY

现在又有必要用这个东东了,不仅仅是在集群环境下,当前的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运行,用时有成倍的减少!!!!,不错,呵呵..........

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值