C++ 基于负载平衡的并行计算类生命博弈程序划分
考虑在m*n矩阵上进行类似生命游戏的计算,需要O(m*n)来开发每个周期。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矩阵。 矩阵中的元素应与其他任务相同
我将使用Pthread和MPI将这个程序修改为并行版本。最简单的方法是静态分区,这意味着将m行拆分为t任务,每个任务处理一个m/t*n矩阵。(t表示线程或进程的数量)
但是,此解决方案的负载平衡性不好。一个任务可能什么都不处理,而另一个任务必须计算一个几乎满的矩阵
我的第一个想法是让这种计算更加负载均衡:
其次,当计算矩阵“边缘”上的元素时,任务必须与附近的任务进行通信,这在MPI中可能需要相当长的时间。为了减少这一点,我想我可以将原点矩阵分割成几个更四方而不是更细长的矩形。但我不知道该怎么做,是否有算法名称的关键字供我搜索?
谢谢。计算
m*n
,它将为您提供单元格数。如果要将其拆分为t
字段,则每个字段都需要m*n/t
单元格,或者是一个正方形,每边都是sqrt(m*n/t)
长
我认为实现负载平衡的最简单方法是创建一个工作队列,将矩阵切割成更多的部分,而不仅仅是t个部分,并在第一个部分完成后让每个工作人员获取一个新的部分(或者,如果存在网络延迟,则使用一个小的本地缓存并保持其填充)
如果您这样做,那么由于舍入,上述方法可能无法使所有正方形的大小完全相同也无关紧要。计算
m*n
,这将为您提供单元格数。如果要将其拆分为t
字段,则每个字段都需要m*n/t
单元格,或者是一个正方形,每边都是sqrt(m*n/t)
长
我认为实现负载平衡的最简单方法是创建一个工作队列,将矩阵切割成更多的部分,而不仅仅是t个部分,并在第一个部分完成后让每个工作人员获取一个新的部分(或者,如果存在网络延迟,则使用一个小的本地缓存并保持其填充)
如果你这样做了,上面的方法可能会因为舍入而使所有的方块大小不完全相同,这也无关紧要。仅使用大矩阵并不是处理生活游戏的最佳方法。由于活细胞往往比较稀少,只添加一个活细胞列表可以避免在所有空白区域浪费时间
您可以将工作列表的部分分配给线程。仅使用大矩阵并不是处理生活游戏的最佳方式。由于活细胞往往比较稀少,只添加一个活细胞列表可以避免在所有空白区域浪费时间 您可以将工作列表的部分分配给线程