Slide 1

Slide 1 text

1 ビット演算の基礎と応用 慶應義塾大学理工学部物理情報工学科 渡辺 2020/07/23

Slide 2

Slide 2 text

2 ビット列同士の論理演算を駆使して計算の高速化を図ること ビット演算の説明 ビット演算の応用例1:イラストロジック ビット演算の応用例2:Directed Percolation 今日話すこと

Slide 3

Slide 3 text

3 真(True)か偽(False)のどちらかの値をとる変数 Pythonの場合 多くのプログラム言語に真偽値を表現する型がある a = bool(1) print(a) # => True type(a) # => bool b = bool(0) print(b) # => False 整数の1をbool型に変換するとTrueに、0はFalseになる type(1 < 2) # => bool 比較結果はbool型になる (if文やwhile文などの条件分岐に使う)

Slide 4

Slide 4 text

4 論理演算とは真偽値に関する演算のこと 否定 (NOT) 「真」の否定 → 偽 「偽」の否定 → 真 print(not True) # => False print(not False) # => True 真偽値をひっくり返す Pythonコード例

Slide 5

Slide 5 text

5 論理積 (AND) 「A and B」は「A かつ B」の意味 AとBがどちらも真の時にのみ真、それ以外は偽 print(True and True) # => True print(True and False) # => False print(False and True) # => False print(False and False) # => False Pythonコード例

Slide 6

Slide 6 text

6 論理和 (OR) 「A or B」は「A または B」の意味 AとBのどちらかが真の時にのみ真、それ以外は偽 print(True or True) # => True print(True or False) # => True print(False or True) # => True print(False or False) # => False Pythonコード例 ※ 他にも否定論理積(NAND)や排他的論理和(XOR)などがある

Slide 7

Slide 7 text

7 ビットが並んだもの ビット列とは 10110110 ビット演算とは ビット列の1を真、0を偽とした論理演算 同じ桁のビットに同時に演算する 64ビットなら64個同時に演算できる 究極の並列計算 二種類(0か1)の値を取るもの ビットとは

Slide 8

Slide 8 text

8 否定 (NOT) 各ビットをひっくり返す(ビット反転) not 10110110 01001001

Slide 9

Slide 9 text

9 論理積 (AND) 二つのビット列の共通部分を抜き出す 01100101 and 10110110 = 00100100 二つのビット列の同じ桁にあるビットが両方とも1なら1、それ以外は0

Slide 10

Slide 10 text

10 論理和 (OR) 二つのビット列のどちらにもない場所を探す 01100101 or 10110110 = 11110111 二つのビット列の同じ桁にあるビットが両方とも0なら0、それ以外は1

Slide 11

Slide 11 text

11 イラストロジック 数字をヒントに、マスを塗っていくパズル イラストが浮かび上がることが多い 「お絵描きロジック」「ピクロス」とも 2,2 4 2 4 2,2 1 1 2 2 3 3 2 2 1 1

Slide 12

Slide 12 text

12 数字は「連続して塗るマス」を表す ルール1 4 以下の三通りの可能性がある

Slide 13

Slide 13 text

13 複数の数字がある場合、「塗るマス」に ひとマス以上空白を空ける ルール2 2,2 以下の三通りの可能性がある 2マス空いてもOK 1マスは空ける

Slide 14

Slide 14 text

14 4 以下の三通りの可能性がある 全ての可能性を試してみて、どの場合でも塗るマスは確定 この2マスは確定

Slide 15

Slide 15 text

15 111100 and 011110 and 001111 = 001100 塗るマスを1、塗らないマスを0とする 可能性を全て列挙し、論理積(AND)を取る 確定するマスの場所が高速に求められる

Slide 16

Slide 16 text

16 2,2 4 2 4 2,2 1 1 2 2 3 3 2 2 1 1 横で確定マスを探したら、次は縦の探索をする 横の探索で確定したマス 次はここに着目 この辺にも確定マスはあるが 説明の都合で未確定とする

Slide 17

Slide 17 text

17 確定マス 2,2 2,2 2,2 以下の可能性のうち、上記と無矛盾なものを探したい

Slide 18

Slide 18 text

18 確定 マス 100000 2,2 and 110110 100000 ANDをとったら確定マスと一致→無矛盾 A and B == A 自分と相手の論理積をとったものが自分と一致 →自分が完全に相手に含まれる 共通 部分

Slide 19

Slide 19 text

19 確定 マス 100000 2,2 and 011011 000000 ANDをとって確定マスと一致しない→矛盾 A and B is not A 自分と相手の論理積をとったものが自分と一致しない →自分が完全に相手に含まれていない 共通 部分

Slide 20

Slide 20 text

