mpi大规模矩阵乘法C语言,基于MPI的大规模矩阵乘法问题

转载请注明出处。

/*

Function:C++实现并行矩阵乘法;

Time: 19/03/25;

Writer:ZhiHong Cc;

*/

运行方法:切到工程文件x64Debug文件下,打开命令行,输入以下指令:

mpiexec -n N Project.exe NUM

// N代表开启进程数量,NUM代表矩阵规模大小(size)

具体代码:

1.头文件:

#include

#include

#include

#include

#include

2.矩阵规模(size)接收,通过C++自带参数argv和argc[ ]:

if (argv == 2)

{

//判断有无矩阵大小size接收,无则初始化为5

size = atoi(argc[1]);

}

else { size = 5; }

3.为各指针变量分配空间

int *a, *b, *c, *pce, *ans;

a = (int*)malloc(sizeof(int)*size*size);//矩阵a

b = (int*)malloc(sizeof(int)*size*size);//矩阵b

c = (int*)malloc(sizeof(int)*size*size);//结果矩阵

pce = (int*)malloc(sizeof(int)*size*line);//接收a矩阵下的块矩阵

ans = (int*)malloc(sizeof(int)*size*line);//暂存次进程的答案

4.定义进程号,进程个数以及块矩阵的行数

int rank, numprocess, line;

line = size / numprocess;//将数据分为(进程数)个块,主进程也要处理数据

5.主进程中进行一系列操作:生成矩阵、分配矩阵、接收次进程答案、拼接答案、计算耗时、最终输出三个矩阵

for (int i = 0; i

{

for (int j = 0; j

{

//随机两个相乘的矩阵a,b

a[i*size + j] = random(10);

b[i*size + j] = random(10);

}

}

for (int i = 1; i

{

//将b矩阵传递给各进程

MPI_Send(b, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);

}

for (int i = 1; i

{

//将a矩阵分成块矩阵,传递给各进程

MPI_Send(a + (i - 1)*line*size, size*line, MPI_INT, i, 1, MPI_COMM_WORLD);

}

for (int k = 1; k

{

MPI_Recv(ans, line*size, MPI_INT, k, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

//接收传递结果到数组c

for (int i = 0; i

{

for (int j = 0; j

{

c[((k - 1)*line + i)*size + j] = ans[i*size + j];

}

}

}

for (int i = (numprocess - 1)*line; i

{

//计算分配给主进程的块矩阵

for (int j = 0; j

{

int temp = 0;

for (int k = 0; 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

for (int j = 0; j

for (int j = 0; j

");

}

endtime = MPI_Wtime();

printf("Took %f secodes.

", endtime - starttime);

}

6.次进程中进行此类操作:接收相乘矩阵,计算答案传送给主进程

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

{

//计算块矩阵与b矩阵相乘的结果

for (int j = 0; j

{

int temp = 0;

for (int k = 0; 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);

//将结果传递到主进程

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

6b78e0ab79bd74844018c8a5bc3bbd22.png

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

68747fc8aa485d7ebbfaa89c72bc3803.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值