C++ 基于负载平衡的并行计算类生命博弈程序划分

C++ 基于负载平衡的并行计算类生命博弈程序划分,c++,c,parallel-processing,pthreads,mpi,C++,C,Parallel Processing,Pthreads,Mpi,考虑在m*n矩阵上进行类似生命游戏的计算,需要O(m*n)来开发每个周期。 我将使用Pthread和MPI将这个程序修改为并行版本。最简单的方法是静态分区,这意味着将m行拆分为t任务,每个任务处理一个m/t*n矩阵。(t表示线程或进程的数量) 但是,此解决方案的负载平衡性不好。一个任务可能什么都不处理,而另一个任务必须计算一个几乎满的矩阵 我的第一个想法是让这种计算更加负载均衡: 维护一个m*1数组以存储每行中有多少个元素 扫描测试用例后,为每个任务分配i*n矩阵。 矩阵中的元素应与其他任务相同

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

  • 维护一个m*1数组以存储每行中有多少个元素
  • 扫描测试用例后,为每个任务分配i*n矩阵。 矩阵中的元素应与其他任务相同。 同时存储每个任务中的元素数。(此处需要t*1数组)
  • 在每个周期之后,重新分配绑定到每个任务的矩阵。这需要O(t*m)来完成
  • 这将把重新分配时间从O(m*n)减少到O(t*m)。我的第一个问题是,我能让这种重新分配更快吗
    其次,当计算矩阵“边缘”上的元素时,任务必须与附近的任务进行通信,这在MPI中可能需要相当长的时间。为了减少这一点,我想我可以将原点矩阵分割成几个更四方而不是更细长的矩形。但我不知道该怎么做,是否有算法名称的关键字供我搜索?

    谢谢。

    计算
    m*n
    ,它将为您提供单元格数。如果要将其拆分为
    t
    字段,则每个字段都需要
    m*n/t
    单元格,或者是一个正方形,每边都是
    sqrt(m*n/t)

    我认为实现负载平衡的最简单方法是创建一个工作队列,将矩阵切割成更多的部分,而不仅仅是t个部分,并在第一个部分完成后让每个工作人员获取一个新的部分(或者,如果存在网络延迟,则使用一个小的本地缓存并保持其填充)


    如果您这样做,那么由于舍入,上述方法可能无法使所有正方形的大小完全相同也无关紧要。

    计算
    m*n
    ,这将为您提供单元格数。如果要将其拆分为
    t
    字段,则每个字段都需要
    m*n/t
    单元格,或者是一个正方形,每边都是
    sqrt(m*n/t)

    我认为实现负载平衡的最简单方法是创建一个工作队列,将矩阵切割成更多的部分,而不仅仅是t个部分,并在第一个部分完成后让每个工作人员获取一个新的部分(或者,如果存在网络延迟,则使用一个小的本地缓存并保持其填充)


    如果你这样做了,上面的方法可能会因为舍入而使所有的方块大小不完全相同,这也无关紧要。

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


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

    仅使用大矩阵并不是处理生活游戏的最佳方式。由于活细胞往往比较稀少,只添加一个活细胞列表可以避免在所有空白区域浪费时间

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