分区是一个类似生活游戏的程序,用于负载平衡的并行计算

Partition a lifegame-like program for parallel computing with load balance

本文关键字:程序 游戏 用于 并行计算 平衡 负载 生活 一个 分区      更新时间:2023-10-16

考虑在m*n矩阵上进行类似生命游戏的计算,O(m*n)来开发每个循环。
我将使用Pthread和MPI将这个程序修改为并行版本。最简单的方法是静态分区,即将m行拆分为t个任务,每个任务处理一个m/t * n矩阵。(t表示线程数或进程数)
然而,这个解决方案不能很好地实现负载平衡。一个任务可能什么都不处理,而另一个任务则必须计算一个几乎满了的矩阵。
为了使这个计算更加负载均衡,我的第一个想法是:

  1. 维护一个m*1数组来存储每行有多少个元素。
  2. 扫描测试用例后,为每个任务分配i*n矩阵。矩阵中的元素应该等于其他任务。同时存储每个任务中的元素数量。(这里需要一个t*1数组)
  3. 每个循环结束后,重新分配每个任务绑定的矩阵。这需要O(t*m)。

这将减少重新分配时间从O(m*n)O(t*m)。我的第一个问题是,我能让这个重新分配更快吗?
其次,当计算矩阵"边缘"上的一个元素时,任务必须与附近的任务进行通信,这在MPI中可能会花费相当长的时间。为了减少这个,我想我可以把原点矩阵分成几个矩形,更四方的,而不是细长的。但是我不知道怎么做,有没有算法名称的关键字供我搜索?
谢谢你。

只使用大矩阵并不是处理人生游戏的最佳方法。由于活细胞往往是稀疏的,添加一个仅包含活细胞的列表可以让您不浪费时间在所有空白区域。

您可以将工作列表的部分分配给线程。

计算m*n,它将给出单元格的数量。如果你想把它分割成t字段,每个字段需要有m*n/t单元格,或者是一个正方形,每条边都是sqrt(m*n/t)长。

我认为做负载平衡的最简单的方法是创建一个工作队列,将矩阵切割成不仅仅是t块,并且让每个工人在第一个工作完成后获取一个新的工作(或者,如果你有网络延迟,有一个小的本地缓存并保持它填充)。

如果你这样做了,上面的方法可能不会使所有的正方形由于四舍五入而完全相同的大小也无关紧要。