HiraokaTakuya / apery

a USI Shogi engine.
https://hiraokatakuya.github.io/apery
GNU General Public License v3.0
270 stars 54 forks source link

Bitboard::operator == ()の実装について。 #5

Closed yaneurao closed 8 years ago

yaneurao commented 8 years ago

提案を書きたいのですが、GitHubで提案の仕方がよくわからないので、issueに書かせてもらいます。おかしかったら消してください。

Bitboard::operator ==()の実装なのですが、SSE4用は return (_mm_testc_si128(_mm_cmpeqepi8(this->m, rhs.m_), _mm_set1_epi8(static_cast(0xffu))) ? true : false); こうなっていますが、これは以下のようにすると2命令で済みます。 __m128i neq = _mm_xor_si128(this->m, rhs.m); return _mm_test_all_zeros(neq, neq) ? true : false;

あと別件ですが、firstOneFromMSB()なのですが、63-indexを返してありますが、あれやめて、素直にindexを返したほうがよっぽどすっきりすると思います。関数名もMSB()とかに変更して。そうすればtt.cppでメモリ確保するときにMSB求めるのも、63 - firstOneFromMSB()みたいなことしなくて済みますし、何よりそちらのほうが直感的でわかりやすいです。

HiraokaTakuya commented 8 years ago

ご提案ありがとうございます。 Bitboard::operator == () の実装に関しては、書き換えたものの方が、実測で微妙に遅くなってしまいました。 比較はいくつかのサンプル局面で1コアで十分長い時間探索させてNPSの比較をしました。

firstOneFromMSB() もそうですし、他の名前も Stockfish に合わせていった方が良いと思います。どこかで一気に色々直したいと思います。

yaneurao commented 8 years ago

微妙に遅くなりましたか…。それは申し訳ないです。レジスタ割当の問題もあって、命令数が少なければ良いというものでもなさそうで難しいですね…。

変数名のほうは、どこかでStockfishに倣ってもらえると、SEE()とかmate1ply()とかを、Apery ←→ やねうら王のものを差し替えて実験ができたりしてすこぶる便利だと思います。楽しみにしてます。