考虑在m*n矩阵上进行类似生活游戏的计算,开发每个循环需要O(m*n) 。
我将使用 Pthread 和 MPI 将此程序修改为并行版本。最简单的方法是静态分区,这意味着将m行拆分为t个任务,每个任务处理一个m/t * n矩阵。(t代表线程或进程的数量)
但是,这种解决方案的负载平衡并不好。一个任务可能什么都不处理,而另一个任务必须计算一个几乎满的矩阵。
我的第一个想法是使这种计算更加负载平衡是这样的:
- 维护 am*1 数组来存储每行有多少个元素。
- 扫描测试用例后,为每个任务分配 i*n 矩阵。矩阵中的元素应该等于其他任务。同时存储每个任务中的元素个数。(这里需要at*1数组)
- 在每个循环之后,重新分配绑定到每个任务的矩阵。这样做需要 O(t*m)。
这会将重新分配时间从O(m*n)减少到O(t*m)。我的第一个问题是我可以更快地重新分配吗?
其次,当计算矩阵“边缘”上的元素时,任务必须与附近的任务进行通信,这在 MPI 中可能需要相当长的时间。为了减少这种情况,我想我可以将原点矩阵分成几个矩形而不是细长的正方形。但是我不知道怎么做,有没有算法名称的关键字供我搜索?
谢谢你。