20 確定 マス 110110 and 110011 = 110010 確定マスと矛盾しない配置のみ列挙してANDをとる 新たな確定マスを得る

Slide 21

Slide 21 text

21 2,2 4 2 4 2,2 1 1 2 2 3 3 2 2 1 1 同様な処理を縦・横を切り替えながら実行すると、(多分)絵が完成 ※ 空白確定マスの処理をやったかどうか記憶が曖昧・・・

Slide 22

Slide 22 text

22 碁盤の目状の道がところどころ確率pで通行止めになっている 無事な道だけを通って左から右に通過できるか?

Slide 23

Slide 23 text

23 お互いにつながっている領域を色分けする pが大きいほど、同じ色の領域(クラスター)ができる この系をパーコレーション (Percolation)と呼ぶ

Slide 24

Slide 24 text

24 p 通行不能 通行可能 ある確率(0.5)を境に「ほぼ通行不能」か ら「ほぼ通行可能」に急激に変化する 振る舞いが急激に変わることを相転移 相転移する確率pを臨界点と呼ぶ

Slide 25

Slide 25 text

25 active inactive active inactive 時間 向き(Direction)のあるパーコレーション(Percolation) 各ボンドは確率pでアクティブ アクティブなサイトとアクティブなボンドで 下方向につながるサイトはアクティブ サイト ボンド

Slide 26

Slide 26 text

26 最初に「種」を置いておく p が小さい と絶滅 p が大きい と人口爆発 https://www.s.u-tokyo.ac.jp/ja/press/2016/4602/ 相転移 乱流遷移の普遍性と関係 [M. Sano and K. Tamai, Nat. Phys. 12, 249 (2016)] ←「乱流屏風」と呼ばれる実験装置

Slide 27

Slide 27 text

27 0 1 1 0 1 0 1 1 ・ メモリを効率的に利用できる ・ プログラムが高速化される (かもしれない) アクティブなサイトを1、そうでないサイトを0とする マルチスピンコーディングにより・・・ マルチスピンコーディングとは二種類の値を取る自由度を ビットでまとめて表現すること

Slide 28

Slide 28 text

28 時刻 t 時刻 t+1 時刻tの状態から、時刻t+1のサイトの状態を決めたい まずボンドを確率pでアクティブにする アクティブなサイトとアクティブなボンドでつながればアクティブ 時刻 t 時刻 t+1 この作業をビット演算でやりたい

Slide 29

Slide 29 text

29 1. 現在のサイト情報をコピーする 2. アクティブなサイトを1-pの確率で殺す 3. ビットシフトして論理和(OR) shift = ※どちらかとつながればアクティブになるから

Slide 30

Slide 30 text

30 アクティブなサイトを1-pの確率で殺すには 01101011 01110010 = 01100010 and 01110010 1. 各ビットがランダムに確率pで1となるビット列を作る 2. サイト状態と論理積(AND)を取る 3. 確率pで生き残る(確率1-pで死ぬ)

Slide 31

Slide 31 text

31 01110010 各ビットがランダムに確率pで1となるビット列を作る 各ビットが独立に確率pで1、1-pで0となるような ランダムビット列を高速に作るアルゴリズムが欲しい 普通に作るとNビットのビット列にN回の乱数が必要 →ビットレベルの並列性が活かせない

Slide 32

Slide 32 text

32 まず「ビットが何個立つか」を計算し、 次に場所をランダムにシャッフルする 11100000 01100010 位置のシャッフルにRobert-Floydのサンプリング法を使う NビットあるとN回の乱数が必要 →ビットが立たない場所に乱数を振るのは無駄 →ビットが立つところだけに乱数を使いたい

Slide 33

Slide 33 text

33 N個の中からM個をランダムに選ぶアルゴリズム 乱数はM回しか振らなくて良い 1. J ← N-M+1 2. J個のなかからランダムに選ぶ 1. もし選ばれてないものを選んだら、そのまま選ぶ 2. もし選ばれていたらJ+1個を選ぶ 3. J ← J+1 4. J

Slide 34

Slide 34 text

34 例えば4つの中から2個ランダムに選びたい 1. 最初は3つの中からランダムに一つ選ぶ 2. 次に4つの中からランダムに一つ選ぶ 既に選んだのを選んだ そのまま選ぶ 選んでないのを選んだ 4つ目を選ぶ

Slide 35

Slide 35 text

35 一度目に選ばれる 二度目に選ばれる 直接選ばれる 既に選んだものが選ばれる 必要な乱数は選ぶ数(二回)だけ

Slide 36

Slide 36 text

