首页 > 其他 > 详细

基于MPI的大规模矩阵乘法问题

时间:2019-03-31 21:56:27      阅读:409      评论:0      收藏:0      [点我收藏+]

转载请注明出处。

/*
	Function:基于MPI的大规模矩阵乘法问题;
	Time: 19/03/25;
	CodeMan:ZhiHong Cc;
*/

#include<stdio.h>
#include <iostream>
#include<math.h>
#include<mpi.h>
#include<time.h>

#define random(x)(rand()%10)
using namespace std;

int main(int argv, char *argc[])
{
	int size;
	if (argv == 2)
	{
		//判断有无矩阵大小size接收,无则初始化为5
		size = atoi(argc[1]);
	}
	else { size = 5; }
	srand((int)time(0));
	int *a, *b, *c, *pce, *ans;
	int rank, numprocess, line;
	double starttime, endtime;
	MPI_Init(&argv, &argc);//MPI Initialize
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);//获得当前进程号
	MPI_Comm_size(MPI_COMM_WORLD, &numprocess);//获得进程个数

	line = size / numprocess;//将数据分为(进程数)个块,主进程也要处理数据
	a = (int*)malloc(sizeof(int)*size*size);
	b = (int*)malloc(sizeof(int)*size*size);
	c = (int*)malloc(sizeof(int)*size*size);
	pce = (int*)malloc(sizeof(int)*size*line);
	ans = (int*)malloc(sizeof(int)*size*line);

	starttime = MPI_Wtime();
	if (rank==0)
	{
		for (int i = 0; i<size; i++)
		{
			for (int j = 0; j<size; j++)
			{
				//随机两个相乘的矩阵a,b
				a[i*size + j] = random(10);
				b[i*size + j] = random(10);
			}
		}
		for (int i = 1; i<numprocess; i++)
		{
			//将b矩阵传递给各进程
			MPI_Send(b, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);
		}
		for (int i = 1; i<numprocess; i++)
		{
			//将a矩阵分成块矩阵,传递给各进程
			MPI_Send(a + (i - 1)*line*size, size*line, MPI_INT, i, 1, MPI_COMM_WORLD);
		}
		for (int k = 1; k<numprocess; k++)
		{
			MPI_Recv(ans, line*size, MPI_INT, k, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			//接收传递结果到数组c
			for (int i = 0; i<line; i++)
			{
				for (int j = 0; j<size; j++)
				{
					c[((k - 1)*line + i)*size + j] = ans[i*size + j];
				}
			}
		}
		for (int i = (numprocess - 1)*line; i<size; i++)
		{
			//计算分配给主进程的块矩阵
			for (int j = 0; j<size; j++)
			{
				int temp = 0;
				for (int k = 0; k<size; k++)
					temp += a[i*size + k] * b[k*size + j];
				c[i*size + j] = temp;
			}
		}
		for (int i = 0; i < size; i++)
		{
			//打印显示
			for (int j = 0; j<size; j++) { printf("%d ", a[size*i + j]); }printf("  ");
			for (int j = 0; j<size; j++) { printf("%d ", b[size*i + j]); }printf("  ");
			for (int j = 0; j<size; j++) { printf("%d ", c[size*i + j]); }printf("\n");
		}
		endtime = MPI_Wtime();
		printf("Took %f secodes.\n", endtime - starttime);
	}
	else
	{
		MPI_Recv(b, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
		//接收b矩阵
		MPI_Recv(pce, size*line, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
		//接收块矩阵
		for (int i = 0; i<line; i++)
		{
			//计算块矩阵与b矩阵相乘的结果
			for (int j = 0; j<size; j++)
			{
				int temp = 0;
				for (int k = 0; k<size; k++)
					temp += pce[i*size + k] * b[k*size + j];
				ans[i*size + j] = temp;
			}
		}
		MPI_Send(ans, line*size, MPI_INT, 0, 2, MPI_COMM_WORLD);
		//将结果传递到主进程
	}
	MPI_Finalize();
	return 0;
}

 

运行:开启10个进程处理两个12×12的矩阵相乘问题

技术分享图片

运行:直接运行,不录入参数

技术分享图片

 

  欢迎大家在评论区提问或者指出问题!

 

基于MPI的大规模矩阵乘法问题

原文:https://www.cnblogs.com/chenzhihong294/p/10633342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!