avx2時代の正規表現マッチング 〜半群でぐんぐん!〜

115
Ryoma Sin’ya @sinya8282 AVX2時代の 正規表現マッチング 半群でぐんぐん! Saturday, March 31, 12

Upload: sinya8282

Post on 14-Nov-2014

4.974 views

Category:

Technology


6 download

DESCRIPTION

x86/x64最適化勉強会での発表資料です http://atnd.org/events/25823 UST → http://www.ustream.tv/recorded/21484937 2013年度のHaswellから入るAVX2を使った正規表現マッチングというマニアックなネタ :-)

TRANSCRIPT

Page 1: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ryoma Sin’ya @sinya8282

AVX2時代の正規表現マッチング~ 半群でぐんぐん! ~

Saturday, March 31, 12

Page 2: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

はじめに・発表者 新屋 良磨 (しんや りょうま@東工大院生 @sinya8282)

 正規表現好き。正規表現エンジンとか作ってます(grepも)  → https://github.com/sinya8282/regen

・内容 AVX2で夢が広がる命令が色々入る!! 正規表現マッチングのSIMD実装を先日 思いついたのでソレを (正規表現パート長めです)

・Keywords:正規表現, 半群, AVX2

Saturday, March 31, 12

Page 3: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規表現

Saturday, March 31, 12

Page 4: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (1)

X言語 が正規

, e は正規表現 で書ける

X = L(e)X

Saturday, March 31, 12

Page 5: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (1)

X言語 が正規

, e は正規表現 で書ける

X = L(e)X

eの受理言語集合

Saturday, March 31, 12

Page 6: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$

→ IMAP認証のオーバーフロー攻撃パケット (Snort)

・ .*AUTH\s[^\n]{100}

・.*(hoge|fuga|piyo)→ 複数文字列探索 (strstrの上位互換)

正規表現で何が書ける?

Saturday, March 31, 12

Page 7: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$

→ “X86”, “X64”以外の文字列

→ IMAP認証のオーバーフロー攻撃パケット (Snort)

・ .*AUTH\s[^\n]{100}

・.*(hoge|fuga|piyo)→ 複数文字列探索 (strstrの上位互換)

正規表現で何が書ける?

Saturday, March 31, 12

Page 8: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

・テキスト長nに対して線形時間で探索可

・文字列探索において能力が高い

正規表現で何が嬉しい?

・モノイド, DFA, 論理式,,, 性質の良いモデル と対応

→ 正規表現 ⊃ 複数文字列 ⊃ 固定文字列

→ 後述するDFAを作ればO(n)→ NFAだとO(n × NFAの状態数)

Saturday, March 31, 12

Page 9: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (2)

X言語 が正規,  はある有限モノイド

の受理言語MX = L(M)

X

Saturday, March 31, 12

Page 10: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (2)

X言語 が正規,  はある有限モノイド

の受理言語MX = L(M)

X

このモノイドは特にSyntactic Monoid と呼ばれる

Saturday, March 31, 12

Page 11: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイド?(復習)

M = {S, e, ·}

単位元

なんかの集合

e 2 S :

S :· :結合則を満たす二項演算

モノイド

8x 2 S [e · x = x · e = x]

Saturday, March 31, 12

Page 12: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイド?(復習)

M = {S, e, ·}

単位元

なんかの集合

e 2 S :

S :· :結合則を満たす二項演算

モノイド

例えば → 自然数の加算,乗算{N, 0,+}{N, 1,⇥}

8x 2 S [e · x = x · e = x]

Saturday, March 31, 12

Page 13: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイド?(復習)

M = {S, e, ·}

単位元

なんかの集合

e 2 S :

S :· :結合則を満たす二項演算

モノイド

例えば → 自然数の加算,乗算{N, 0,+}{N, 1,⇥}

「単位元のある」半群(単位元なんて飾りです(ぇ)

8x 2 S [e · x = x · e = x]

Saturday, March 31, 12

Page 14: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイドと言語受理

a · b · a · a · b⌧ 7!: “abaab” :文字列→モノイドへの準同型写像

文字列 が受理文字列 受理元  が存在して :

x

s, ⌧ s 7! x

Saturday, March 31, 12

Page 15: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイドと言語受理

a · b · a · a · b⌧ 7!: “abaab” :文字列→モノイドへの準同型写像

文字列 が受理文字列 受理元  が存在して :

x

s,

a*注意 文字“a”とモノイド   の元 はベツモノ

⌧ s 7! x

Saturday, March 31, 12

Page 16: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}

