使用负载平衡为具有类似游戏的程序划分并行计算

时间:2013-05-05 11:27:04

标签: c++ c parallel-processing pthreads mpi

考虑在 m * n 矩阵上进行类似于生命游戏的计算,需要 O(m * n)来开发每个循环。
我将使用Pthread和MPI将此程序修改为并行版本。最简单的方法是静态分区,这意味着将 m 行拆分为 t 任务,每个任务都处理 m / t * n 矩阵。 ( t 代表线程或进程的数量)
但是,这种解决方案没有很好的负载平衡。任务可以处理任何事情,而另一个任务必须计算几乎完整的矩阵。
我的第一个想法是让这个计算更加负载平衡是这样的:

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

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

2 个答案:

答案 0 :(得分:2)

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

您可以将工作清单的各个部分分配给线程。

答案 1 :(得分:1)

计算m*n,它将为您提供单元格数量。如果您想将其拆分为t字段,则每个字段都需要m*n/t个字段,或者每个字段的长度为sqrt(m*n/t)

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

如果你这样做,由于四舍五入,上述方法可能无法使所有方块的大小完全相同。