SlideShare ist ein Scribd-Unternehmen logo
1 von 115
Downloaden Sie, um offline zu lesen
AVX2時代の
                              正規表現マッチング
                                 ∼ 半群でぐんぐん! ∼

                         Ryom a S in’y a @si ny a8282




Saturday, March 31, 12
はじめに
                  ・発表者
                   新屋 良磨 (しんや りょうま@東工大院生 @sinya8282)
                   正規表現好き。正規表現エンジンとか作ってます(grepも)
                    → https://github.com/sinya8282/regen

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

Saturday, March 31, 12
正規表現


Saturday, March 31, 12
正規とは!! (1)


                           X
                         言語 が正規

                              e
                    ,  は正規表現 で書ける
                      X
                         X = L(e)
Saturday, March 31, 12
正規とは!! (1)


                               X
                             言語 が正規
                         eの受理言語集合
                    ,  は正規表現 で書ける
                         X        e
                             X = L(e)
Saturday, March 31, 12
正規表現で何が書ける?
                  ・.*(hoge|fuga|piyo)
                         → 複数文字列探索 (strstrの上位互換)
                   ・ .*AUTHs[^n]{100}
                         → IMAP認証のオーバーフロー
                         攻撃パケット (Snort)
                   ・^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$




Saturday, March 31, 12
正規表現で何が書ける?
                  ・.*(hoge|fuga|piyo)
                         → 複数文字列探索 (strstrの上位互換)
                   ・ .*AUTHs[^n]{100}
                         → IMAP認証のオーバーフロー
                         攻撃パケット (Snort)
                   ・^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$
                         → “X86”, “X64”以外の文字列


Saturday, March 31, 12
正規表現で何が嬉しい?
                  ・文字列探索において能力が高い
                         → 正規表現 ⊃ 複数文字列 ⊃ 固定文字列
                   ・テキスト長nに対して線形時間で探索可
                         → 後述するDFAを作ればO(n)
                         → NFAだとO(n × NFAの状態数)
                   ・モノイド, DFA, 論理式,,, 性質の良いモデル
                    と対応


Saturday, March 31, 12
正規とは!! (2)

                             X
                           言語 が正規
                         ,X
                           はある有限モノイド
                          M の受理言語
                         X = L(M )
