通过基本的Minimax搜索,使用OMP For分割多个线程之间的工作似乎很容易。例如 -是否有可能与OpenMP并行运行Alpha-Beta Pruning的Minimax搜索?
#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和同步。 – steabert 2014-11-05 11:38:48
啊,好吧。 OMP的哪些元素特别是你的意思?只需线程ID和同步?我很好奇如何解决这个问题,或者如果有任何在线的例子可能会让我指向正确的方向。迄今为止,我的搜索没有取得任何有希望的结果。 – d3ward 2014-11-05 21:38:29
我会在后面写一个简单的例子来说明如何去做,但有两个棘手的问题。一个是你的'alphabeta'函数使用前一次迭代中的alpha值,这是你需要去除的一个依赖项。其次,首先完成的线程不一定是具有更小的子节点索引的线程。 – steabert 2014-11-05 21:49:40