串行版本

随机产生指定数据规模的矩阵 若不调用 MPI 函数感觉做对比实验不严谨,因为不包含 MPI 函数的开销。

代码见附件

并行版本

最原始的方法

思路:通过将数据量除以进程个数,将数据分为进程数个块,主进程对矩阵赋初值,通过 MPI_Send 将矩阵广播到各进程, MPI_Recv 接收数据,计算结果后,再发送给主进程。 实现:见附件 测试:见下图

利用 MPI_Scatter 和 MPI_Gather

思路:先将矩阵 A 和 C 按行分为 np 块,进程号为 id 的进程读取 A 的第 id 个分块和 B;进程号为 id 的进程求解相应的 C 的第 id 个分块。 实现:见附件。 测试:调整数据规模为 1000 * 2000 * 800,既耗时不长,又可体现并行和串行的明显差异

利用 MPI_Send 和 MPI_Recv 代替 MPI_Bcast

参考教程

实现:见附件。 测试:增大数据规模,见下图 可以看到,数据量大时用重写的方法性能更好。 但就性能上说,实验结果与教程中的结论相反,不知道为什么。

另外,性能分析工具莫名其妙报错了,我只能通过 clock() 来手动计算时间。