通過基本的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