Saturday, March 31, 12

Page 17: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

Saturday, March 31, 12

Page 18: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

a · a = aa

Saturday, March 31, 12

Page 19: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

a · b = ab

Saturday, March 31, 12

Page 20: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

a · aa = a

Saturday, March 31, 12

Page 21: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

a · ab = b

Saturday, March 31, 12

Page 22: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

✏との二項演算は不変(単位元)

Saturday, March 31, 12

Page 23: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

Saturday, March 31, 12

Page 24: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

との二項演算は常に (零元);

;

Saturday, March 31, 12

Page 25: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

Saturday, March 31, 12

Page 26: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

bを受理元とすれば!!⌧ : 7! a“a” , 7! b“b” 7! ✏, “”

Saturday, March 31, 12

Page 27: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

bを受理元とすれば!!⌧ : 7! a“a” , 7! b“b” 7! ✏, “”

“aaaab” a · a · a · a · b = b⌧ : 7!のように受理文字列が定められ

Saturday, March 31, 12

Page 28: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

M = {{✏, a, b, aa, ab, ;}, ✏, ·}✏ a b aa ab ;

✏ ✏ a b aa ab ;a a aa ab a b ;b b ; ; ; ; ;aa aa a b aa ab ;ab ab ; ; ; ; ;; ; ; ; ; ; ;

bを受理元とすれば!!⌧ : 7! a“a” , 7! b“b” 7! ✏, “”

“aaaab” a · a · a · a · b = b⌧ : 7!のように受理文字列が定められL(M) = L((aa)*b)

Saturday, March 31, 12

Page 29: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイドわかった?

・正規表現から対応するモノイドを 「作る」ことはできる?

・この説明では正規表現とモノイドの 具体的関係が良く掴めないと思います

Saturday, March 31, 12

Page 30: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイドわかった?

・正規表現から対応するモノイドを 「作る」ことはできる?

・この説明では正規表現とモノイドの 具体的関係が良く掴めないと思います

できる!!

Saturday, March 31, 12

Page 31: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

モノイドわかった?

・正規表現から対応するモノイドを 「作る」ことはできる?

・この説明では正規表現とモノイドの 具体的関係が良く掴めないと思います

