【将棋】適当並列化
適当ですが、わりとすんなりできました。
ルートで長男ノードを探索して残りを並列探索です。
CPU使用率が13%から50%くらいになったので効率はともかく、とりあえず満足。
複数のスレッドがハッシュに書き込むので、たまにおかしくなっている気がするけど
とりあえず、まだロック処理は考えていない。
今のところ、ハッシュサイズを大きくして、ハッシュ手が合法かのみをチェック。
以下は大雑把なコードのイメージです。
最初に全手を生成して、各スレッドが次に処理する手を取得+探索という感じです。
// グローバルにルート手情報をもつ int g_te[600]; int g_num; int g_i; int g_alpha; // 次に処理する手を取得+探索。なければ0を返す。 int proc_te() { if(g_i >= g_num) return 0; g_te[g_i++]で探索。g_alpha更新。 return 1; }; // スレッド処理 int thread() { while(proc_te()){;} return 0; } // マスターメイン void master() { // ルートの全ての指し手を生成・オーダリング g_num = gen_all_moves(); // 長男探索 g_alpha = search(g_te[0]);g_i++; // スレッド処理 thread()をスレッド数だけ起動。 // マスター処理 while(proc_te()){;} }