今天老师给了个貌似是32还是64核的集群,于是就忍不住登陆进去体验了一把,顺便写了个MPI程序跑了一下。由于是刚接触MPI,所以代码很简单,就是一个求π的简单例子。代码如下:

/*date:2014-9-10

*author: ysc

*email:3100105066@zju.edu.cn

*description: my first MPI program

*/

#include

#include "mpi.h"

int main(int argc, char* argv[])

{

int i,rank,size;

long N;

double w,PI,temp,sum;

N = 10000000;

w = 1.0/N;sum = 0.0;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

for(i=rank;i

{

temp = i*w;

sum += 4.0/(1.0 + temp*temp);

}

MPI_Reduce(&sum,&PI,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);

if(rank == 0)

printf("PI is %0.7f\n",PI*w);

MPI_Finalize();

return 0;

}

代码中的API我也不多解释了,都是非常简单的。不过要注意加mpi.h到头文件里去。代码写完就是要编译了。这里的编译需要用到mpicc,运行则用mpirun。

由于我这段代码是在集群中运行的,因此这个集群本身就安装了mpicc和mpirun,所以也不在讨论怎么安装MPI了。

mpicc使用起来和gcc一样,实例如下:

$ mpicc pi.c -o pi

熟悉gcc的都知道是什么意思

不过运行起来不是直接 ./pi那样的,而是需要使用mpirun,其语法如下:

$ mpirun -np num-of-proc -machinefile nodefile your-exe-program parameters-if-any

其中 -np参数是运行的进程数,-machinefile就是一个ascii文件,其中记录的是运行程序指定的节点,比如我运行的这个集群有7个node,我ping了一下只有node2和node6可以用,于是我的machinefile就是如下:

node2

node6最后指定要运行的exe文件和命令行参数如果有的话。

我运行的结果如下:

PI is 3.1415928

Logo

更多推荐