TL; DR:
在MPI的标准实现中,是否有一种有效的方法可以在所有进程之间共享整数变量(即没有库或有趣的东西)。
我正在开发一个使用MPI的简单游戏AI。 AI使用标准的Alpha-Beta树搜索方法来根据评估功能找到最佳移动。该程序的基础如下:
- 表示为位板的板。
- 进程0通过根据其可用移动次数分支第一块板来初始化所有内容
- 进程0通过MPI_Scatter将工作分配给所有其他进程(例如一个或多个子树)
- 所有进程在其子树上调用Alpha-Beta搜索,然后为该进程创建更大的树
- 每个过程都会对其树进行静态评估
- 使用MPI_Gather找出最佳动作
- 返回最佳动作。
我有两个问题:
- 动态负载分配/平衡:
一些过程比其他过程有更多的工作要做。例如,如果在一组树木中进行的动作较少,则完成速度会更快。但是,如果一个进程可以确定它承受的负载很重并且可以从与另一个空进程的负载共享中受益,那该怎么办?一个简单的想法是在流程可以要求工作的地方实施某种队列?在进程之间没有共享队列的情况下是否可能?收集每个过程最深层评估的问题在于,总运行时间本质上是最慢过程的运行时间。因此,如果P1花费0.1s来计算其评估结果,而P2花费10s来计算其评估结果,并说P1的评估结果更好,则会浪费计算时间。
- 共享的Alpha-Beta值:
Alpha-Beta值确定树木的切除深度。这意味着,即使另一个进程比另一个进程找到了更好的Alpha-Beta值,也可以通过使用另一个进程的Alpha-Beta值来受益。有没有什么方法可以共享这两个值而又不会增加通讯开销?
我在另一篇文章中读到了
每个线程都有一个堆栈,而应用程序通常只有一个堆(尽管对于不同类型的分配有多个堆并不少见)。
这是否适用于MPI?是否存在所有进程都可以访问的某种堆?我会混淆术语线程和进程吗?
我考虑过的其他解决方案:
- 进程0仅充当进程之间的通信器并管理队列。过程是评估较小的深度值,将其最佳树发送到P0并请求工作。这也将解决Alpha-Beta共享的问题。不幸的是,我认为这仍将导致较长的等待时间,因为P0必须等待每个进程返回其最佳树才能重新评估队列。此外,我们失去了仅充当沟通者的整个过程(P0),因此没有做太多工作。
任何意见将不胜感激。
谢谢!