1. 实验内容与方法
1) 对矩阵进行分块,之后按块进行乘法,使用的是cannon算法。Cannon算法是一种存储有效的算法。为了使两矩阵下标满足相乘的要求,它和并行分块乘法不同,不是仅仅让B矩阵的各列块循环移动,而是有目的地让A的各行块以及B的各列块皆施行循环移位,从而实现对C的子块的计算。将矩阵A和B分成p个方块Aij和Bij,,每块大小为
,并将它们分配给
个处理器
。开始时处理器Pij存放块Aij和Bij,并负责计算块Cij,然后算法开始执行:
⑴将块Aij向左循环移动i步;将块Bij向上循环移动j步;
⑵Pij执行乘加运算后将块Aij向左循环移动1步,块Bij向上循环移动1步;
⑶重复第⑵步,总共执行次乘加运算和
次块Aij和Bij的循环单步移位。
2) 初始化数组。使用vector定义矩阵A、B和C,设置矩阵大小均为6000 * 6000。使用srand((unsigned) time(NULL))设置使用系统定时器的值作为随机种子,随机初始化矩阵A和矩阵B的值。
3) 程序计时。使用MPI自带的MPI_Wtime()函数,MPI_Wtime()记录的是墙上时间,在CPU时间的基础上包括了空闲等待时间。在各进程计算过程分块矩阵C之前和之后使用MPI_Wtime()函数计时,不计算最开始的初始化过程MPI发送的时间和最后接收数据汇总成矩阵C的时间。
2. 运行时间
矩阵A、B和C的大小均为6000 * 6000,且。经过代码运行计时,得到以下的实验结果表格。
处理器个数 |
用时/秒 |