うらお10以前、Windowsだと1つのソフトから最大で論理64コアまでしか使えないので、いまどきの44コア88スレッドのようなPCだと全コア使い切れなくてどうすんねんみたいな話を書いたが、Stockfishの最新版で、全コアを使い切れるようなcommitがあった。参考のためURLを貼り付けておく。うらお12電王トーナメントの開催日も迫る中、やねうら王のMovePickerにバグが発見されました。うらお4Stockfish完全解析もいよいよ今回で最終回。picker)などの上に成り立つので、ボトムアップ式に解説してきた結果、一番大切なところが一番最後になりました。うらお2今回はmaterial.hとmaterial.cppの解説をします。言っても、この二つ、将棋では使わないからあまり関係ないです。ソースコードには簡単なコメントしかつけていません。Stockfishの評価関数evaluate()は、手番側から見た評価値を返すので、後手番であれば符号を反転して返す、みたいな処理が必要です。今回はベンチマーク部です。second=1秒あたりの探索ノード数)などを表示します。Evaluation)の実装があります。SEEは、局面を評価するときに、駒の取り合いが終わっている静かな局面で評価するために考えられた手法で、ある地点での駒の取り合いを指し手生成などをせずに調べます。今回は盤面構造体であるpositionクラスについて解説します。このpositionクラス、本当によく出来ていて、将棋ソフトに応用する場合でも、よくよく考えていくとこれと同じ構造に辿り着くと思います。いう意味では、将棋ソフトを作る場合でも独自に実装するより先に、このpositionクラスのソースコードを読んだほうがいいと思います。今回はスレッド周りです。探索を並列化するために並列数だけスレッドの生成が必要です。あと思考時間を監視して、時間になったときに思考を打ち切る判定をするためのスレッドも必要です。GitHubのC++11用のコードだとスレッド生成はstd::threadを使って実装されています。ここで紹介しているのはC++11用のブランチです。pickerと言って、指し手を段階的に生成して、生成した指し手のなかから1つ一番よさげな指し手を取り出す部分(いわゆる指し手オーダリング)について見ていきます。killerが2本あったり、なるべくソートが要らないように工夫してあったり、なかなか興味深いです。