AVX2版は共通化
今は、MasterReversi Ver1.5.1のリリースに向けた最終作業を行っているのだが、現行版では別バイナリにしてあったAVX2版は64Bit版と共通化する事にした。性能的なデメリットは無い事もないのだが、AVX2版を別ファイル化しない事で、利便性は向上する筈だ。
現行のAVX2版の開発時に書いた筈なのだが、AVX2版のビルドはVisual Studio Community 2017で行っているのだが、そのビルドオプションでコンパイラにはAVX2命令を使う事を許可している。
なので、現行のAVX2版では、AVX2命令が実行バイナリの随所で使われる格好になっている分、64Bit版との共通化は行えなかった訳だ。
にも関わらず、Ver1.5.1では、共通化しようとしているのだが、これはつまり、Ver1.5.1ではコンパイラにAVX2命令を使わせなくする、という事になるのだが、性能的には、その分、少しは低下する感じも無い事はない。
しかし、手元にあるバイナリで実測してみた所、例えば、FFO40-59では、コンパイラにAVX2命令を使わせた場合には173秒程度だった処理時間が使わせない場合にも175秒程度にしか低下しなかった訳だ。
上記の違いというのは、MasterReversi的には、測定誤差に含まれる程度でしかないので、利便性を考慮して、次バージョンでは、AVX2版を別バイナリ化しない事にした訳だ。
もっとも、コンパイラにAVX2命令を使わせなくする、という事は、AVX2版は消滅するのか、というと、そういう事ではない。
AVX2命令はFlip処理等の主要ルーチンで、作者製のコードとしてダイレクトに使っているので、次バージョンでも、AVX2命令が使える環境では処理性能が向上するのだが、AVX2命令を使っている処理コードは限られる格好になるので、AVX2命令が使えない環境では、AVX2命令を使わないコードに切り替えて動作させる事が可能になった、という事になる訳だ。
と、いう事なので、Ver1.5.1では、AVX2版というモノは無くなるのだが、これは、64Bit版の通常の実行ファイルでも、AVX2命令が使える環境では、自動的にAVX2命令が使われる様になる、という事で、Ver1.5.0では提供されていたAVX2に対応した高速コードが使えなくなる、という訳ではないので注意して貰いたい所ではある。
ちなみに、AVX2命令が使える環境では、現行のAVX2版よりもVer1.5.1の方が、少なくともFFOテストでは、より高速に動作する様になる。
その理由は、評価データがFFOテストの局面データを追加学習させたモノに切り替わるのが大きいのだが、現行版の評価データを使ったとしても、状況によっては、少しは高速化される筈だ。
その理由は、今回、内部コードの微調整も、再度、行ったからなのだが、AVX2版と比べると、通常の64Bit版の処理性能の向上の方が大きい筈だ。
これは、現行のAVX2版が高速なのは、AVX2命令を使う様になっているから、という以外に、並列演算用のコードに微調整が入っているからでもあるからだ。
つまり、現行の64Bit版には、この並列演算用のコードに対する微調整が入っていない分、AVX2版よりも、随分と遅かったのだが、次バージョンでは、通常の64Bit版に対しても、AVX2版と同じ微調整が適用させるので、微調整2回分の性能向上が期待できる訳だ。
逆に言うと、AVX2版の通常版に対するメリットは減る格好になるので、今回、AVX2版と通常版は共通バイナリ化する事にしたのだが、それでも、AVX2命令が使える環境では、まあ、1割強は、AVX2命令を使ったコードの方が高速に動作する感じではある。