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 + -
显示快捷键?