Saturday, March 31, 12
正規とは!! (2)

                             X
                           言語 が正規
                         ,X
                           はある有限モノイド
                          M の受理言語
                         このモノイドは特に
                           X =Monoid )
                         Syntactic L(M
                                     と呼ばれる


Saturday, March 31, 12
モノイド?(復習)

                         モノイド M            = {S, e, ·}
                         S : なんかの集合
                          · : 結合則を満たす二項演算
                         e 2 S : 単位元
                         8x 2 S [e · x = x · e = x]



Saturday, March 31, 12
モノイド?(復習)

                         モノイド M          = {S, e, ·}
                         S : なんかの集合
                          · : 結合則を満たす二項演算
                         e 2 S : 単位元
                         8x 2 S [e · x = x · e = x] {N, 0, +}
                         例えば → 自然数の加算,乗算         {N, 1, ⇥}

Saturday, March 31, 12
モノイド?(復習)

                         モノイド M          = {S, e, ·}
                         S : なんかの集合
                          · 「単位元のある」半群
                             : 結合則を満たす二項演算
                            (単位元なんて飾りです(ぇ)
                         e 2 S : 単位元
                         8x 2 S [e · x = x · e = x] {N, 0, +}
                         例えば → 自然数の加算,乗算         {N, 1, ⇥}

Saturday, March 31, 12
モノイドと言語受理

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

                         s
                 文字列 が受理文字列
                             x
                 , 受理元  が存在して :         ⌧ s 7! x
Saturday, March 31, 12
モノイドと言語受理

                    ⌧:文字列→モノイドへの準同型写像
                      ⌧: “abaab” 7!a · b · a · a · b
                     *注意 文字“a”とモノイド
                        の元 はベツモノ   a
                         s
                 文字列 が受理文字列
                             x
                 , 受理元  が存在して :         ⌧ s 7! x
Saturday, March 31, 12
M = {{✏, a, b, aa, ab, ;}, ✏, ·}




Saturday, March 31, 12
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
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                    ✏    a   b    aa   ab   ;
                               ✏    ✏    a   a · a = aa
                                             b    aa   ab   ;
                              a    a    aa   ab   a    b    ;
                              b    b     ;    ;    ;    ;   ;
                              aa   aa    a   b    aa   ab   ;
                              ab   ab    ;    ;    ;    ;   ;
                               ;    ;    ;    ;    ;    ;   ;




Saturday, March 31, 12
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                    ✏    a   b    aa ab      ;
                               ✏    ✏    a   b    aa · ab
                                                    a b     =;   ab
                              a    a    aa   ab   a    b     ;
                              b    b     ;    ;    ;    ;    ;
                              aa   aa    a   b    aa ab      ;
                              ab   ab    ;    ;    ;    ;    ;
                               ;    ;    ;    ;    ;    ;    ;




Saturday, March 31, 12
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   a · aa = a
                                   ab    ;    ;    ;    ;   ;
                               ;    ;    ;    ;    ;    ;   ;




Saturday, March 31, 12
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
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                    ✏    a   b aa ab   ;
                               ✏    ✏    a   b aa ab   ;
                              a    a    aa ab a   b    ;
                              b
                              aa
                                   b
                                   aa
                                        ✏; との二項演算
                                             ;  ;
                                         a は不変(単位元)
                                                   ;
                                             b aa ab
                                                       ;
                                                       ;
                              ab   ab    ;   ;  ;  ;   ;
                               ;    ;    ;   ;  ;  ;   ;




Saturday, March 31, 12
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
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                    ✏    a   b aa ab    ;
                               ✏    ✏    a   b aa ab    ;
                              a    a    aa ab a    b    ;
                              b    b     ; ; ; ;
                                         ; との二項演算       ;
                              aa   aa        b ;aa ab
                                         a は常に (零元)     ;
                              ab   ab    ;   ;   ;  ;   ;
                               ;    ;    ;   ;   ;  ;   ;




Saturday, March 31, 12
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
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                   ✏  a   b aa ab ;
                         ⌧:     ✏  7! a   b7! b
                              “a” ✏ a , “b” aa ab “”;
                                                ,   7! ✏
                               a   a aa ab a   b ;
                               b
                               b  を受理元とすれば!!;
                                   b  ;   ;  ;  ;
                               aa aa a    b aa ab ;
                               ab ab ;    ;  ;  ; ;
                                ;  ;  ;   ;  ;  ; ;




Saturday, March 31, 12
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                ✏    a   b aa ab ;
                         ⌧:  ✏    7! a   b  7! b
                           “a” ✏ a , “b” aa ab “”;  , 7! ✏
                             a  a aa ab a          b ;
                             bbを受理元とすれば!!;
                                b    ;   ;     ;   ;
                         ⌧:“aaaab” 7! a ·ba · aa · a · b = b
                            aa aa a            a ab ;
                            ab ab ;      ;     ;   ; ;
                         のように受理文字列が定められ
                             ;  ;    ;   ;     ;   ; ;




Saturday, March 31, 12
M = {{✏, a, b, aa, ab, ;}, ✏, ·}
                                ✏    a   b aa ab ;
                         ⌧:  ✏    7! a   b  7! b
                           “a” ✏ a , “b” aa ab “”;  , 7! ✏
                             a  a aa ab a          b ;
                             bbを受理元とすれば!!;
                                b    ;   ;     ;   ;
                         ⌧:“aaaab” 7! a ·ba · aa · a · b = b
                            aa aa a            a ab ;
                            ab ab ;      ;     ;   ; ;
                         のように受理文字列が定められ
                             ;  ;    ;   ;     ;   ; ;

                          L(M ) = L((aa)*b)

Saturday, March 31, 12
モノイドわかった?

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

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




Saturday, March 31, 12
モノイドわかった?

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

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

                          できる!!

Saturday, March 31, 12
モノイドわかった?

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

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

                          できる!!   (´・ω・`)シ
                            ただもうちょっと待って
Saturday, March 31, 12
正規とは!! (3)

                             X
                           言語 が正規
                    ,    ある有限オートマトン
                          A の受理言語
                         X = L(A)
Saturday, March 31, 12
正規とは!! (3)

                             X
                           言語 が正規
                    ,    ある有限オートマトン
                          A の受理言語
                          X = L(A)
                         今回はDFAのみが登場

Saturday, March 31, 12
DFAの5個組表現(基本)

                         DFA D = {Q, ⌃, , q0 , F }
                         Q : 状態集合(有限)
                          ⌃ : 文字集合(有限)
                            : Q ! Q 遷移関数
                         q0 : 初期状態
                          F : 受理状態集合
Saturday, March 31, 12
a, b
                                   a
                                          1      b
                             0     a
                                   b            a, b      3
                         DFA D            2


                           Q = {0, 1, 2, 3} q0 = 0
                           ⌃ = {a, b}        F = {2}
                            : (0, a) 7! 1, (0, b) 7! 2
                               ···

Saturday, March 31, 12
a, b
                                 a
                                     1    b
                            0    a
                                 b       a, b    3
                         DFA D       2




Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b    3
                          DFA D             2

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




Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b    3
                          DFA D             2

                         (0, “aab”) = (1, “ab”) = (0, “b”) = 2
                         (0, “aba”) = (1, “ba”) = (3, “a”) = 3




Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b      3
                          DFA D             2

                         (0, “aab”) =による文字列 “b”) = 2
                           DFA D      (1, “ab”) = (0,   s
                         (0, “aba”) = (1, “ba”) = (3, “a”) = 3
                           の受理判定は
                                    (q0 , s) 2 F ?
                                                   の判定

Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b    3
                          DFA D             2

                         (0, “aab”) = (1, “ab”) = (0, “b”) = 2
                         (0, “aba”) = (1, “ba”) = (3, “a”) = 3




Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b    3
                          DFA D             2

                         (0, “aab”) = (1, “ab”) = (0, “b”) = 2
                         (0, “aba”) = (1, “ba”) = (3, “a”) = 3
                                      受理状態に
                                     り着く→受理!!


Saturday, March 31, 12
a, b
                                      a
                                            1       b
                                0     a
                                      b            a, b    3
                          DFA D             2

                         (0, “aab”) = (1, “ab”) = (0, “b”) = 2
                         (0, “aba”) = (1, “ba”) = (3, “a”) = 3

                         L(D) = L((aa)*b)
Saturday, March 31, 12
DFAの行列表現(応用)

                         DF A D = {I, , F }
                         I : 初期状態ベクトル
                           : 遷移行列
                         F : 受理状態ベクトル
Saturday, March 31, 12
a, b
                                               a
                                                     1          b
                                     0         a
                                             b                 a, b    3

                                                     2
           DF A D = {I, , F }

                 8                         0                          1 0 19
                 >
                 >                            ;    {a}   {b}     ;         0 >
                                                                             >
                 <                          B{a}                      C B0C=
                                                    ;     ;     {b} C B C
          =              1   0   0       0 ,B
                                            @ ;                       A , @1A>
                 >
                 >                                  ;     ;    {a, b}        >
                 :                                                           ;
                                              ;     ;     ;    {a, b}      0



Saturday, March 31, 12
a, b
                                             a
                                                     1          b
                                     0       a
                                             b                 a, b    3

                                                     2
           DF A D = {I, , F }

                 8               初期状態のみ1
                                   0                                  1 0 19
                 >
                 >                            ;    {a}   {b}     ;         0 >
                                                                             >
                 <                          B{a}                      C B0C=
                                                    ;     ;     {b} C B C
          =              1   0   0       0 ,B
                                            @ ;                       A , @1A>
                 >
                 >                                  ;     ;    {a, b}        >
                 :                                                           ;
                                              ;     ;     ;    {a, b}      0



Saturday, March 31, 12
a, b
                                             a
                                                   1       b
                                     0       a
                                             b            a, b    3

                                                   2
           DF A D = {I, , F }

                 8                          0受理状態のみ1 0 19       1
                 >
                 >                            ;  {a} {b}   ;         0 >
                                                                       >
                 <                          B{a}                C B0C=
                                            B     ;   ;   {b} C B C
          =              1   0   0       0 ,@                   A , @1A>
                 >
                 >                            ;   ;   ;  {a, b}        >
                 :                                                     ;
                                              ;   ;   ;  {a, b}      0



Saturday, March 31, 12
a, b
                                               a
                                                     1          b
                                     0         a
                                             b                 a, b    3

           状態0から状態0                                  2
           DF A D = {I, , F }
           に遷移する文字はない

                 8                         0                          1 0 19
                 >
                 >                            ;    {a}   {b}     ;         0 >
                                                                             >
                 <                          B{a}                      C B0C=
                                                    ;     ;     {b} C B C
          =              1   0   0       0 ,B
                                            @ ;                       A , @1A>
                 >
                 >                                  ;     ;    {a, b}        >
                 :                                                           ;
                                              ;     ;     ;    {a, b}      0



Saturday, March 31, 12
a, b
                                               a
                                                     1          b
                                     0         a
                                             b                 a, b    3

           状態0から状態0           状態0から状態1
                              2
           DF A D = {I, , F }
           に遷移する文字はない に遷移する文字はa

                 8                         0                          1 0 19
                 >
                 >                            ;    {a}   {b}     ;         0 >
                                                                             >
                 <                          B{a}                      C B0C=
                                                    ;     ;     {b} C B C
          =              1   0   0       0 ,B
                                            @ ;                       A , @1A>
                 >
                 >                                  ;     ;    {a, b}        >
                 :                                                           ;
                                              ;     ;     ;    {a, b}      0



Saturday, March 31, 12
a, b
                                 a
                                         1        b
                             0   a
                                 b               a, b    3

                                         2

                         0           1       0                 1
                  「文字ごと」に遷移行列を
                     0 1 0 0          0 0 1 0
                   B1 0 0 0C        B0 0 0 1C
               Ta 考えてみる (要素は1,0のみ C
                  =B
                   @0 0 0 1A
                             C Tb = B
                                    @0 0 0 1A
                    0    論理行列) 0 0 1
                       0 0 1          0

Saturday, March 31, 12
a, b
                                         a
                                                  1        b
                             0           a
                                         b                a, b        3

                                                  2

                         0                    1       0                      1
                      0          1   0       0          0        0   1      0
                    B1           0   0       0C       B0         0   0      1C
               Ta = B                          C Tb = B                       C
                    @0           0   0       1A       @0         0   0      1A
                     0           0   0       1          0        0   0      1

Saturday, March 31, 12
a, b
                                         a
                                                  1        b
                             0           a
                                         b                a, b        3

            文字aで状態0は                              2
            状態1に遷移
                         0                    1       0                      1
                      0          1   0       0          0        0   1      0
                    B1           0   0       0C       B0         0   0      1C
               Ta = B                          C Tb = B                       C
                    @0           0   0       1A       @0         0   0      1A
                     0           0   0       1          0        0   0      1

Saturday, March 31, 12
a, b
                                         a
                                                  1        b
                             0           a
                                         b                a, b        3

            文字aで状態0は                              2
            状態1に遷移
                         0                    1       0                      1
                      0          1   0       0          0        0   1      0
                    B1           0   0       0C       B0         0   0      1C
               Ta = B                          C Tb = B                       C
                    @0           0   0       1A       @0         0   0      1A
                     0           0   0       1          0        0   0      1
      文字aで状態1は
      状態0に遷移
Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1




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


Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1




Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1

              “aaaab”




Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1

              “aaaab”

                         4
          I · T a · Tb · F




Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1

              “aaaab”

                         4
   I · T a · Tb · F
          2
 = I · Ta · T b · F



Saturday, March 31, 12
I= 1 0 0 0
               0 1      0            1      0               1
                0         0 1   0   0          0   0   1   0
               B0C      B1 0    0   0C       B0    0   0   1C
           F = B C Ta = B0 0          C Tb = B               C
               @1A      @       0   1A       @0    0   0   1A
                0         0 0   0   1         0    0   0   1

              “aaaab”

                                            0               1 0 1
                         4              0          0   1   0   0
   I · T a · Tb · F                   B0
          2                                        0   0   1C B0C
 = I · Ta · T b · F =        1 0 0 0 ·B
                                      @0
                                                            C·B C
                                                   0   0   1A @1A
                                        0          0   0   1   0



Saturday, March 31, 12
I= 1 0 0 0
               0 1      0                1      0               1
                0         0 1       0   0          0   0   1   0
               B0C      B1 0        0   0C       B0    0   0   1C
           F = B C Ta = B0 0              C Tb = B               C
               @1A      @           0   1A       @0    0   0   1A
                0         0 0       0   1         0    0   0   1

              “aaaab”

                                                0               1 0 1
                         4                   0         0   1   0   0
   I · T a · Tb · F                        B0
          2                                            0   0   1C B0C
 = I · Ta · T b · F =             1 0 0 0 ·B
                                           @0
                                                                C·B C
                                                       0   0   1A @1A
                                             0         0   0   1   0
                             =1
Saturday, March 31, 12
I= 1 0 0 0
               0 1      0                1      0               1
                0         0 1       0   0          0   0   1   0
               B0C      B1 0        0   0C       B0    0   0   1C
           F = B C Ta = B0 0              C Tb = B               C
               @1A      @           0   1A       @0    0   0   1A
                0         0 0       0   1         0    0   0   1

              “aaaab”         結果が1→ 受理
                              結果が0→ 非受理
                                                0               1 0 1
                         4                   0         0   1   0   0
   I · T a · Tb · F                        B0
          2                                            0   0   1C B0C
 = I · Ta · T b · F =             1 0 0 0 ·B
                                           @0
                                                                C·B C
                                                       0   0   1A @1A
                                             0         0   0   1   0
                             =1
Saturday, March 31, 12
回帰

                先例中の行列積

                         4
                  Ta · Tb = Ta · Ta · Ta · Ta · Tb

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


Saturday, March 31, 12
回帰

                先例中の行列積         閉じてる? 結合的演算?

                         4
                  Ta · Tb = Ta · Ta · Ta · Ta · Tb

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


Saturday, March 31, 12
回帰

                先例中の行列積          閉じてる? 結合的演算?

                         4
                  Ta · Tb = Ta
                                   半群·だっ!!T
                                 ·T ·T T ·
                                  a   a   a   b


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


Saturday, March 31, 12
遷移行列が成す半群
                              0              1         0              1
                                0   1   0   0            0   0   1   0
                              B1    0   0   0C         B0    0   0   1C
                         Ta = B               C   Tb = B
                                                       @0
                                                                      C
                              @0    0   0   1A               0   0   1A
                                0   0   0   1            0   0   0   1



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



Saturday, March 31, 12
遷移行列が成す半群
                              0              1         0              1
                                0   1   0   0            0   0   1   0
                              B1    0   0   0C         B0    0   0   1C
                         Ta = B               C   Tb = B
                                                       @0
                                                                      C
                              @0    0   0   1A               0   0   1A
                                0   0   0   1            0   0   0   1



                           この2つの行列が生成する全ての
                                 TD
                           行列の集合  を計算(遷移閉包)
                           → 読者自身で手を動かせ(圧迫)


Saturday, March 31, 12
遷移行列が成す半群
                              0              1         0              1
                                0   1   0   0            0   0   1   0
                              B1    0   0   0C         B0    0   0   1C
                         Ta = B               C   Tb = B
                                                       @0
                                                                      C
                              @0    0   0   1A               0   0   1A
                                0   0   0   1            0   0   0   1




Saturday, March 31, 12
遷移行列が成す半群
                         0           1          0              1
                        0    1   0   0            0   0   1   0
                      B1     0   0   0C         B0    0   0   1C
                 Ta = B                C   Tb = B
                                                @0
                                                               C
                      @0     0   0   1A               0   0   1A
                        0    0   0   1            0   0   0   1
                      0                1
                        1    0   0   0
                      B0     1   0   0C
            Ta · Ta = B
                      @0
                                       C
                             0   0   1A
                        0    0   0   1




Saturday, March 31, 12
遷移行列が成す半群
                              0              1         0              1
                                0   1   0   0            0   0   1   0
                              B1    0   0   0C         B0    0   0   1C
                         Ta = B               C   Tb = B
                                                       @0
                                                                      C
                              @0    0   0   1A               0   0   1A
                                0   0   0   1            0   0   0   1


            Ta · Ta = Ta 2




Saturday, March 31, 12
遷移行列が成す半群
                              0              1             0               1
                                0   1   0   0                 0   0   1   0
                              B1    0   0   0C              B0    0   0   1C
                         Ta = B               C        Tb = B
                                                            @0
                                                                           C
                              @0    0   0   1A                    0   0   1A
                                0   0   0   1                 0   0   0   1
                                                            0               1
                                                              0   0   0   1
                                                            B0    0   1   0C
            Ta · Ta = Ta 2                        Ta · Tb = B
                                                            @0
                                                                            C
                                                                  0   0   1A
                                                              0   0   0   1




Saturday, March 31, 12
遷移行列が成す半群
                              0              1             0               1
                                0   1   0   0                0    0   1   0
                              B1    0   0   0C             B0     0   0   1C
                         Ta = B               C       Tb = B
                                                           @0
                                                                           C
                              @0    0   0   1A                    0   0   1A
                                0   0   0   1                0    0   0   1


            Ta · Ta = Ta 2                        Ta · Tb = Tab




Saturday, March 31, 12
遷移行列が成す半群
                              0                  1             0               1
                                0   1       0   0                0    0   1   0
                              B1    0       0   0C             B0     0   0   1C
                         Ta = B                   C       Tb = B
                                                               @0
                                                                               C
                              @0    0       0   1A                    0   0   1A
                                0   0       0   1                0    0   0   1


            Ta · Ta = Ta 2                            Ta · Tb = Tab
                  2                     2
           Ta · Ta = Ta · Ta = Ta




Saturday, March 31, 12
遷移行列が成す半群
                              0                  1               0              1
                                0   1       0   0                  0   0   1   0
                              B1    0       0   0C               B0    0   0   1C
                         Ta = B                   C         Tb = B
                                                                 @0
                                                                                C
                              @0    0       0   1A                     0   0   1A
                                0   0       0   1                  0   0   0   1


            Ta · Ta = Ta 2                            Ta · Tb = Tab
                  2                     2               2
           Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb




Saturday, March 31, 12
遷移行列が成す半群
                              0                  1               0                 1
                                0   1       0   0                  0    0     1   0
                              B1    0       0   0C               B0     0     0   1C
                         Ta = B                   C         Tb = B
                                                                 @0
                                                                                   C
                              @0    0       0   1A                      0     0   1A
                                0   0       0   1                  0    0     0   1


            Ta · Ta = Ta 2                            Ta · Tb = Tab
                  2                     2               2
           Ta · Ta = Ta · Ta2 = Ta T0 · Tb = Tb
                                     a                                 13
                                       0 0 0                           1
                            6        B0 0 0                            1C7
                   8x 2 TD 6Tb · x = B
                            4        @0 0 0
                                                                         C7
                                                                       1A5
                                       0 0 0                           1
Saturday, March 31, 12
遷移行列が成す半群
                              0                  1               0              1
                                0   1       0   0                  0   0   1   0
                              B1    0       0   0C               B0    0   0   1C
                         Ta = B                   C         Tb = B
                                                                 @0
                                                                                C
                              @0    0       0   1A                     0   0   1A
                                0   0       0   1                  0   0   0   1


            Ta · Ta = Ta 2                            Ta · Tb = Tab
                  2                     2               2
           Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb

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

Saturday, March 31, 12
遷移行列が成す半群
                            0             1            01
                                0 1 0 0          0 0 1 0
                              B1 0 0 0C        B0 0 0 1C
                         Ta = B         C Tb = B        C
                            遷移閉包が求まった!!→5つの行列 A
                              @0 0 0 1A        @0 0 0 1
                                0 0 0 1          0 0 0 1
                           TD = {Ta , Tb , Taa , Tab , T; }
            Ta · Ta = Ta 2                    Ta · Tb = Tab
                  2                 2           2
           Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb

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

Saturday, March 31, 12
半群+単位元=モノイド


                                0      1
                                   1 0 0 0
                                 B0 1 0 0C
                               I=B
                         単位行列        を追加
                                 @0 0 1 0A
                                           C
                         (  に)
                          TD       0 0 0 1




Saturday, March 31, 12
半群+単位元=モノイド
                         0
                  M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·}




Saturday, March 31, 12
半群+単位元=モノイド
                         0
                  M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·}

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




Saturday, March 31, 12
半群+単位元=モノイド
                         0
                  M = {{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
半群+単位元=モノイド
                          0
                  M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·}
                                I  Ta Tb Taa Tab T;
                            I D
                         これを のTTransition TMonoid
                                I   a Tb Taa  ab T;
                           Ta  Ta Taa Tab Ta Tb T;
                           Tb  Tb
                                  T M (D)
                           と呼び    で表す。;
                                   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
正規とは!! (4)

                            L(D) = L(M)
                          となる等価な最小DFA と     D
                         Syntactic Monoid M
                                           について

                          T M (D) Mは同型
                                と 
                                       ([2] p691)



Saturday, March 31, 12
SIMD実装


Saturday, March 31, 12
普通のDFA実装




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


Saturday, March 31, 12
普通のDFA実装

       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)
       }

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


Saturday, March 31, 12
今回提案のSIMD実装
                  ・文字列は結合的二項演算列 (モノイド上の)
                         → SIMDで並列reductionができれば!
                         → SIMD実装だと
                           O(n log W/W )
                         ぐらい期待できる?
                         (Wはワードサイズ)




Saturday, March 31, 12
今回提案のSIMD実装
                  ・文字列は結合的二項演算列 (モノイド上の)
                         → SIMDで並列reductionができれば!
                         → SIMD実装だと
                           O(n log W/W )
                         ぐらい期待できる?
                         (Wはワードサイズ)
                           *注意 NFAのビットパラレル
                              実装とはベツモノ


Saturday, March 31, 12
SIMD並列reduction
                  ・加算等基本的な水平方向演算は現AVXにも




Saturday, March 31, 12
SIMD並列reduction
                  ・加算等基本的な水平方向演算は現AVXにも

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




Saturday, March 31, 12
SIMD並列reduction
                  ・加算等基本的な水平方向演算は現AVXにも

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

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




Saturday, March 31, 12
SIMD並列reduction
                  ・加算等基本的な水平方向演算は現AVXにも

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

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


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



Saturday, March 31, 12
AVX2追加命令群 [3][4]




Saturday, March 31, 12
AVX2追加命令群 [3][4]

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



Saturday, March 31, 12
gather: 並列表引き[4]

                 ・引数3つ
                  → DST,SRC1(index&table),SRC2(condition)
                 ・浮動小数点は vgather, 整数はvpgather
                  → インデックス/値はDword, Qwordを指定
                  → 2つの元をpack(2byte)して表引き
                  → 任意の二項演算が可(表はもちろん作る)


Saturday, March 31, 12
gather: 並列表引き[4]

                 ・引数3つ
                  → DST,SRC1(index&table),SRC2(condition)
                 ・浮動小数点は vgather, 整数はvpgather
                  → インデックス/値はDword, Qwordを指定
                  → 2つの元をpack(2byte)して表引き
                  → 任意の二項演算が可(表はもちろん作る)


Saturday, March 31, 12
gather: 並列表引き[4]
      VPGATHERDD (VEX.256 version)
      FOR j ← 0 to7
           i ・引数3つ
             ← j * 32;
           IF MASK[31+i] THEN
              → DST,SRC1(index&table),SRC2(condition)
                MASK[i+31:i] ← 0xFFFFFFFF; // extend from most significant bit
           ELSE
                MASK[i +31:i] ← 0;
             ・浮動小数点は vgather, 整数はvpgather
           FI;
      ENDFOR
      FOR j → 7
             ← 0 to インデックス/値はDword, Qwordを指定
           i ← j * 32;
           DATA_ADDR ← BASE_ADDR + (SignExtend(VINDEX1[i+31:i])*SCALE + DISP;
              → 2つの元をpack(2byte)して表引き
           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
perm: Any-to-Any置換 [4]




Saturday, March 31, 12
perm: Any-to-Any置換 [4]




Saturday, March 31, 12
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
実装方針

                 ・reductionは並列表引き命令vpgatherdd
                  → モノイドの元は256個以下に限定(1byte)
                  → 2つの元をpack(2byte)して表引き
                  → 任意の二項演算が可(表はもちろん作る)
                 ・要素を並べ替えて1つになるまで繰り返す
                  → vpshufとvperm


Saturday, March 31, 12
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           cE   cD   cC   cB   cA   c9   c8   c7   c6   c5   c4   c3   c2   c1   c0




Saturday, March 31, 12
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           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
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           cE   cD   cC   cB   cA   c9   c8   c7   c6   c5   c4   c3   c2   c1   c0


         (256bit)YMMレジスタに2つずつpack (上位2byteは0)
             00cF cE          00cD cC   00cB cA   00c9 c8   00c7 c6   00c5 c4   00c3 c2   00c1 c0




Saturday, March 31, 12
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           cE   cD   cC   cB   cA   c9   c8    c7   c6    c5   c4   c3   c2   c1   c0


         (256bit)YMMレジスタに2つずつpack (上位2byteは0)
             00cF cE          00cD cC   00cB cA    00c9 c8   00c7 c6    00c5 c4   00c3 c2   00c1 c0


          並列表引によって二項演算 (結果上位3byteにゴミが)
             00cF cE          00cD cC   00cB cA    00c9 c8    00c7 c6   00c5 c4   00c3 c2   00c1 c0


              ???c0
                  7           ???c0
                                  6     ???c0
                                            5     ???c0
                                                      4      ???c0
                                                                 3      ???c0
                                                                            2     ???c0
                                                                                      1     ???c0
                                                                                                0




Saturday, March 31, 12
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           cE   cD   cC    cB     cA     c9   c8   c7     c6    c5   c4   c3   c2   c1   c0


         (256bit)YMMレジスタに2つずつpack (上位2byteは0)
             00cF cE           00cD cC   00cB cA       00c9 c8   00c7 c6      00c5 c4   00c3 c2   00c1 c0


          並列表引によって二項演算 (結果上位3byteにゴミが)
             00cF cE           00cD cC   00cB cA       00c9 c8    00c7 c6     00c5 c4   00c3 c2    00c1 c0


              ???c0
                  7           ???c0
                                  6      ???c0
                                             5       ???c0
                                                         4       ???c0
                                                                     3       ???c0
                                                                                 2      ???c0
                                                                                            1     ???c0
                                                                                                      0


              0000            00c0 c0
                                 7 6     0000        00c0 c0
                                                        5 4      0000        00c0 c0
                                                                                3 2     0000      00c0 c0
                                                                                                     1 0

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


Saturday, March 31, 12
c0 ⇠ c
               メモリ上に    F それぞれ1byte16個の元
            cF           cE   cD   cC    cB     cA     c9   c8   c7     c6    c5   c4   c3   c2   c1   c0


         (256bit)YMMレジスタに2つずつpack (上位2byteは0)
             00cF cE           00cD cC   00cB cA       00c9 c8   00c7 c6      00c5 c4   00c3 c2   00c1 c0


          並列表引によって二項演算 (結果上位3byteにゴミが)
             00cF cE           00cD cC   00cB cA       00c9 c8    00c7 c6     00c5 c4   00c3 c2    00c1 c0


              ???c0
                  7           ???c0
                                  6      ???c0
                                             5       ???c0
                                                         4       ???c0
                                                                     3       ???c0
                                                                                 2      ???c0
                                                                                            1     ???c0
                                                                                                      0


              0000            00c0 c0
                                 7 6     0000        00c0 c0
                                                        5 4      0000        00c0 c0
                                                                                3 2     0000      00c0 c0
                                                                                                     1 0

          shuffle&permで結果を2つずつpackしなおす(他は0に)
                         結果が1つの元になるまで繰り返す!!
Saturday, March 31, 12
デモプログラム

                 ・YASMでAVX2プログラミング
                  → YASM 1.2.0 からAVX2対応
                  → 実は初アセンブラプログラミング(というかSIMDも)
                 ・IntelのEmulatorで動作確認できた! (動いた)
                 ・コードは一式githubに挙げてます
                  → https://github.com/sinya8282/AVX2REGEX


Saturday, March 31, 12
コード片(YASM)
                  	 	 vpmovzxwd	 	 ymm0,	 [rdi]
                  	 	 vmovdqa	 	 	 	 ymm1,	 [shuffle1]        置換条件データ
                  	 	 vmovdqa	 	 	 	 ymm2,	 [shuffle2]
                  	 	 vpcmpeqd	 	 	 ymm3,	 ymm3,	 ymm3
                                                              (32byte aligned)
                  	 	 vmovapd	 ymm4,	 ymm3
                  	 	 vpgatherdd	 ymm0,	 [rdx+ymm0],	 ymm4
                  	 	 vpshufb	 	 	 	 ymm0,	 ymm0,	 ymm1
                  	 	 vmovapd	 ymm4,	 ymm3                   最後は二つの元を
                  	 	 vpgatherdd	 ymm0,	 [rdx+ymm0],	 ymm4
                  	 	 vpshufb	 	 	 	 ymm0,	 ymm0,	 ymm1      laneをまたいで置
                  	 	 vmovapd	 ymm4,	 ymm3
                  	 	 vpgatherdd	 ymm0,	 [rdx+ymm0],	 ymm4
                  	 	 vpermq	 	 	 	 	 ymm0,	 ymm0,	 0x08     換する必要がある
                  	 	 vpshufb	 	 	 	 ymm0,	 ymm0,	 ymm2
                  	 	 vmovapd	 ymm4,	 ymm3
                  	 	 vpgatherdd	 ymm0,	 [rdx+ymm0],	 ymm4   のでperm+shuffle
                  	 	 movq	 rax,	 xmm0



Saturday, March 31, 12
速いんでしょうか?
                 ・知りません :-p gatherの速度次第!!
                  → Emulatorじゃ速度指標が得られなげ?
                  → 16回の表引きが4回のvpgatherddに
                  → 今後もSIMDデータ幅は大きくなるんでしょうか?
                 ・その他の命令(YMM shuffle/perm/mov)は
                  高速([6])なのであまり問題にならない?
                 ・Haswell出るまで待ちましょう

Saturday, March 31, 12
不満な点

                 ・gatherで条件レジスタが0クリアされる
                 ・byte単位256bit Any-to-Any置換命令がない
                  → permとshufbを組み合わせ...
                 ・デモプログラムは制約条件有りまくり
                  → 制約無くせる!! もっと最適化もできる
                  → (実機出ないとやる気が...)


Saturday, March 31, 12
おまけ


Saturday, March 31, 12
並列表引きのきっかけ




Saturday, March 31, 12
NEONにも並列表引き




Saturday, March 31, 12
参考文献


Saturday, March 31, 12
正規全般

                  [1]Elements of
                     AutomataTheory

                           神本。
                         (正規な理論はこの本読めばok)

                  [2]Syntactic Semigroups
                  (in Handbook of Formal
                  Languages volume 1)


Saturday, March 31, 12
SIMD周り

                    Haswell New Instruction Descriptions
                   [3]
                    Now Available! - Intel Software Blogs
                   [4] Intel® Advanced  Vector Extensions
                      Programming Reference - PDF
                   [5] Intel® 64 and IA-32 Architectures
                      Optimization Reference Manual - PDF
                               Tables (Lists of Instruction
                   [6] Instruction
                    latencies, throughputs) - PDF


Saturday, March 31, 12

Weitere ähnliche Inhalte

Was ist angesagt?

ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介Masahiro Sakai
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたMITSUNARI Shigeo
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化 sakura-mike
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方Tsuneo Yoshioka
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装MITSUNARI Shigeo
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介MITSUNARI Shigeo
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズムmfumi
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 

Was ist angesagt? (20)

ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム木を綺麗に描画するアルゴリズム
木を綺麗に描画するアルゴリズム
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 

Andere mochten auch

正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety TheoremRyoma Sin'ya
 
正規表現++
正規表現++正規表現++
正規表現++Ryoma Sin'ya
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
A new technique for proving non regularity based on the measure of a language
A new technique for proving non regularity based on the measure of a languageA new technique for proving non regularity based on the measure of a language
A new technique for proving non regularity based on the measure of a languageRyoma Sin'ya
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜Ryoma Sin'ya
 
正規言語でプログラミング
正規言語でプログラミング正規言語でプログラミング
正規言語でプログラミングRyoma Sin'ya
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesTakeshi Yamamuro
 
GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたRyo Sakamoto
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介Ryoma Sin'ya
 
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)Masahiro Sakai
 
Polymerやってみた
PolymerやってみたPolymerやってみた
PolymerやってみたYosuke Onoue
 
AngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいAngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいYosuke Onoue
 
Angular 2のRenderer
Angular 2のRendererAngular 2のRenderer
Angular 2のRendererYosuke Onoue
 
GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会Yosuke Onoue
 
アニメーション(のためのパフォーマンス)の基礎知識
アニメーション(のためのパフォーマンス)の基礎知識アニメーション(のためのパフォーマンス)の基礎知識
アニメーション(のためのパフォーマンス)の基礎知識Yosuke Onoue
 
GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)智啓 出川
 

Andere mochten auch (20)

正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
 
正規表現++
正規表現++正規表現++
正規表現++
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
A new technique for proving non regularity based on the measure of a language
A new technique for proving non regularity based on the measure of a languageA new technique for proving non regularity based on the measure of a language
A new technique for proving non regularity based on the measure of a language
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜
 
正規言語でプログラミング
正規言語でプログラミング正規言語でプログラミング
正規言語でプログラミング
 
HPCフォーラム2015 B-2 LS-DYNAパフォーマンス研究 Yih-Yih Lin Ph.D
HPCフォーラム2015  B-2  LS-DYNAパフォーマンス研究 Yih-Yih Lin Ph.DHPCフォーラム2015  B-2  LS-DYNAパフォーマンス研究 Yih-Yih Lin Ph.D
HPCフォーラム2015 B-2 LS-DYNAパフォーマンス研究 Yih-Yih Lin Ph.D
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequences
 
GPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみたGPGPU deいろんな問題解いてみた
GPGPU deいろんな問題解いてみた
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介
 
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
萩野服部研究室 スキー合宿 2012 自己紹介(酒井)
 
Polymerやってみた
PolymerやってみたPolymerやってみた
Polymerやってみた
 
AngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいAngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたい
 
Angular 2のRenderer
Angular 2のRendererAngular 2のRenderer
Angular 2のRenderer
 
GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会GDG DevFest Kobe Firebaseハンズオン勉強会
GDG DevFest Kobe Firebaseハンズオン勉強会
 
ゼロピッチ: MOOC
ゼロピッチ: MOOCゼロピッチ: MOOC
ゼロピッチ: MOOC
 
アニメーション(のためのパフォーマンス)の基礎知識
アニメーション(のためのパフォーマンス)の基礎知識アニメーション(のためのパフォーマンス)の基礎知識
アニメーション(のためのパフォーマンス)の基礎知識
 
GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)GPGPU Seminar (PyCUDA)
GPGPU Seminar (PyCUDA)
 

Mehr von Ryoma Sin'ya

形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチRyoma Sin'ya
 
有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトンRyoma Sin'ya
 
統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性Ryoma Sin'ya
 
正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めて正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めてRyoma Sin'ya
 
並列化と実行時コード生成を用いた正規表現マッチングの高速化
並列化と実行時コード生成を用いた正規表現マッチングの高速化並列化と実行時コード生成を用いた正規表現マッチングの高速化
並列化と実行時コード生成を用いた正規表現マッチングの高速化Ryoma Sin'ya
 
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装Ryoma Sin'ya
 

Mehr von Ryoma Sin'ya (6)

形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ
 
有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン
 
統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性
 
正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めて正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めて
 
並列化と実行時コード生成を用いた正規表現マッチングの高速化
並列化と実行時コード生成を用いた正規表現マッチングの高速化並列化と実行時コード生成を用いた正規表現マッチングの高速化
並列化と実行時コード生成を用いた正規表現マッチングの高速化
 
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装
 

Kürzlich hochgeladen

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)keikoitakurag
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑Akihiro Kadohata
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayersToru Tamaki
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計atsushi061452
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員Sadaomi Nishi
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一瑛一 西口
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )iwashiira2ctf
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521Satoshi Makita
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose EstimationToru Tamaki
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイントonozaty
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperleger Tokyo Meetup
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdfAyachika Kitazaki
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdkokinagano2
 

Kürzlich hochgeladen (14)

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 

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

  • 1. AVX2時代の 正規表現マッチング ∼ 半群でぐんぐん! ∼ Ryom a S in’y a @si ny a8282 Saturday, March 31, 12
  • 2. はじめに ・発表者  新屋 良磨 (しんや りょうま@東工大院生 @sinya8282)  正規表現好き。正規表現エンジンとか作ってます(grepも)   → https://github.com/sinya8282/regen ・内容  AVX2で夢が広がる命令が色々入る!!  正規表現マッチングのSIMD実装を先日  思いついたのでソレを (正規表現パート長めです) ・Keywords:正規表現, 半群, AVX2 Saturday, March 31, 12
  • 4. 正規とは!! (1) X 言語 が正規 e ,  は正規表現 で書ける X X = L(e) Saturday, March 31, 12
  • 5. 正規とは!! (1) X 言語 が正規 eの受理言語集合 ,  は正規表現 で書ける X e X = L(e) Saturday, March 31, 12
  • 6. 正規表現で何が書ける? ・.*(hoge|fuga|piyo) → 複数文字列探索 (strstrの上位互換) ・ .*AUTHs[^n]{100} → IMAP認証のオーバーフロー 攻撃パケット (Snort) ・^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$ Saturday, March 31, 12
  • 7. 正規表現で何が書ける? ・.*(hoge|fuga|piyo) → 複数文字列探索 (strstrの上位互換) ・ .*AUTHs[^n]{100} → IMAP認証のオーバーフロー 攻撃パケット (Snort) ・^(((X?|X6)|X8)|(((([^X]|X[^68])|X6[^4])|X8[^6])|(X64|X86).).*)$ → “X86”, “X64”以外の文字列 Saturday, March 31, 12
  • 8. 正規表現で何が嬉しい? ・文字列探索において能力が高い → 正規表現 ⊃ 複数文字列 ⊃ 固定文字列 ・テキスト長nに対して線形時間で探索可 → 後述するDFAを作ればO(n) → NFAだとO(n × NFAの状態数) ・モノイド, DFA, 論理式,,, 性質の良いモデル  と対応 Saturday, March 31, 12
  • 9. 正規とは!! (2) X 言語 が正規 ,X   はある有限モノイド M の受理言語 X = L(M ) Saturday, March 31, 12
  • 10. 正規とは!! (2) X 言語 が正規 ,X   はある有限モノイド M の受理言語 このモノイドは特に X =Monoid ) Syntactic L(M と呼ばれる Saturday, March 31, 12
  • 11. モノイド?(復習) モノイド M = {S, e, ·} S : なんかの集合 · : 結合則を満たす二項演算 e 2 S : 単位元 8x 2 S [e · x = x · e = x] Saturday, March 31, 12
  • 12. モノイド?(復習) モノイド M = {S, e, ·} S : なんかの集合 · : 結合則を満たす二項演算 e 2 S : 単位元 8x 2 S [e · x = x · e = x] {N, 0, +} 例えば → 自然数の加算,乗算 {N, 1, ⇥} Saturday, March 31, 12
  • 13. モノイド?(復習) モノイド M = {S, e, ·} S : なんかの集合 · 「単位元のある」半群 : 結合則を満たす二項演算 (単位元なんて飾りです(ぇ) e 2 S : 単位元 8x 2 S [e · x = x · e = x] {N, 0, +} 例えば → 自然数の加算,乗算 {N, 1, ⇥} Saturday, March 31, 12
  • 14. モノイドと言語受理 ⌧:文字列→モノイドへの準同型写像 ⌧: “abaab” 7!a · b · a · a · b s 文字列 が受理文字列 x , 受理元  が存在して : ⌧ s 7! x Saturday, March 31, 12
  • 15. モノイドと言語受理 ⌧:文字列→モノイドへの準同型写像 ⌧: “abaab” 7!a · b · a · a · b *注意 文字“a”とモノイド    の元 はベツモノ a s 文字列 が受理文字列 x , 受理元  が存在して : ⌧ s 7! x Saturday, March 31, 12
  • 16. M = {{✏, a, b, aa, ab, ;}, ✏, ·} Saturday, March 31, 12
  • 17. 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
  • 18. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ✏ ✏ a a · a = aa b aa ab ; a a aa ab a b ; b b ; ; ; ; ; aa aa a b aa ab ; ab ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 19. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ✏ ✏ a b aa · ab a b =; ab a a aa ab a b ; b b ; ; ; ; ; aa aa a b aa ab ; ab ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 20. 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 a · aa = a ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 21. 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
  • 22. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ✏ ✏ a b aa ab ; a a aa ab a b ; b aa b aa ✏; との二項演算 ; ; a は不変(単位元) ; b aa ab ; ; ab ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 23. 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
  • 24. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ✏ ✏ a b aa ab ; a a aa ab a b ; b b ; ; ; ; ; との二項演算 ; aa aa b ;aa ab a は常に (零元) ; ab ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 25. 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
  • 26. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ⌧: ✏ 7! a b7! b “a” ✏ a , “b” aa ab “”; , 7! ✏ a a aa ab a b ; b b を受理元とすれば!!; b ; ; ; ; aa aa a b aa ab ; ab ab ; ; ; ; ; ; ; ; ; ; ; ; Saturday, March 31, 12
  • 27. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ⌧: ✏ 7! a b 7! b “a” ✏ a , “b” aa ab “”; , 7! ✏ a a aa ab a b ; bbを受理元とすれば!!; b ; ; ; ; ⌧:“aaaab” 7! a ·ba · aa · a · b = b aa aa a a ab ; ab ab ; ; ; ; ; のように受理文字列が定められ ; ; ; ; ; ; ; Saturday, March 31, 12
  • 28. M = {{✏, a, b, aa, ab, ;}, ✏, ·} ✏ a b aa ab ; ⌧: ✏ 7! a b 7! b “a” ✏ a , “b” aa ab “”; , 7! ✏ a a aa ab a b ; bbを受理元とすれば!!; b ; ; ; ; ⌧:“aaaab” 7! a ·ba · aa · a · b = b aa aa a a ab ; ab ab ; ; ; ; ; のように受理文字列が定められ ; ; ; ; ; ; ; L(M ) = L((aa)*b) Saturday, March 31, 12
  • 29. モノイドわかった? ・この説明では正規表現とモノイドの  具体的関係が良く掴めないと思います ・正規表現から対応するモノイドを  「作る」ことはできる? Saturday, March 31, 12
  • 30. モノイドわかった? ・この説明では正規表現とモノイドの  具体的関係が良く掴めないと思います ・正規表現から対応するモノイドを  「作る」ことはできる? できる!! Saturday, March 31, 12
  • 31. モノイドわかった? ・この説明では正規表現とモノイドの  具体的関係が良く掴めないと思います ・正規表現から対応するモノイドを  「作る」ことはできる? できる!! (´・ω・`)シ ただもうちょっと待って Saturday, March 31, 12
  • 32. 正規とは!! (3) X 言語 が正規 , ある有限オートマトン A の受理言語 X = L(A) Saturday, March 31, 12
  • 33. 正規とは!! (3) X 言語 が正規 , ある有限オートマトン A の受理言語 X = L(A) 今回はDFAのみが登場 Saturday, March 31, 12
  • 34. DFAの5個組表現(基本) DFA D = {Q, ⌃, , q0 , F } Q : 状態集合(有限) ⌃ : 文字集合(有限) : Q ! Q 遷移関数 q0 : 初期状態 F : 受理状態集合 Saturday, March 31, 12
  • 35. a, b a 1 b 0 a b a, b 3 DFA D 2 Q = {0, 1, 2, 3} q0 = 0 ⌃ = {a, b} F = {2} : (0, a) 7! 1, (0, b) 7! 2 ··· Saturday, March 31, 12
  • 36. a, b a 1 b 0 a b a, b 3 DFA D 2 Saturday, March 31, 12
  • 37. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) = (1, “ab”) = (0, “b”) = 2 Saturday, March 31, 12
  • 38. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) = (1, “ab”) = (0, “b”) = 2 (0, “aba”) = (1, “ba”) = (3, “a”) = 3 Saturday, March 31, 12
  • 39. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) =による文字列 “b”) = 2 DFA D (1, “ab”) = (0, s (0, “aba”) = (1, “ba”) = (3, “a”) = 3 の受理判定は (q0 , s) 2 F ? の判定 Saturday, March 31, 12
  • 40. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) = (1, “ab”) = (0, “b”) = 2 (0, “aba”) = (1, “ba”) = (3, “a”) = 3 Saturday, March 31, 12
  • 41. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) = (1, “ab”) = (0, “b”) = 2 (0, “aba”) = (1, “ba”) = (3, “a”) = 3   受理状態に り着く→受理!! Saturday, March 31, 12
  • 42. a, b a 1 b 0 a b a, b 3 DFA D 2 (0, “aab”) = (1, “ab”) = (0, “b”) = 2 (0, “aba”) = (1, “ba”) = (3, “a”) = 3 L(D) = L((aa)*b) Saturday, March 31, 12
  • 43. DFAの行列表現(応用) DF A D = {I, , F } I : 初期状態ベクトル : 遷移行列 F : 受理状態ベクトル Saturday, March 31, 12
  • 44. a, b a 1 b 0 a b a, b 3 2 DF A D = {I, , F } 8 0 1 0 19 > > ; {a} {b} ; 0 > > < B{a} C B0C= ; ; {b} C B C = 1 0 0 0 ,B @ ; A , @1A> > > ; ; {a, b} > : ; ; ; ; {a, b} 0 Saturday, March 31, 12
  • 45. a, b a 1 b 0 a b a, b 3 2 DF A D = {I, , F } 8 初期状態のみ1 0 1 0 19 > > ; {a} {b} ; 0 > > < B{a} C B0C= ; ; {b} C B C = 1 0 0 0 ,B @ ; A , @1A> > > ; ; {a, b} > : ; ; ; ; {a, b} 0 Saturday, March 31, 12
  • 46. a, b a 1 b 0 a b a, b 3 2 DF A D = {I, , F } 8 0受理状態のみ1 0 19 1 > > ; {a} {b} ; 0 > > < B{a} C B0C= B ; ; {b} C B C = 1 0 0 0 ,@ A , @1A> > > ; ; ; {a, b} > : ; ; ; ; {a, b} 0 Saturday, March 31, 12
  • 47. a, b a 1 b 0 a b a, b 3 状態0から状態0 2 DF A D = {I, , F } に遷移する文字はない 8 0 1 0 19 > > ; {a} {b} ; 0 > > < B{a} C B0C= ; ; {b} C B C = 1 0 0 0 ,B @ ; A , @1A> > > ; ; {a, b} > : ; ; ; ; {a, b} 0 Saturday, March 31, 12
  • 48. a, b a 1 b 0 a b a, b 3 状態0から状態0 状態0から状態1 2 DF A D = {I, , F } に遷移する文字はない に遷移する文字はa 8 0 1 0 19 > > ; {a} {b} ; 0 > > < B{a} C B0C= ; ; {b} C B C = 1 0 0 0 ,B @ ; A , @1A> > > ; ; {a, b} > : ; ; ; ; {a, b} 0 Saturday, March 31, 12
  • 49. a, b a 1 b 0 a b a, b 3 2 0 1 0 1 「文字ごと」に遷移行列を 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta 考えてみる (要素は1,0のみ C =B @0 0 0 1A C Tb = B @0 0 0 1A 0    論理行列) 0 0 1 0 0 1 0 Saturday, March 31, 12
  • 50. a, b a 1 b 0 a b a, b 3 2 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B C @0 0 0 1A @0 0 0 1A 0 0 0 1 0 0 0 1 Saturday, March 31, 12
  • 51. a, b a 1 b 0 a b a, b 3 文字aで状態0は 2 状態1に遷移 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B C @0 0 0 1A @0 0 0 1A 0 0 0 1 0 0 0 1 Saturday, March 31, 12
  • 52. a, b a 1 b 0 a b a, b 3 文字aで状態0は 2 状態1に遷移 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B C @0 0 0 1A @0 0 0 1A 0 0 0 1 0 0 0 1 文字aで状態1は 状態0に遷移 Saturday, March 31, 12
  • 53. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 行列演算で受理判定!! 例題: “aaaab” Saturday, March 31, 12
  • 54. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 Saturday, March 31, 12
  • 55. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” Saturday, March 31, 12
  • 56. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” 4 I · T a · Tb · F Saturday, March 31, 12
  • 57. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” 4 I · T a · Tb · F 2 = I · Ta · T b · F Saturday, March 31, 12
  • 58. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” 0 1 0 1 4 0 0 1 0 0 I · T a · Tb · F B0 2 0 0 1C B0C = I · Ta · T b · F = 1 0 0 0 ·B @0 C·B C 0 0 1A @1A 0 0 0 1 0 Saturday, March 31, 12
  • 59. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” 0 1 0 1 4 0 0 1 0 0 I · T a · Tb · F B0 2 0 0 1C B0C = I · Ta · T b · F = 1 0 0 0 ·B @0 C·B C 0 0 1A @1A 0 0 0 1 0 =1 Saturday, March 31, 12
  • 60. I= 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 B0C B1 0 0 0C B0 0 0 1C F = B C Ta = B0 0 C Tb = B C @1A @ 0 1A @0 0 0 1A 0 0 0 0 1 0 0 0 1 “aaaab” 結果が1→ 受理 結果が0→ 非受理 0 1 0 1 4 0 0 1 0 0 I · T a · Tb · F B0 2 0 0 1C B0C = I · Ta · T b · F = 1 0 0 0 ·B @0 C·B C 0 0 1A @1A 0 0 0 1 0 =1 Saturday, March 31, 12
  • 61. 回帰 先例中の行列積 4 Ta · Tb = Ta · Ta · Ta · Ta · Tb 正方行列同士の積は閉じている かつ結合則が成り立つ Saturday, March 31, 12
  • 62. 回帰 先例中の行列積 閉じてる? 結合的演算? 4 Ta · Tb = Ta · Ta · Ta · Ta · Tb 正方行列同士の積は閉じている かつ結合則が成り立つ Saturday, March 31, 12
  • 63. 回帰 先例中の行列積 閉じてる? 結合的演算? 4 Ta · Tb = Ta 半群·だっ!!T ·T ·T T · a a a b 正方行列同士の積は閉じている かつ結合則が成り立つ Saturday, March 31, 12
  • 64. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 この2つの行列が生成する全ての TD 行列の集合  を計算(遷移閉包) Saturday, March 31, 12
  • 65. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 この2つの行列が生成する全ての TD 行列の集合  を計算(遷移閉包) → 読者自身で手を動かせ(圧迫) Saturday, March 31, 12
  • 66. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Saturday, March 31, 12
  • 67. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 0 1 1 0 0 0 B0 1 0 0C Ta · Ta = B @0 C 0 0 1A 0 0 0 1 Saturday, March 31, 12
  • 68. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Saturday, March 31, 12
  • 69. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 0 1 0 0 0 1 B0 0 1 0C Ta · Ta = Ta 2 Ta · Tb = B @0 C 0 0 1A 0 0 0 1 Saturday, March 31, 12
  • 70. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Ta · Tb = Tab Saturday, March 31, 12
  • 71. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Ta · Tb = Tab 2 2 Ta · Ta = Ta · Ta = Ta Saturday, March 31, 12
  • 72. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Ta · Tb = Tab 2 2 2 Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb Saturday, March 31, 12
  • 73. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Ta · Tb = Tab 2 2 2 Ta · Ta = Ta · Ta2 = Ta T0 · Tb = Tb a 13 0 0 0 1 6 B0 0 0 1C7 8x 2 TD 6Tb · x = B 4 @0 0 0 C7 1A5 0 0 0 1 Saturday, March 31, 12
  • 74. 遷移行列が成す半群 0 1 0 1 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B @0 C @0 0 0 1A 0 0 1A 0 0 0 1 0 0 0 1 Ta · Ta = Ta 2 Ta · Tb = Tab 2 2 2 Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb 8x 2 TD [Tb · x = T; ] Saturday, March 31, 12
  • 75. 遷移行列が成す半群 0 1 01 0 1 0 0 0 0 1 0 B1 0 0 0C B0 0 0 1C Ta = B C Tb = B C 遷移閉包が求まった!!→5つの行列 A @0 0 0 1A @0 0 0 1 0 0 0 1 0 0 0 1 TD = {Ta , Tb , Taa , Tab , T; } Ta · Ta = Ta 2 Ta · Tb = Tab 2 2 2 Ta · Ta = Ta · Ta = Ta Ta · Tb = Tb 8x 2 TD [Tb · x = T; ] Saturday, March 31, 12
  • 76. 半群+単位元=モノイド 0 1 1 0 0 0 B0 1 0 0C I=B 単位行列        を追加 @0 0 1 0A C (  に) TD 0 0 0 1 Saturday, March 31, 12
  • 77. 半群+単位元=モノイド 0 M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·} Saturday, March 31, 12
  • 78. 半群+単位元=モノイド 0 M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·}  単位行列を追加 行列積  (もちろん単位元) Saturday, March 31, 12
  • 79. 半群+単位元=モノイド 0 M = {{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
  • 80. 半群+単位元=モノイド 0 M = {{I, Ta , Tb , Taa , Tab , T; }, I, ·} I Ta Tb Taa Tab T; I D これを のTTransition TMonoid I a Tb Taa ab T; Ta Ta Taa Tab Ta Tb T; Tb Tb T M (D) と呼び    で表す。; 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
  • 81. 正規とは!! (4) L(D) = L(M) となる等価な最小DFA と D Syntactic Monoid M  について T M (D) Mは同型 と  ([2] p691) Saturday, March 31, 12
  • 83. 普通のDFA実装 x86/x64最適化勉強会1 「正規表現とJITとベンチマーク」 Saturday, March 31, 12
  • 84. 普通のDFA実装 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) } x86/x64最適化勉強会1 「正規表現とJITとベンチマーク」 Saturday, March 31, 12
  • 85. 今回提案のSIMD実装 ・文字列は結合的二項演算列 (モノイド上の) → SIMDで並列reductionができれば! → SIMD実装だと O(n log W/W ) ぐらい期待できる? (Wはワードサイズ) Saturday, March 31, 12
  • 86. 今回提案のSIMD実装 ・文字列は結合的二項演算列 (モノイド上の) → SIMDで並列reductionができれば! → SIMD実装だと O(n log W/W ) ぐらい期待できる? (Wはワードサイズ) *注意 NFAのビットパラレル   実装とはベツモノ Saturday, March 31, 12
  • 87. SIMD並列reduction ・加算等基本的な水平方向演算は現AVXにも Saturday, March 31, 12
  • 88. SIMD並列reduction ・加算等基本的な水平方向演算は現AVXにも ・今回やりたい演算と要素は正規表現に依存 Saturday, March 31, 12
  • 89. SIMD並列reduction ・加算等基本的な水平方向演算は現AVXにも ・今回やりたい演算と要素は正規表現に依存 ・任意の二項演算なんてできるわけない Saturday, March 31, 12
  • 90. SIMD並列reduction ・加算等基本的な水平方向演算は現AVXにも ・今回やりたい演算と要素は正規表現に依存 ・任意の二項演算なんてできるわけない そう、AVX2が出るまではねっ!! Saturday, March 31, 12
  • 92. AVX2追加命令群 [3][4] ・2013年のHaswellから入る(予定) ・整数256bit命令群の追加!! ・並列表引き命令gatherの追加!! ・Any-to-Any置換命令permの追加!! (AVXのshuffleは128bit-laneに閉じてた) Saturday, March 31, 12
  • 93. gather: 並列表引き[4] ・引数3つ  → DST,SRC1(index&table),SRC2(condition) ・浮動小数点は vgather, 整数はvpgather  → インデックス/値はDword, Qwordを指定  → 2つの元をpack(2byte)して表引き  → 任意の二項演算が可(表はもちろん作る) Saturday, March 31, 12
  • 94. gather: 並列表引き[4] ・引数3つ  → DST,SRC1(index&table),SRC2(condition) ・浮動小数点は vgather, 整数はvpgather  → インデックス/値はDword, Qwordを指定  → 2つの元をpack(2byte)して表引き  → 任意の二項演算が可(表はもちろん作る) Saturday, March 31, 12
  • 95. gather: 並列表引き[4] VPGATHERDD (VEX.256 version) FOR j ← 0 to7 i ・引数3つ ← j * 32; IF MASK[31+i] THEN  → DST,SRC1(index&table),SRC2(condition) MASK[i+31:i] ← 0xFFFFFFFF; // extend from most significant bit ELSE MASK[i +31:i] ← 0; ・浮動小数点は vgather, 整数はvpgather FI; ENDFOR FOR j → 7 ← 0 to インデックス/値はDword, Qwordを指定 i ← j * 32; DATA_ADDR ← BASE_ADDR + (SignExtend(VINDEX1[i+31:i])*SCALE + DISP;  → 2つの元をpack(2byte)して表引き 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
  • 98. 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
  • 99. 実装方針 ・reductionは並列表引き命令vpgatherdd  → モノイドの元は256個以下に限定(1byte)  → 2つの元をpack(2byte)して表引き  → 任意の二項演算が可(表はもちろん作る) ・要素を並べ替えて1つになるまで繰り返す  → vpshufとvperm Saturday, March 31, 12
  • 100. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 Saturday, March 31, 12
  • 101. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF 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
  • 102. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 (256bit)YMMレジスタに2つずつpack (上位2byteは0) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 Saturday, March 31, 12
  • 103. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 (256bit)YMMレジスタに2つずつpack (上位2byteは0) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 並列表引によって二項演算 (結果上位3byteにゴミが) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 ???c0 7 ???c0 6 ???c0 5 ???c0 4 ???c0 3 ???c0 2 ???c0 1 ???c0 0 Saturday, March 31, 12
  • 104. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 (256bit)YMMレジスタに2つずつpack (上位2byteは0) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 並列表引によって二項演算 (結果上位3byteにゴミが) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 ???c0 7 ???c0 6 ???c0 5 ???c0 4 ???c0 3 ???c0 2 ???c0 1 ???c0 0 0000 00c0 c0 7 6 0000 00c0 c0 5 4 0000 00c0 c0 3 2 0000 00c0 c0 1 0 shuffle&permで結果を2つずつpackしなおす(他は0に) Saturday, March 31, 12
  • 105. c0 ⇠ c メモリ上に    F それぞれ1byte16個の元 cF cE cD cC cB cA c9 c8 c7 c6 c5 c4 c3 c2 c1 c0 (256bit)YMMレジスタに2つずつpack (上位2byteは0) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 並列表引によって二項演算 (結果上位3byteにゴミが) 00cF cE 00cD cC 00cB cA 00c9 c8 00c7 c6 00c5 c4 00c3 c2 00c1 c0 ???c0 7 ???c0 6 ???c0 5 ???c0 4 ???c0 3 ???c0 2 ???c0 1 ???c0 0 0000 00c0 c0 7 6 0000 00c0 c0 5 4 0000 00c0 c0 3 2 0000 00c0 c0 1 0 shuffle&permで結果を2つずつpackしなおす(他は0に) 結果が1つの元になるまで繰り返す!! Saturday, March 31, 12
  • 106. デモプログラム ・YASMでAVX2プログラミング  → YASM 1.2.0 からAVX2対応  → 実は初アセンブラプログラミング(というかSIMDも) ・IntelのEmulatorで動作確認できた! (動いた) ・コードは一式githubに挙げてます  → https://github.com/sinya8282/AVX2REGEX Saturday, March 31, 12
  • 107. コード片(YASM) vpmovzxwd ymm0, [rdi] vmovdqa ymm1, [shuffle1] 置換条件データ vmovdqa ymm2, [shuffle2] vpcmpeqd ymm3, ymm3, ymm3 (32byte aligned) vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 vpshufb ymm0, ymm0, ymm1 vmovapd ymm4, ymm3 最後は二つの元を vpgatherdd ymm0, [rdx+ymm0], ymm4 vpshufb ymm0, ymm0, ymm1 laneをまたいで置 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 vpermq ymm0, ymm0, 0x08 換する必要がある vpshufb ymm0, ymm0, ymm2 vmovapd ymm4, ymm3 vpgatherdd ymm0, [rdx+ymm0], ymm4 のでperm+shuffle movq rax, xmm0 Saturday, March 31, 12
  • 108. 速いんでしょうか? ・知りません :-p gatherの速度次第!!  → Emulatorじゃ速度指標が得られなげ?  → 16回の表引きが4回のvpgatherddに  → 今後もSIMDデータ幅は大きくなるんでしょうか? ・その他の命令(YMM shuffle/perm/mov)は  高速([6])なのであまり問題にならない? ・Haswell出るまで待ちましょう Saturday, March 31, 12
  • 109. 不満な点 ・gatherで条件レジスタが0クリアされる ・byte単位256bit Any-to-Any置換命令がない  → permとshufbを組み合わせ... ・デモプログラムは制約条件有りまくり  → 制約無くせる!! もっと最適化もできる  → (実機出ないとやる気が...) Saturday, March 31, 12
  • 114. 正規全般 [1]Elements of  AutomataTheory 神本。 (正規な理論はこの本読めばok) [2]Syntactic Semigroups (in Handbook of Formal Languages volume 1) Saturday, March 31, 12
  • 115. SIMD周り Haswell New Instruction Descriptions [3]  Now Available! - Intel Software Blogs [4] Intel® Advanced Vector Extensions    Programming Reference - PDF [5] Intel® 64 and IA-32 Architectures    Optimization Reference Manual - PDF Tables (Lists of Instruction [6] Instruction  latencies, throughputs) - PDF Saturday, March 31, 12