Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビットボード解説

antenna_three
November 20, 2020

 ビットボード解説

UTMC (http://www.komaba.utmc.or.jp/) の活動としてリモートで行ったプレゼンテーションです。ビットボードという技術について、オセロやチェスを例にとって解説しました。

antenna_three

November 20, 2020
Tweet

More Decks by antenna_three

Other Decks in Programming

Transcript

  1. n進数 • 2進数 • 基本的に断りのない数は2進数 • ほかの進数と区別するときは接頭辞 "0b" を付ける •

    16進数 • 64ビット整数などの大きな数を書くときに使用 • 接頭辞 "0x" を付ける
  2. 並列化 • マルチプロセッサ • GPGPU • マルチスレッド • SIMD •

    ビット配列 ビットボードはビット配列を利用した高速化技術
  3. ウルフラムコード • 次のセルの状態を決めるのは3つの近傍セルの状態 • 3つの近傍セルの状態の組み合わせは23 = 8通り • 8通りの近傍セルの状態それぞれについて、次のセルの状態が 2通りあるので、ルールは28

    = 256通り • 256通りのルールをナンバリングしたものがウルフラムコード • 例えば、下のルールのウルフラムコードは01011010 (2) = 90 現在の近傍 111 110 101 100 011 010 001 000 次の状態 0 1 0 1 1 0 1 0
  4. ルール90 0 0 0 0 0 1 0 0 0

    0 0 0 0 0 0 1 0 1 0 0 0 0 現在の近傍 111 110 101 100 011 010 001 000 次の状態 0 1 0 1 1 0 1 0
  5. ルール90 0 0 0 0 1 0 1 0 0

    0 0 0 0 0 1 0 0 0 1 0 0 0 現在の近傍 111 110 101 100 011 010 001 000 次の状態 0 1 0 1 1 0 1 0
  6. ルール90 0 0 1 0 1 0 1 0 1

    0 0 現在の近傍 111 110 101 100 011 010 001 000 次の状態 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
  7. ルール90 0 1 0 0 0 0 0 0 0

    1 0 現在の近傍 111 110 101 100 011 010 001 000 次の状態 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0
  8. ルール90 0 0 0 0 0 0 0 0 0

    0 0 0 0 0 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 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 1 0 0 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 1 0 1 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 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 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 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
  9. 黒石が置けるマス(合法マス)を求めたい • • • • • • • • •

    • • • • • • • 合法マスの定義: 1. 周囲8方向のいずれかにおいて 1個以上の白石が続いたのちに 黒石があるような空のマス 2. 黒石の周囲8方向にあって 1個以上の白石が続いたのちに ある空のマス
  10. 黒石の左方向にある合法マスを求めたい a b c d e f g h 1

    2 3 • • • • 4 • • • • • 5 • • • • • • • 6 7 8 • 左図におけるa5のマスが 求めたい合法マス • 少し複雑な手順になるので ステップごとに説明
  11. Rotated bitboard • 縦方向や斜め方向の利きを算出するために、90度回転、±45度 回転させたoccupied bitboard (rotated bitboard) を管理する •

    4つのoccupied bitboardを管理するので局面更新の処理が 増加する • 1つの変数に複数のrotated bitboardを詰め込めば 処理増加は抑えられる
  12. Magic bitboard 6 5 4 3 2 1 g f

    e d c b ♜ • ルーク♜が右下にあるときの 利きに関係するマスは左の ようになる • Occupied bitboardから、 利きに関係するマスを残して 関係ないマスは0にマスクす る
  13. Magic bitboard 6 5 4 3 2 1 g f

    e d c b ♜ • ここで、おもむろに を 左のマスクされたoccupied bitboardにかける
  14. Magic bitboard g' f' e' d' c b 6 5

    4 3 2 1 • すると、うまい具合に利きに 関係するマスが連続する • ただし、 • あとは横利きを求める場合と 同様に、利きに関係するマス の状態をキーとしたルック アップテーブルを参照すれば 縦横の利きが同時に求められ る g' f' e' d' = g f e d + 5 4 3 2
  15. pext • x86拡張命令セット "Bit manipulation instructions sets (BMI sets)" にて

    "pext (Parallel bits extract)" 命令が使えるように • 集めたいビットだけを立てたマスクを指定すれば、入力から指 定したビットを下位ビットに集めて出力してくれる • 入力がstuvwxyz、マスクが10101010なら出力は0000suwy、と いう具合
  16. Rotated vs. Magic vs. pext • Rotated bitboardはテーブルが小さくて済む • Intel系ではpextが少し速い

    • ZENアーキテクチャではpextはかなり遅い • 今はMagic bitboardが主流
  17. 参考文献 • セル・オートマトン | Wikipedia https://ja.wikipedia.org/wiki/セル・オートマトン • オセロをビットボードで実装する | Qiita

    https://qiita.com/sensuikan1973/items/459b3e11d91f3cb37e43 • ビットカウントする高速アルゴリズムをPythonで実装しながら 詳しく解説してみる | Qiita https://qiita.com/zawawahoge/items/8bbd4c2319e7f7746266 • やねうら王 http://yaneuraou.yaneu.com/