0チェック
// 非0なら1 # define Bitboard_Test(b) ( ! _mm_testz_si128( (b).m, _mm_set1_epi8(0xff) ) )
はじめてのSSE その5 - 2011-09-12 - Bonanzaソース完全解析ブログ
問) andnotのときに使った_mm_set1_epi8という命令に対応するアセンブリ命令は何か? (答え) 直接対応する命令はありません。どこかのメモリに0xffが16バイト格納されて、(普通は)それをいったんxmmレジスタに取り出すコードが生成されます。
はじめてのSSE その6 - 2011-09-13 - Bonanzaソース完全解析ブログ
だとすると、_mm_set1_epi8(0xff) は、_mm_cmpeq_epi32((b).m,(b).m) の方が速かったりする?
論理演算 全ビットを0/1にする。 同じレジスタでPXORをとれば全ビットが0になります。 pxor mm0, mm0 ; mm0.pb[]=0 同じレジスタでPCMPEQB/PCMPEQW/PCMPEQDをとれば全ビットが1になります。 pcmpeqb mm0, mm0 ; mm0.pb[]=1
二歩のチェック
SSEだと遅くなったので書き直し。
歩のビットボードと、縦1列がONになったビットボードをANDして、0以外ならその列には打てない(既に歩がある列である)。
縦1列のビットボードは定数なんだけど SSEを使うとメモリアクセスになるので、最初の1つ以外はシフトで作った方が速いと思う[要確認]。sakurapyonのビットボードは32bits*3なので _mm_slli_epi32が使える。
BitBoard b=歩が打てそうな場所; BitBoard bf=bb_file0; if(!((b_pawn&bf).isZero())) b-=bf; for(auto i=0;i<8;i++){ bf.mm=_mm_slli_epi32(bf.mm,1); if(!((b_pawn&bf).isZero())) b-=bf; } // bに歩が打てる場所が入っている
千日手の扱い
http://wdoor.c.u-tokyo.ac.jp/shogi/view/index.cgi?csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2FLATEST%2F2013%2F04%2F21%2Fwdoor%2Bfloodgate-900-0%2Bsakurapyon_2013%2Bfrenzy-floodgate%2B20130421173008.csa&go_last=on&move_to=50
▲9四歩△9三歩▲同歩成△9二歩の千日手になりそうな局面。
▲3五銀から無理気味に打開。
sakurapyonの処理
SHEK対策のついでに千日手処理を書いている。
- 時間が残ってなければ、千日手でもいい(そのまま処理)
- 本当は相手の残り時間も見るべきですね
- 時間が残っているなら適当な評価値(-100点など)を与えて処理
- 駒損でも-100より良い評価値になるなら打開してしまう(3五銀はたぶんそれ)
- ひよこカルロ将棋v0.20はv0.19より強いのですが - ひよこ将棋、はじめました。では -歩の価値×2
- そもそもどれぐらいの値を与えればいいのか?
- +500ぐらい与えたら永瀬流になるのか?
- 置換表絡みの面倒臭い処理は手抜き
静止探索のオーダリング
MVV/LVAやSEEではなく History順にスコアリングしている。それでいいのか…
template<> void MovePicker::score<QUIETS>() { Move m; for (MoveStack* it = moves; it != end; ++it) { m = it->move; it->score = Hist[pos.piece_moved(m)][to_sq(m)]; } }
https://github.com/mcostalba/Stockfish/blob/master/src/movepick.cpp
追記:コメントにて、静止探索じゃなくて通常探索だと指摘いただきました(><)。ありがとうございました。
gps500が居なくなってる
昨日のu-tokyoのネットワークトラブル以降、gps500の姿を見かけない。
Gasyouも同じタイミングで行方不明。
TCP KeepAliveあたりかなあ。sakurapyonも実装しなきゃだわ。