【发布时间】:2014-11-05 01:13:21
【问题描述】:
通过基本的 Minimax 搜索,使用 OMP For 在多个线程之间拆分工作似乎很容易。例如 -
#pragma omp parallel for
for (each child node)
{
val = minimax(child, depth - 1, FALSE);
bestValue = max(bestValue, val);
}
但是,至少在我的理解中,Alpha-Beta 修剪似乎是不可能的。
#pragma omp parallel for
for (each child node)
{
α = max(α, alphabeta(child, depth - 1, α, β, FALSE));
if (β ≤ α)
break;
}
在 OpenMP 中,如果要使循环并行,则要求 For 循环只能有一个入口/出口点。然而,Alpha-Beta 剪枝打破了这个规则,因为只要需要完成剪枝,就有可能跳出循环(在上面的伪代码中,这将在 β 小于或等于 α 时发生)。
所以我的问题是,有没有办法解决 OpenMP 的这种限制?我想使用 OpenMP 并行运行我的 Alpha-Beta 搜索,但目前这个限制让我很困惑。
【问题讨论】:
-
这是可能的,但您必须使用一些更底层的 OpenMP 构造,使用线程 ID 和同步。
-
啊,好吧。您特别指的是 OMP 的哪些元素?只是线程 ID 和同步?我很好奇如何解决这个问题,或者网上是否有任何示例可以为我指明正确的方向。到目前为止,我的搜索没有产生任何有希望的结果。
-
我稍后会写一个简单的例子来说明我将如何做到这一点,但有两个棘手的地方。一个是您的
alphabeta函数使用上一次迭代中的 alpha 值,这是您需要摆脱的依赖项。其次,第一个完成的线程不一定是具有smalles子节点索引的线程。 -
好的,所以这似乎是一个树搜索?您必须提供有关如何遍历子节点的更多详细信息,因为我猜这不是一些简单的 for 循环?使用 OpenMP 浏览链表也比较棘手,但您可能会使用任务来处理它。
标签: parallel-processing openmp alpha-beta-pruning