分区是一个类似生活游戏的程序,用于负载平衡的并行计算
Partition a lifegame-like program for parallel computing with load balance
考虑在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块,并且让每个工人在第一个工作完成后获取一个新的工作(或者,如果你有网络延迟,有一个小的本地缓存并保持它填充)。
如果你这样做了,上面的方法可能不会使所有的正方形由于四舍五入而完全相同的大小也无关紧要。
相关文章:
- 在程序和基于文本的游戏和C++内重新启动程序
- 在程序/基于文本的游戏/C++内重新启动程序
- 当我的程序不在焦点中时,不拾取 GetAsyncKeyState. 在游戏中不工作
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- SFML多个房间游戏设计,如何组织程序
- 如何修复我的非启动小游戏应用程序
- C++井字游戏程序优化
- 我的COCOS2D游戏开始,而不是其他音乐应用程序停止
- 要读取一个从一个游戏应用程序(In C )到我的Android应用程序的文件
- 在此过程中的纸牌游戏程序.不知道为什么我会得到一个随机数-858993460
- 程序语言和面向对象语言的游戏设计差异
- 非游戏果酱应用程序的好例子
- 我正在设计一个程序,可以计算如果您玩了几个刮刮乐彩票游戏,获利的几率
- 在mac上用c++编写独立游戏程序需要哪些软件(从软件功能而非名称来看)
- C++ 和 SDL 中的游戏程序。 'SLD_Flip'错误
- 数字游戏程序
- 国际象棋游戏 - 程序崩溃
- 生活游戏程序,需要用户输入的帮助
- 我正在做减法游戏(NIM)程序在我的一个练习中,它要求我在主循环周围进行另一个循环
- 当时间到了,Windows时间限制应用程序可以将游戏从全屏(DirectX?)模式中弹出吗