36 立つビット数の計算に乱数を一回使う ビット数は二項分布 (Binomial-Distribution)に従う 平均乱数生成回数 1 + ビット位置のシャッフル(Shuffle)に、ビット数 (平均pN)回の乱数を使う 確率pの試行をN回で何回成功するか?

Slide 37

Slide 37 text

37 1. 適切なパラメタλに従うポアソン分布でkを生成する 2. 1ビットだけランダムに立つビット列をk個用意する 3. それらすべての論理和(OR)を取る 01000000 00000010 00010000 01000000 01010010 or = k 確率pでビットが立つビット列完成 S. Todo and H. Suwa, J. Phys.: Conf. Ser. 473, 012013(2013)

Slide 38

Slide 38 text

38 1ビットだけ立ったビット列の数を作るのに乱数一回 この数はポアソン分布(Poisson-distribution)に従う 1ビットだけ立ったビット列をk個作るのに乱数k回 kの期待値は N log(1-p) 最後に全てのビット列の論理和(OR)を取る 平均乱数生成回数 1 + log 1 −

Slide 39

Slide 39 text

39 p = 0.5に近い時は? 有限桁法 「pが大きい時」は、1-pで作ってビット反転 BS法、PO法は「pが小さい時」に有利 BS法 PO法 p 乱 数 生 成 回 数

Slide 40

Slide 40 text

40 良い乱数 = 各ビットが確率1/2で独立に1になっている 01010101001001110001000010101111 01001010011001111111100000111000 00011000001010011000001000111110 10011010010101010000101000110011 00111010011101001111101100110011 メルセンヌ・ツイスタ法で作成した32ビット乱数列 つまり、 p= 0.5なら乱数一回で作ることができる

Slide 41

Slide 41 text

41 確率1/2でビットが立っているビット列 x1, x2 01010101 10011001 x1 x2 01010101 10011001 00010001 x1 and x2 and = 01010101 10011001 11011101 x1 or x2 or = 確率1/4のビット列 確率3/4のビット列 1/4 = (0.01)B 3/4 = (0.11)B

Slide 42

Slide 42 text

42 1/2 = (0.1)B 1/4 = (0.01)B 3/4 = (0.11)B 5/8 = (0.101)B n個の乱数で二進数表記n桁の確率を表現できる x1 x2 AND x1 x2 OR x1 x3 OR (x2 AND x1) 論理式の作り方: pを二進数表記して、右から「1ならAND」「0ならOR」 (0.0101)B = 5/16 3 2 1 x4 AND (x3 OR (x2 AND x1))

Slide 43

Slide 43 text

43 p = 0.51のビット列が欲しい時 1. 有限桁法で p = 0.5のビット列を作る 2. BS法かPO法でp=0.02のビット列を作る 3. 二つのビット列のORを取る 1 - p =(1-0.5)(1-0.02) ORは「どちらも0なら0」 できたビット列の0の確率 二つとも0の確率 p = 0.51

Slide 44

Slide 44 text

44 有限桁法の精度を上げるほど ・ 近似ビット列の生成に必要な乱数生成回数は増える ・ 補正に必要な乱数生成回数は減る 確率pに依存して最適な組み合わせが存在する p=0.6447の場合 p=1/2 (0.5) から p = 0.2894で補正 p=5/8 (0.625) から p = 0.0197で補正 有限桁法で作る BS法/PO法で作る

Slide 45

Slide 45 text

45 平 均 乱 数 生 成 回 数 p = 1/4 からの補正 p = 3/8 からの補正 32ビットなら高々7回の乱数生成で 任意の確率のビット列を生成可能 欲しい確率p

Slide 46

Slide 46 text

46 普通に実装すると、スカラー実装の方が早い 有限桁法で0.625から補正すると、PO法+補正が効率的 スカラー実装 BS法 PO法 BS法+補正 PO法+補正 Larger is better p = 0.6447 (DPの臨界点) Millions of bits per second (メガビット生成毎秒)

Slide 47

Slide 47 text

47 臨界点における人口増加 実行時間 64ビットマルチスピンコーディングにより14倍の高速化

Slide 48

Slide 48 text

48 各ビットが独立に確率pで1となるビット列を 生成するアルゴリズムを考案 Binomial-Shuffle (BS) 法 立てるビット数を決めてからシャッフル Poisson-OR (PO) 法 1ビットランダムに立っているビット列の論理和 有限桁法 p=0.5となるビット列を桁数の数だけ論理演算 Directed Percolationのマルチスピンコーディング を実装し、スカラー実装に比べて劇的に高速化 arXiv:1808.05009 https://github.com/kaityo256/rbs HW, S. Morita, S. Todo, N. Kawashima, J. Phys. Soc. Jpn. 88, 024004 (2019)