mpi.c
来自「在visual studio2005中开发 安装了MPICH2安装包」· C语言 代码 · 共 134 行
C
134 行
#include<stdio.h>
#include "mpi.h"
#define NA 3
#define NB 4
#define NC 5
#define master 0
#define FROM_MASTER 1
#define FROM_WORKER 2
int main(int argc,char **argv)
{
MPI_Status status;
double a[NA][NB],b[NB][NC],c[NA][NC];
int numprocs,myid,numworker,source,dest;
int rows,averow,extra,offset;
int i,j,k,count,mtype;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
numworker=numprocs-1;
/*------------------master task---------------------*/
if(myid==master)
{
printf("number of worker task is %d\n",numworker);
//初始化A B矩阵
printf("a=\n");
for(i=0;i<NA;i++)
{
printf("\n");
for(j=0;j<NB;j++)
{
a[i][j]=i+j;
printf("%6.2f",a[i][j]);
}
}
printf("\n");
printf("b=\n");
for(i=0;i<NB;i++)
{
printf("\n");
for(j=0;j<NC;j++)
{
b[i][j]=i*j;
printf("%6.2f",b[i][j]);
}
}
printf("\n");
//发送A B矩阵的数据给从进程
rows=NA;
averow=rows/numworker;
extra=rows%numworker;
offset=0;
mtype=FROM_MASTER;
for(dest=1;dest<=numworker;dest++)
{
rows=(dest<=extra)? (averow+1) : averow;
printf("sending %d rows to task %d\n",rows,dest);
MPI_Send(&offset,1,MPI_INT,dest,mtype,MPI_COMM_WORLD);
MPI_Send(&rows,1,MPI_INT,dest,mtype,MPI_COMM_WORLD);
count=rows*NB;
MPI_Send(&a[offset][0],count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD);
count=NB*NC;
MPI_Send(&b,count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD);
offset=offset+rows;
}
//等待从进程发来数据
mtype=FROM_WORKER;
for(source=1;source<=numworker;source++)
{
MPI_Recv(&offset,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);
MPI_Recv(&rows,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);
count=rows*NC;
MPI_Recv(&c[offset][0],count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status);
}
//打印结果
printf("here is the result matrix:\n");
for(i=0;i<NA;i++)
{
printf("\n");
for(j=0;j<NC;j++)
printf("%6.2f",c[i][j]);
}
printf("\n");
fflush(stdout);
}
/*------------------worker task---------------------*/
else
{
//接收A矩阵发送的数据
mtype=FROM_MASTER;
printf("Master=%d,mtype=%d\n",master,mtype);
MPI_Recv(&offset,1,MPI_INT,master,mtype,MPI_COMM_WORLD,&status);
printf("offset=%d\n",offset);
MPI_Recv(&rows,1,MPI_INT,master,mtype,MPI_COMM_WORLD,&status);
printf("rows=%d\n",rows);
count=rows*NB;
MPI_Recv(&a,count,MPI_DOUBLE,master,mtype,MPI_COMM_WORLD,&status);
printf("a=\n");
for(i=0;i<rows;i++)
{
printf("\n");
for(j=0;j<NB;j++)
printf("%6.2f",a[i][j]);
}
printf("\n");
count=NB*NC;
MPI_Recv(&b,count,MPI_DOUBLE,master,mtype,MPI_COMM_WORLD,&status);
printf("b=\n");
for(i=0;i<NB;i++)
{
printf("\n");
for(j=0;j<NC;j++)
printf("%6.2f",b[i][j]);
}
printf("\n");
for(k=0;k<NC;k++)
for(i=0;i<rows;i++)
{
c[i][k]=0.0;
for(j=0;j<NB;j++)
c[i][k]=c[i][k]+a[i][j]*b[j][k];
}
mtype=FROM_WORKER;
printf("after computing\n");
MPI_Send(&offset,1,MPI_INT,master,mtype,MPI_COMM_WORLD);
MPI_Send(&rows,1,MPI_INT,master,mtype,MPI_COMM_WORLD);
count=rows*NC;
MPI_Send(&c,count,MPI_DOUBLE,master,mtype,MPI_COMM_WORLD);
printf("after sending\n");
}
MPI_Finalize();
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?