Lazy SMP は、複数スレッドが同じルート局面をほぼ独立に探索しつつ、 共有置換表を通じてゆるく協調する並列探索方式である。 実装のしやすさに対して実用上の効果が高く、現代エンジンで広く採用されている。
Lazy SMP では、各スレッドが
で探索を進める。
完全に仕事を厳密分担するのではなく、 どこかのスレッドが見つけた情報を共有置換表へ書き込み、 他のスレッドがそれを利用することで全体として得をする。
この方式は、厳密な仕事分配や複雑な同期を避け、 「だいたい同じ探索を並列に走らせて、共有情報から自然に利益を得る」 という緩い協調を取る。
そのため、
という利点がある。
最近の実装では、各スレッドの最善手候補を集めて投票する
thread voting が使われることがある。
各スレッドの
を見て、どの手を最終的なルート手として採用するかを決める。
void startHelpers(const Position& root, int depth, int alpha, int beta) {
for (Thread& th : helperThreads) {
th.root = root;
th.depth = depth + th.id % 2; // 少しだけ深さをずらす例
th.alpha = alpha;
th.beta = beta;
th.start();
}
}
実際には、
を合わせて設計する。
Chessprogramming Wiki にもある通り、 Stockfish は 2016 年ごろに YBW 系から Lazy SMP へ移行したことで知られる。 GitHub 上の議論でも、 「スレッド数を増やすと同じ答えへ早く到達するというより、 同じ時間でより強い手を見つけやすくなる」 という性質が説明されている。
将棋AIでも、
を前提にした並列探索では、Lazy SMP 的な発想は非常に相性がよい。
ただし、スレッド数が増えると
の影響も大きくなる。