できる!! (´・ω・`)シただもうちょっと待って

Saturday, March 31, 12

Page 32: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (3)

X言語 が正規, ある有限オートマトン

の受理言語

X = L(A)A

Saturday, March 31, 12

Page 33: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (3)

X言語 が正規, ある有限オートマトン

の受理言語

X = L(A)A

今回はDFAのみが登場

Saturday, March 31, 12

Page 34: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

DFAの5個組表現(基本)

DFA D = {Q,⌃, �, q0, F}Q :⌃ :

q0 :F :

� : Q ! Q

状態集合(有限)文字集合(有限)

遷移関数初期状態受理状態集合

Saturday, March 31, 12

Page 35: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

q0 = 0F = {2}

� : (0, a) 7! 1, (0, b) 7! 2

Q = {0, 1, 2, 3}⌃ = {a, b}

· · ·

01

a

2

ba

3

b

a, b

a, b

DFA D

Saturday, March 31, 12

Page 36: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

Saturday, March 31, 12

Page 37: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

Saturday, March 31, 12

Page 38: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

�(0, “aba”) = �(1, “ba”) = �(3, “a”) = 3

Saturday, March 31, 12

Page 39: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

�(0, “aba”) = �(1, “ba”) = �(3, “a”) = 3による文字列DFA D s

の受理判定は�(q0, s) 2 F?

の判定

Saturday, March 31, 12

Page 40: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

�(0, “aba”) = �(1, “ba”) = �(3, “a”) = 3

Saturday, March 31, 12

Page 41: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

�(0, “aba”) = �(1, “ba”) = �(3, “a”) = 3

  受理状態に辿り着く→受理!!

Saturday, March 31, 12

Page 42: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

L(D) = L((aa)*b)

DFA D

�(0, “aab”) = �(1, “ab”) = �(0, “b”) = 2

�(0, “aba”) = �(1, “ba”) = �(3, “a”) = 3

Saturday, March 31, 12

Page 43: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

DFAの行列表現(応用)

DFA D = {I, �, F}I :

� :F :

初期状態ベクトル

受理状態ベクトル

遷移行列

Saturday, March 31, 12

Page 44: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

=

8>><

>>:

�1 0 0 0

�,

0

BB@

; {a} {b} ;{a} ; ; {b}; ; ; {a, b}; ; ; {a, b}

1

CCA ,

0

BB@

0010

1

CCA

9>>=

>>;

DFA D = {I, �, F}

01

a

2

ba

3

b

a, b

a, b

Saturday, March 31, 12

Page 45: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

=

8>><

>>:

�1 0 0 0

�,

0

BB@

; {a} {b} ;{a} ; ; {b}; ; ; {a, b}; ; ; {a, b}

1

CCA ,

0

BB@

0010

1

CCA

9>>=

>>;

初期状態のみ1

DFA D = {I, �, F}

01

a

2

ba

3

b

a, b

a, b

Saturday, March 31, 12

Page 46: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

=

8>><

>>:

�1 0 0 0

�,

0

BB@

; {a} {b} ;{a} ; ; {b}; ; ; {a, b}; ; ; {a, b}

1

CCA ,

0

BB@

0010

1

CCA

9>>=

>>;

DFA D = {I, �, F}

01

a

2

ba

3

b

a, b

a, b

受理状態のみ1

Saturday, March 31, 12

Page 47: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

=

8>><

>>:

�1 0 0 0

�,

0

BB@

; {a} {b} ;{a} ; ; {b}; ; ; {a, b}; ; ; {a, b}

1

CCA ,

0

BB@

0010

1

CCA

9>>=

>>;

DFA D = {I, �, F}

01

a

2

ba

3

b

a, b

a, b

状態0から状態0に遷移する文字はない

Saturday, March 31, 12

Page 48: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

=

8>><

>>:

�1 0 0 0

�,

0

BB@

; {a} {b} ;{a} ; ; {b}; ; ; {a, b}; ; ; {a, b}

1

CCA ,

0

BB@

0010

1

CCA

9>>=

>>;

DFA D = {I, �, F}

01

a

2

ba

3

b

a, b

a, b

状態0から状態0に遷移する文字はない

状態0から状態1に遷移する文字はa

Saturday, March 31, 12

Page 49: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

「文字ごと」に遷移行列を考えてみる (要素は1,0のみ

   論理行列)

Saturday, March 31, 12

Page 50: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Saturday, March 31, 12

Page 51: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

文字aで状態0は状態1に遷移

Saturday, March 31, 12

Page 52: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

01

a

2

ba

3

b

a, b

a, b

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

文字aで状態0は状態1に遷移

文字aで状態1は状態0に遷移

Saturday, March 31, 12

Page 53: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

行列演算で受理判定!!例題: “aaaab”

Saturday, March 31, 12

Page 54: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

Saturday, March 31, 12

Page 55: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

Saturday, March 31, 12

Page 56: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

I · Ta4 · Tb · F

Saturday, March 31, 12

Page 57: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

I · Ta4 · Tb · F

= I · Ta2 · Tb · F

Saturday, March 31, 12

Page 58: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

I · Ta4 · Tb · F

= I · Ta2 · Tb · F =

�1 0 0 0

�·

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA ·

0

BB@

0010

1

CCA

Saturday, March 31, 12

Page 59: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

I · Ta4 · Tb · F

= I · Ta2 · Tb · F =

�1 0 0 0

�·

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA ·

0

BB@

0010

1

CCA

= 1

Saturday, March 31, 12

Page 60: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCATb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

I =�1 0 0 0

F =

0

BB@

0010

1

CCA

“aaaab”

I · Ta4 · Tb · F

= I · Ta2 · Tb · F =

�1 0 0 0

�·

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA ·

0

BB@

0010

1

CCA

= 1

結果が1→ 受理結果が0→ 非受理

Saturday, March 31, 12

Page 61: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

回帰

Ta4 · Tb = Ta · Ta · Ta · Ta · Tb

先例中の行列積

正方行列同士の積は閉じているかつ結合則が成り立つ

Saturday, March 31, 12

Page 62: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

回帰

Ta4 · Tb = Ta · Ta · Ta · Ta · Tb

先例中の行列積

正方行列同士の積は閉じているかつ結合則が成り立つ

閉じてる? 結合的演算?

Saturday, March 31, 12

Page 63: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

回帰

Ta4 · Tb = Ta · Ta · Ta · Ta · Tb

先例中の行列積

正方行列同士の積は閉じているかつ結合則が成り立つ

閉じてる? 結合的演算?

半群だっ!!

Saturday, March 31, 12

Page 64: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

この2つの行列が生成する全ての行列の集合  を計算(遷移閉包)TD

Saturday, March 31, 12

Page 65: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

この2つの行列が生成する全ての行列の集合  を計算(遷移閉包)TD

→ 読者自身で手を動かせ(圧迫)

Saturday, March 31, 12

Page 66: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Saturday, March 31, 12

Page 67: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta =

0

BB@

1 0 0 00 1 0 00 0 0 10 0 0 1

1

CCA

Saturday, March 31, 12

Page 68: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Saturday, March 31, 12

Page 69: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2 Ta · Tb =

0

BB@

0 0 0 10 0 1 00 0 0 10 0 0 1

1

CCA

Saturday, March 31, 12

Page 70: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2 Ta · Tb = Tab

Saturday, March 31, 12

Page 71: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Ta2 · Ta = Ta · Ta

2 = Ta

Ta · Tb = Tab

Saturday, March 31, 12

Page 72: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Ta2 · Ta = Ta · Ta

2 = Ta

Ta · Tb = Tab

Ta2 · Tb = Tb

Saturday, March 31, 12

Page 73: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Ta2 · Ta = Ta · Ta

2 = Ta

Ta · Tb = Tab

Ta2 · Tb = Tb

8x 2 TD

2

664Tb · x =

0

BB@

0 0 0 10 0 0 10 0 0 10 0 0 1

1

CCA

3

775

Saturday, March 31, 12

Page 74: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Ta2 · Ta = Ta · Ta

2 = Ta

Ta · Tb = Tab

Ta2 · Tb = Tb

8x 2 TD [Tb · x = T;]

Saturday, March 31, 12

Page 75: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

遷移行列が成す半群

Ta =

0

BB@

0 1 0 01 0 0 00 0 0 10 0 0 1

1

CCA Tb =

0

BB@

0 0 1 00 0 0 10 0 0 10 0 0 1

1

CCA

Ta · Ta = Ta2

Ta2 · Ta = Ta · Ta

2 = Ta

Ta · Tb = Tab

Ta2 · Tb = Tb

8x 2 TD [Tb · x = T;]

遷移閉包が求まった!!→5つの行列TD = {Ta, Tb, Taa, Tab, T;}

Saturday, March 31, 12

Page 76: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

半群+単位元=モノイド

I =

0

BB@

1 0 0 00 1 0 00 0 1 00 0 0 1

1

CCA単位行列        を追加(  に)TD

Saturday, March 31, 12

Page 77: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

半群+単位元=モノイド

M 0 = {{I, Ta, Tb, Taa, Tab, T;}, I, ·}

Saturday, March 31, 12

Page 78: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

半群+単位元=モノイド

M 0 = {{I, Ta, Tb, Taa, Tab, T;}, I, ·}

 単位行列を追加 (もちろん単位元) 行列積

Saturday, March 31, 12

Page 79: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

半群+単位元=モノイド

M 0 = {{I, Ta, Tb, Taa, Tab, T;}, I, ·}I Ta Tb Taa Tab T;

I I Ta Tb Taa Tab T;Ta Ta Taa Tab Ta Tb T;Tb Tb T; T; T; T; T;Taa Taa Ta Tb Taa Tab T;Tab Tab T; T; T; T; T;T; T; T; T; T; T; T;

Saturday, March 31, 12

Page 80: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

半群+単位元=モノイド

M 0 = {{I, Ta, Tb, Taa, Tab, T;}, I, ·}I Ta Tb Taa Tab T;

I I Ta Tb Taa Tab T;Ta Ta Taa Tab Ta Tb T;Tb Tb T; T; T; T; T;Taa Taa Ta Tb Taa Tab T;Tab Tab T; T; T; T; T;T; T; T; T; T; T; T;

これを の Transition Monoid と呼び    で表す。

(最初のモノイドの表と比べてみて :-)TM(D)

D

Saturday, March 31, 12

Page 81: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

正規とは!! (4)

L(D) = L(M)

Mと  は同型

となる等価な最小DFA とSyntactic Monoid  について

DM

TM(D)([2] p691)

Saturday, March 31, 12

Page 82: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

SIMD実装

Saturday, March 31, 12

Page 83: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

普通のDFA実装

x86/x64最適化勉強会1 「正規表現とJITとベンチマーク」

Saturday, March 31, 12

Page 84: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

普通のDFA実装

x86/x64最適化勉強会1 「正規表現とJITとベンチマーク」

bool DFA::FullMatch(unsigned char *beg, unsigned char *end){ unsigned int state = 0; // initial state while (beg < end) { // search whole string state = transition_[state][*beg++]; if (state == DFA::REJECT) break; } return IsAccept(state);}

O(n)

Saturday, March 31, 12

Page 85: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

今回提案のSIMD実装

・文字列は結合的二項演算列 (モノイド上の)→ SIMDで並列reductionができれば!→ SIMD実装だと

ぐらい期待できる?(Wはワードサイズ)

O(n logW/W )

Saturday, March 31, 12

Page 86: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

今回提案のSIMD実装

・文字列は結合的二項演算列 (モノイド上の)→ SIMDで並列reductionができれば!→ SIMD実装だと

ぐらい期待できる?(Wはワードサイズ)

O(n logW/W )

*注意 NFAのビットパラレル   実装とはベツモノ

Saturday, March 31, 12

Page 87: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

・加算等基本的な水平方向演算は現AVXにも

SIMD並列reduction

Saturday, March 31, 12

Page 88: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

・加算等基本的な水平方向演算は現AVXにも

SIMD並列reduction

・今回やりたい演算と要素は正規表現に依存

Saturday, March 31, 12

Page 89: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

・加算等基本的な水平方向演算は現AVXにも

SIMD並列reduction

・今回やりたい演算と要素は正規表現に依存

・任意の二項演算なんてできるわけない

Saturday, March 31, 12

Page 90: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

・加算等基本的な水平方向演算は現AVXにも

SIMD並列reduction

・今回やりたい演算と要素は正規表現に依存

・任意の二項演算なんてできるわけない

そう、AVX2が出るまではねっ!!

Saturday, March 31, 12

Page 91: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

AVX2追加命令群 [3][4]

Saturday, March 31, 12

Page 92: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

AVX2追加命令群 [3][4]

・2013年のHaswellから入る(予定)・整数256bit命令群の追加!!・並列表引き命令gatherの追加!!・Any-to-Any置換命令permの追加!!(AVXのshuffleは128bit-laneに閉じてた)

Saturday, March 31, 12

Page 93: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

gather: 並列表引き[4]

・引数3つ → DST,SRC1(index&table),SRC2(condition)

・浮動小数点は vgather, 整数はvpgather

 → インデックス/値はDword, Qwordを指定 → 2つの元をpack(2byte)して表引き → 任意の二項演算が可(表はもちろん作る)

Saturday, March 31, 12

Page 94: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

gather: 並列表引き[4]

・引数3つ → DST,SRC1(index&table),SRC2(condition)

・浮動小数点は vgather, 整数はvpgather

 → インデックス/値はDword, Qwordを指定 → 2つの元をpack(2byte)して表引き → 任意の二項演算が可(表はもちろん作る)

Saturday, March 31, 12

Page 95: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

gather: 並列表引き[4]

・引数3つ → DST,SRC1(index&table),SRC2(condition)

・浮動小数点は vgather, 整数はvpgather

 → インデックス/値はDword, Qwordを指定 → 2つの元をpack(2byte)して表引き → 任意の二項演算が可(表はもちろん作る)

VPGATHERDD (VEX.256 version)FOR j ← 0 to7 i ← j * 32; IF MASK[31+i] THEN MASK[i+31:i] ← 0xFFFFFFFF; // extend from most significant bit ELSE MASK[i +31:i] ← 0; FI;ENDFORFOR j ← 0 to 7 i ← j * 32; DATA_ADDR ← BASE_ADDR + (SignExtend(VINDEX1[i+31:i])*SCALE + DISP; IF MASK[31+i] THEN DEST[i +31:i] ← FETCH_32BITS(DATA_ADDR); // a fault exits the loop FI; MASK[i +31:i] ← 0;ENDFOR(non-masked elements of the mask register have the content of respective element cleared)

Saturday, March 31, 12

Page 96: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

perm: Any-to-Any置換 [4]

Saturday, March 31, 12

Page 97: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

perm: Any-to-Any置換 [4]

Saturday, March 31, 12

Page 98: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

perm: Any-to-Any置換 [4]

VPERMQ (VEX.256 encoded version)DEST[63:0] ← (SRC[255:0] >> (IMM8[1:0] * 64))[63:0];DEST[127:64] ← (SRC[255:0] >> (IMM8[3:2] * 64))[63:0];DEST[191:128] ← (SRC[255:0] >> (IMM8[5:4] * 64))[63:0];DEST[255:192] ← (SRC[255:0] >> (IMM8[7:6] * 64))[63:0];

Saturday, March 31, 12

Page 99: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

実装方針

・reductionは並列表引き命令vpgatherdd

 → モノイドの元は256個以下に限定(1byte)

 → 2つの元をpack(2byte)して表引き → 任意の二項演算が可(表はもちろん作る)

・要素を並べ替えて1つになるまで繰り返す → vpshufとvperm

Saturday, March 31, 12

Page 100: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

Saturday, March 31, 12

Page 101: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

*注意 簡略化のため、各要素ci(i = 1, . . . , F )はそれぞれ1byteに収まるとし、演算列は16個に固定

Saturday, March 31, 12

Page 102: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

(256bit)YMMレジスタに2つずつpack (上位2byteは0)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

Saturday, March 31, 12

Page 103: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

(256bit)YMMレジスタに2つずつpack (上位2byteは0)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

並列表引によって二項演算 (結果上位3byteにゴミが)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

???c07 ???c06 ???c05 ???c04 ???c03 ???c02 ???c01 ???c00

Saturday, March 31, 12

Page 104: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

(256bit)YMMレジスタに2つずつpack (上位2byteは0)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

並列表引によって二項演算 (結果上位3byteにゴミが)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

???c07 ???c06 ???c05 ???c04 ???c03 ???c02 ???c01 ???c00

0000 00c07c06 0000 00c05c

04 0000 00c03c

02 0000 00c01c

00

shuffle&permで結果を2つずつpackしなおす(他は0に)

Saturday, March 31, 12

Page 105: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

メモリ上に     それぞれ1byte16個の元c0 ⇠ cFcF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0

(256bit)YMMレジスタに2つずつpack (上位2byteは0)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

並列表引によって二項演算 (結果上位3byteにゴミが)00cF cE 00cDcC 00cBcA 00c9c8 00c7c6 00c5c4 00c3c2 00c1c0

???c07 ???c06 ???c05 ???c04 ???c03 ???c02 ???c01 ???c00

0000 00c07c06 0000 00c05c

04 0000 00c03c

02 0000 00c01c

00

shuffle&permで結果を2つずつpackしなおす(他は0に)結果が1つの元になるまで繰り返す!!

Saturday, March 31, 12

Page 106: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

デモプログラム

・YASMでAVX2プログラミング → YASM 1.2.0 からAVX2対応 → 実は初アセンブラプログラミング(というかSIMDも)

・IntelのEmulatorで動作確認できた! (動いた)

・コードは一式githubに挙げてます → https://github.com/sinya8282/AVX2REGEX

Saturday, March 31, 12

Page 107: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

コード片(YASM) vpmovzxwd ymm0, [rdi] vmovdqa ymm1, [shuffle1] vmovdqa ymm2, [shuffle2] vpcmpeqd ymm3, ymm3, ymm3 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 vpshufb ymm0, ymm0, ymm1 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 vpshufb ymm0, ymm0, ymm1 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 vpermq ymm0, ymm0, 0x08 vpshufb ymm0, ymm0, ymm2 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 movq rax, xmm0

置換条件データ

最後は二つの元を

laneをまたいで置換する必要があるのでperm+shuffle

(32byte aligned)

Saturday, March 31, 12

Page 108: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

速いんでしょうか?・知りません :-p gatherの速度次第!!

 → Emulatorじゃ速度指標が得られなげ? → 16回の表引きが4回のvpgatherddに → 今後もSIMDデータ幅は大きくなるんでしょうか?

・その他の命令(YMM shuffle/perm/mov)は 高速([6])なのであまり問題にならない?・Haswell出るまで待ちましょう

Saturday, March 31, 12

Page 109: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

不満な点

・gatherで条件レジスタが0クリアされる謎・byte単位256bit Any-to-Any置換命令がない → permとshufbを組み合わせ...

・デモプログラムは制約条件有りまくり → 制約無くせる!! もっと最適化もできる → (実機出ないとやる気が...)

Saturday, March 31, 12

Page 110: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

おまけ

Saturday, March 31, 12

Page 111: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

並列表引きのきっかけ

Saturday, March 31, 12

Page 112: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

NEONにも並列表引き

Saturday, March 31, 12

Page 113: AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜

参考文献

Saturday, March 31, 12