sakurapyon’s blog

sakurapyon’s blog

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

SIMD演算テクニック - Programming Lab

二歩のチェック

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対策のついでに千日手処理を書いている。

これはひどい

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%2F15%2Fwdoor%2Bfloodgate-900-0%2BKakinoki-Z%2Bsakurapyon_2013%2B20130415063005.csa&go_last=on&move_to=10

七香と逃げたあと角金交換後に1八金打にて先手優勢。読みで解決できるのかな?

静止探索のオーダリング

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も実装しなきゃだわ。

TCP/IPの通信の切断検知 - 揮発性のメモ