您的位置:首页 > 运维架构 > Linux

Linux下MPI程序的编译和运行

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

/*date:2014-9-10
*author: ysc
*email:3100105066@zju.edu.cn
*description: my first MPI program
*/
#include <stdio.h>
#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<N;i+=size)
{
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 集群 MPI