最新

Miyako Shogi System

コツコツ改良、へこたれない
2014| 1|
2013| 12|
2012| 01| 02| 04| 05| 06| 07| 08| 09| 10|
2011| 01| 02| 03| 04| 05| 07| 08| 10| 11| 12|
2010| 02| 03| 06| 07| 08| 09| 10| 12|

2012/09/29

手生成ベンチマーク

ベンチマークができる程度になってきたので色々測ってみた。上記の後手番での手生成回数。

コンパイラ別

CPU:phenom II 3.2GHz

OSコンパイラSIMD命令回数
windows XP 32bitmingw 4.71174398
windows XP 32bitmingw 4.7876808
ubuntu 64bitgcc 4.61391788
ubuntu 64bitgcc 4.61036269
ubuntu 64biticc 12.01388889
ubuntu 64biticc 12.01251564
ubuntu 64biticc 13.01323627
ubuntu 64biticc 13.01104972
ubuntu 64bitclang 3.01158078
ubuntu 64bitclang 3.01044932
ubuntu 32bitgcc 4.61123596
ubuntu 32bitgcc 4.6883783
ubuntu 32biticc 12.01184834
ubuntu 32biticc 12.01201923
ubuntu 32biticc 13.01187648
ubuntu 32biticc 13.01178550

CPU別(コンパイラ gcc 4.6,4.7)

CPUOSSIMD命令回数
prescott pen4 2.8GHzubuntu 64bit622665
prescott pen4 2.8GHzubuntu 64bit342583
phenom II 3.2GHzubuntu 64bit1391788
phenom II 3.2GHzubuntu 64bit1036269
northwood pen4 3.0GHzdebian 32bit735565
northwood pen4 3.0GHzdebian 32bit632711
prescott pen4 3.2GHzdebian 32bit683761
prescott pen4 3.2GHzdebian 32bit328569
conroe core2 2.4GHzubuntu 64bit984252
conroe core2 2.4GHzubuntu 64bit834376
core i3 3.4GHzubuntu 64bit2100840
core i3 3.4GHzubuntu 64bit1315790

SIMD命令はまだうまく書けて無いようなので、参考までに。実はconroeを測定したときに古くて遅いCPUなのに、結構いいスコアをたたき出したので、急遽core i3を買ってきた次第。bfs/brs命令がAMDは遅いためbitboardでは不利と見た。

2012/09/22

bitboardによる手生成の実装方法

bitboardによる銀の移動手のコード例としては、

org=p->bitboard[BLACK][P_GIN];  // 先手の銀のbitboard
while ( test128(org) ) {  // 駒がある
  from=bit_pop1st(&org);  // 駒位置
  and128(t,attack_gin_b[from],target);  // 先手銀の利きのbitboardを押し付ける
  while ( test128(t) ) {  // 利きのある数
    to=bit_pop1st(&t); // 移動先の位置
    pin_check()
    手の格納
  }
}

というふうになるであろう。上記コードにおいて、test128()はbitboardがゼロか非ゼロかをテストする関数である。

bit_pop1stはbitboardのLSBから立っているビット位置を返し、そのビットをクリアする関数である。32ビット版では次のようなコードとなっている。

bit_pop1st(BITBOARD *x)
{
int pos;
  if ( x->l ) {
    pos=__builtin_ctz(x->l);
    x->l&=(x->l-1);     // reset bit
    return pos;
  }
  else if ( x->m ) {
    pos=__builtin_ctz(x->m)+32;
    x->m&=(x->m-1);     // reset bit
    return pos;
  }
  pos=__builtin_ctz(x->h)+64;
  x->h&=(x->h-1);     // reset bit
  return pos;
}

_builtin_ctzはLSB側から'1'のビット位置を返す関数。x86ではbsf命令で展開される。

2012/09/09

駒を取らない移動手王手の生成

静止探索内では駒を取る手、駒を取らない王手を生成している。

bitboardによる隣接王手生成

たとえば52に王がいるとして銀の利きデータを貼り付ける
9 8 7 6 5 4 3 2 1
 0  0  0  1  0  1  0  0  0 一
 0  0  0  0  K  0  0  0  0 二
 0  0  0  1  1  1  0  0  0 三
 0  0  0  0  0  0  0  0  0 四
 0  0  0  0  0  0  0  0  0 五
 0  0  0  0  0  0  0  0  0 六
 0  0  0  0  0  0  0  0  0 七
 0  0  0  0  0  0  0  0  0 八
 0  0  0  0  0  0  0  0  0 九

ビットの立った位置に銀の利きがあれば王手となる

74に地点に銀がいるとして、銀の利きは

9 8 7 6 5 4 3 2 1
 0  0  0  0  0  0  0  0  0 一
 0  0  0  0  K  0  0  0  0 二
 0  1  1  1  0  0  0  0  0 三
 0  0  S  0  0  0  0  0  0 四
 0  1  0  1  0  0  0  0  0 五
 0  0  0  0  0  0  0  0  0 六
 0  0  0  0  0  0  0  0  0 七
 0  0  0  0  0  0  0  0  0 八
 0  0  0  0  0  0  0  0  0 九

上記のbitboardに銀の利きをandして

9 8 7 6 5 4 3 2 1
 0  0  0  0  0  0  0  0  0 一
 0  0  0  0  K  0  0  0  0 二
 0  0  0  1  0  0  0  0  0 三
 0  0  S  0  0  0  0  0  0 四
 0  0  0  0  0  0  0  0  0 五
 0  0  0  0  0  0  0  0  0 六
 0  0  0  0  0  0  0  0  0 七
 0  0  0  0  0  0  0  0  0 八
 0  0  0  0  0  0  0  0  0 九

63の地点が王手の手となる

駒打ち王手生成

たとえば52に王がいるとして銀の利きデータを貼り付ける
9 8 7 6 5 4 3 2 1
 0  0  0  1  0  1  0  0  0 一
 0  0  0  0  K  0  0  0  0 二
 0  0  0  1  1  1  0  0  0 三
 0  0  0  0  0  0  0  0  0 四
 0  0  0  0  0  0  0  0  0 五
 0  0  0  0  0  0  0  0  0 六
 0  0  0  0  0  0  0  0  0 七
 0  0  0  0  0  0  0  0  0 八
 0  0  0  0  0  0  0  0  0 九

ビットの立った位置に銀を打てば王手となる

リンクはご自由に (Miyako Shogi System Kyoto Japan)

ダウンロードのページ

Lighttpd

DreamPlug