SlideShare a Scribd company logo
1 of 84
Download to read offline
並列化と実行時コード生成を用いた
                    正規表現マッチングの高速化
                          東京工業大学
                        新屋 良磨   佐々 政孝
                         サイボウズ・ラボ
                           光成 滋生


Tuesday, March 27, 12
研究概要
            目的
                        正規表現マッチングの高速化
                        → 数多くの既存実装を超えたい

           提案手法




Tuesday, March 27, 12
研究概要
            目的
                        正規表現マッチングの高速化
                        → 数多くの既存実装を超えたい

           提案手法
                        マッチングの並列化



Tuesday, March 27, 12
研究概要
            目的
                        正規表現マッチングの高速化
                        → 数多くの既存実装を超えたい

           提案手法
                        マッチングの並列化

                         実行時コード生成
Tuesday, March 27, 12
研究概要
            目的
                        正規表現マッチングの高速化
                        → 数多くの既存実装を超えたい

           提案手法
                        マッチングの並列化
                                →併用可能

                         実行時コード生成
Tuesday, March 27, 12
研究成果

    •効率の良い並列マッチングをオートマトンの自然
    な拡張によって実現した. → SFA

    •マッチングにコード生成を用いることで, 3倍以上
    の高速化に成功した.

    •実装は公開 → http://github.com/sinya8282/regen


Tuesday, March 27, 12
発表の流れ


                  1. 正規表現マッチングの説明(既存手法)
                  2. マッチング並列化の説明 (提案手法1)
                  3. 実行時コード生成の説明 (提案手法2)
                  4. 性能評価 - ベンチマーク
                  5. まとめ




Tuesday, March 27, 12
正規表現マッチング


Tuesday, March 27, 12
正規表現

                   •正規言語(3型文法)を認識できる文法.
                   •多くのシステムで活用(lex, grep, IDS....)


      正規表現マッチング = 有限オートマトンの動作

                  •DFA: 有限の状態, 決定的な遷移
                  •NFA: 有限の状態, 非決定的な遷移


Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                              q2
                          /[ab]*a[ab]/
                             DFA          a        b


                                              b
                                     q1                q3
                            b                 a
                                 a
                                          b
                            q0




Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                              q2
                          /[ab]*a[ab]/
                             DFA          a        b


                                              b
                                     q1                q3
                            b                 a
                                 a
                                          b
                            q0


                                     ab aa


Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                     q2
                             /[ab]*a[ab]/
                                DFA          a            b


                                                     b
                                        q1                        q3
                               b                     a
                                    a
                                             b
                               q0




                         a          b            a            a

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                       q2
                               /[ab]*a[ab]/
                                  DFA          a            b


                                                       b
                                          q1                        q3
                                 b                     a
                                      a
                                               b
                                 q0




                        q0
                           a          b            a            a

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                       q2
                               /[ab]*a[ab]/
                                  DFA          a            b


                                                       b
                                          q1                        q3
                                 b                     a
                                      a
                                               b
                                 q0




                        q0
                           a     q1
                                      b            a            a

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                           q2
                               /[ab]*a[ab]/
                                  DFA              a            b


                                                           b
                                          q1                            q3
                                 b                         a
                                      a
                                                   b
                                 q0




                        q0
                           a     q1
                                      b       q3
                                                       a            a

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                           q2
                               /[ab]*a[ab]/
                                  DFA              a                 b


                                                           b
                                          q1                                 q3
                                 b                         a
                                      a
                                                   b
                                 q0




                        q0
                           a     q1
                                      b       q3
                                                       a        q1
                                                                         a

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                           q2
                               /[ab]*a[ab]/
                                  DFA              a                 b


                                                           b
                                          q1                                 q3
                                 b                         a
                                      a
                                                   b
                                 q0




                        q0
                           a     q1
                                      b       q3
                                                       a        q1
                                                                         a    q2

Tuesday, March 27, 12
DFA - 決定性有限オートマトン
                                    a


                                                           q2
                               /[ab]*a[ab]/
                                  DFA              a                 b


                                                           b
                                          q1                                 q3
                                 b                         a
                                      a
                                                   b
                                 q0

                                              受理状態(二重丸)に遷移する.
                                          よってこのDFAはabaaを受理!!


                        q0
                           a     q1
                                      b       q3
                                                       a        q1
                                                                         a    q2

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                        a        [ab]
                                 q0         q1          q2




Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                         a        [ab]
                                 q0          q1          q2



                                        ab aa



Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                          a        [ab]
                                 q0           q1              q2




                        a             b       a           a

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                          a        [ab]
                                 q0           q1              q2




                    q0
                         a            b       a           a

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                           a        [ab]
                                  q0           q1              q2




                    q0
                         a   q0        b       a           a
                             q1

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                           a             [ab]
                                  q0                q1              q2




                    q0
                         a   q0        b       q0   a           a
                             q1                q2

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                           a             [ab]
                                  q0                q1              q2




                    q0
                         a   q0        b       q0   a    q0     a
                             q1                q2        q1

Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                           a             [ab]
                                  q0                q1              q2




                    q0
                         a   q0        b       q0   a    q0     a    q0
                                                                     q1
                             q1                q2        q1
                                                                     q2
Tuesday, March 27, 12
NFA - 非決定性有限オートマトン

                  /[ab]*a[ab]/   [ab]
                     NFA
                                           a             [ab]
                                  q0                q1              q2



                                           受理状態に遷移する場合がある.
                                           よってこのNFAはabaaを受理!!



                    q0
                         a   q0        b       q0   a    q0     a    q0
                                                                     q1
                             q1                q2        q1
                                                                     q2
Tuesday, March 27, 12
NFA・DFAの性質
                                        NFA          DFA


                         状態の定義        q ∈ Qn        q ∈ 2Qn


                           状態数
                                                       |Qn|
                                    |Qn| = O(|R|)   O(2       )

                         マッチング
                                     O(Nx|Qn|)       O(N)
                           計算量

                        NFAからDFAを構築: 部分集合構成法
                        |R|: 正規表現の長さ |Qn|: NFAの状態数
                        N: テキストの長さ        
Tuesday, March 27, 12
マッチングの並列化


Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        a   b   a   a




               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   b   a   a




               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                               a   q1
                                                        a   q2




               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                               a   q1
                                                        a   q2

               •このような状態遷移を




               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                               a   q1
                                                        a   q2

               •このような状態遷移を
                                 a        b    a        a


               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                               a   q1
                                                        a   q2

               •このような状態遷移を
                                 a        b
                                 a        a

               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                               a   q1
                                                        a   q2

               •このような状態遷移を

                             ?
                                 a        b

                             ?
                                 a        a

               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                                a    q1
                                                          a   q2

               •このような状態遷移を

                             ?
                                 a    ?
                                          b 結果1

                             ?
                                 a    ?
                                          a    結果2

               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
マッチングの並列化 = 状態遷移の並列化

                        q0
                             a   q1
                                      b   q3
                                                a    q1
                                                          a   q2

               •このような状態遷移を

                             ?
                                 a    ?
                                          b 結果1
                                                              q2
                             ?
                                 a    ?
                                          a    結果2

               •のように文字単位で並列に実行したい
Tuesday, March 27, 12
並列マッチング: 先行研究

    •Lander, Fisher(1980): 「Parallel Prefix Computation」

    •松崎(2011): 「正規表現マッチングの並列化とその
    Hadoopでの評価」
             •DFAベース並列マッチング
               •O((N/P+logP)|Qd|)
             •NFAベース並列マッチング
               •O((N/P+logP)|Qn|3 )
            |Qn|, |Qd|: NFA,DFAの状態数 N: テキストの長さ P: 並列度

Tuesday, March 27, 12
マッチングを並列化するには?

    •状態遷移は常に「直前の状態」に依存しており,
    単純に並列化できない.




Tuesday, March 27, 12
マッチングを並列化するには?

    •状態遷移は常に「直前の状態」に依存しており,
    単純に並列化できない.




 「各状態を初期状態とした全パターン」について
  状態遷移を計算. 結果を最後にまとめる.


Tuesday, March 27, 12
並列マッチングの例
                                                    a



                               /[ab]*a[ab]/
                        abaa
                                                    q2


                                  DFA           a        b


                                                    b
                                           q1                q3
                                   b                a
                                       a
                                                b
                                  q0




Tuesday, March 27, 12
並列マッチングの例
                                                      a



                                 /[ab]*a[ab]/         q2


                                    DFA           a        b


                                                      b


                        a    b
                                             q1                q3
                                     b                a
                                         a
                                                  b
                                    q0




                        a    a

Tuesday, March 27, 12
並列マッチングの例
                                                      a



                                 /[ab]*a[ab]/         q2


                                    DFA           a        b


                                                      b
 q0 q0
                        a    b
                                             q1                q3
                                     b                a
                                         a

 q1 q1
                                                  b
                                    q0

 q2 q2
 q3 q3


 q0 q0
 q1 q1                  a    a
 q2 q2
 q3 q3
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                      a



                                 /[ab]*a[ab]/         q2


                                    DFA           a        b


                                                      b
 q0 q0
                        a    b
                                             q1                q3
                                     b                a
                                         a

 q1 q1
                                                  b
                                    q0

 q2 q2
 q3 q3


 q0 q0
 q1 q1                  a    a
 q2 q2
 q3 q3
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                      a



                    遷移状態         /[ab]*a[ab]/         q2


                                    DFA           a        b


                                                      b
 q0 q0
                        a    b
                                             q1                q3
                                     b                a
                                         a

 q1 q1
                                                  b
                                    q0

 q2 q2
 q3 q3


 q0 q0
 q1 q1                  a    a
 q2 q2
 q3 q3
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                             a



                    遷移状態                /[ab]*a[ab]/         q2


                                           DFA           a        b


                                                             b
 q0 q0                      q0 q1
                        a           b
                                                    q1                q3
                                            b                a
                                                a

 q1 q1                      q1 q2
                                                         b
                                           q0

 q2 q2                      q2 q2
 q3 q3                      q3 q1


 q0 q0                      q0 q1
 q1 q1                  a   q1 q2   a
 q2 q2                      q2 q2
 q3 q3                      q3 q1
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                                     a



                    遷移状態                        /[ab]*a[ab]/         q2


                                                   DFA           a        b


                                                                     b
 q0 q0                      q0 q1
                        a           b   q0 q3
                                                            q1                q3
                                                    b                a
                                                        a

 q1 q1                      q1 q2
                                                                 b
                                        q1 q3      q0

 q2 q2                      q2 q2       q2 q3
 q3 q3                      q3 q1       q3 q3

 q0 q0                      q0 q1       q0 q2
 q1 q1                  a   q1 q2   a   q1 q2
 q2 q2                      q2 q2       q2 q2
 q3 q3                      q3 q1       q3 q2
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                                     a



                    遷移状態                        /[ab]*a[ab]/         q2


                                                   DFA           a        b


                                                                     b
 q0 q0                      q0 q1
                        a           b   q0 q3
                                                            q1                q3
                                                    b                a
                                                        a

 q1 q1                      q1 q2
                                                                 b
                                        q1 q3      q0

 q2 q2                      q2 q2       q2 q3
 q3 q3                      q3 q1       q3 q3

 q0 q0                      q0 q1       q0 q2
 q1 q1                  a   q1 q2   a   q1 q2
 q2 q2                      q2 q2       q2 q2
 q3 q3                      q3 q1       q3 q2
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                                     a



                    遷移状態                        /[ab]*a[ab]/         q2


                                                   DFA           a        b


                                                                     b
 q0 q0                      q0 q1
                        a           b   q0 q3
                                                            q1                q3
                                                    b                a
                                                        a

 q1 q1                      q1 q2
                                                                 b
                                        q1 q3      q0

 q2 q2                      q2 q2       q2 q3
 q3 q3                      q3 q1       q3 q3

 q0 q0                      q0 q1       q0 q2
 q1 q1                  a   q1 q2   a   q1 q2
 q2 q2                      q2 q2       q2 q2
 q3 q3                      q3 q1       q3 q2
Tuesday, March 27, 12
並列マッチングの例
            初期状態                                                     a



                    遷移状態                        /[ab]*a[ab]/         q2


                                                   DFA           a        b


                                                                     b
 q0 q0                      q0 q1
                        a           b   q0 q3
                                                            q1                q3
                                                    b                a
                                                        a

 q1 q1                      q1 q2
                                                                 b
                                        q1 q3      q0

 q2 q2                      q2 q2       q2 q3
 q3 q3                      q3 q1       q3 q3
                                                結果からq0 → q3 → q2
 q0 q0                      q0 q1       q0 q2   と遷移することが解る.
 q1 q1                  a   q1 q2   a   q1 q2
 q2 q2                      q2 q2       q2 q2    abaaは「マッチする」
 q3 q3                      q3 q1       q3 q2      並列実行ができた!
Tuesday, March 27, 12
SFA - 同時状態FA
    提案手法1
    •全状態を初期状態とした遷移を同時に行う.
    •初期状態から遷移状態の写像を状態として扱う.
    •部分集合構成法の自然な拡張で構築できる.




Tuesday, March 27, 12
SFA - 同時状態FA
    提案手法1
    •全状態を初期状態とした遷移を同時に行う.
    •初期状態から遷移状態の写像を状態として扱う.
    •部分集合構成法の自然な拡張で構築できる.
                                  オートマトンの自然な拡張
                                 並列実行のための提案モデル



                          同時状態FA
                                SFA
                         (Simultaneous FA)
Tuesday, March 27, 12
DFAからSFAの構築            a


                                               q2
                           /[ab]*a[ab]/
                              DFA          a        b


                                               b
                                      q1                q3
                             b                 a
                                  a
                                           b
                             q0




Tuesday, March 27, 12
DFAからSFAの構築            a


                                                       q2
                        q0 q0      /[ab]*a[ab]/
                        q1 q1         DFA          a        b

                        q2 q2                          b
                                              q1
                        q3 q3        b
                                          a            a
                                                                q3

                                                   b
                                     q0




Tuesday, March 27, 12
DFAからSFAの構築            a


                                                       q2
                        q0 q0      /[ab]*a[ab]/
                        q1 q1         DFA          a        b

                        q2 q2                          b
                                              q1
                        q3 q3        b
                                          a            a
                                                                q3


                   a                 q0
                                                   b




           q0 q1
           q1 q2
           q2 q2
           q3 q1


Tuesday, March 27, 12
DFAからSFAの構築                 a


                                                            q2
                        q0 q0           /[ab]*a[ab]/
                        q1 q1              DFA          a        b

                        q2 q2                               b
                                                   q1
                        q3 q3             b
                                               a            a
                                                                     q3


                   a             b        q0
                                                        b




           q0 q1                q0 q0
           q1 q2                q1 q3
           q2 q2                q2 q3
           q3 q1                q3 q0


Tuesday, March 27, 12
DFAからSFAの構築                   a


                                                              q2
                        q0 q0           /[ab]*a[ab]/
                        q1 q1              DFA            a        b

                        q2 q2                                 b
                                                     q1
                        q3 q3               b
                                                 a            a
                                                                       q3


                   a             b          q0
                                                          b




           q0 q1                q0 q0
           q1 q2                q1 q3
           q2 q2                q2 q3
           q3 q1                q3 q0
 a                      ba              b
Tuesday, March 27, 12
DFAからSFAの構築                  a


                             q’0                           q2
                        q0 q0        /[ab]*a[ab]/
                        q1 q1           DFA            a        b

                        q2 q2                              b
                                                  q1
                        q3 q3            b
                                              a            a
                                                                    q3


                   a           b         q0
                                                       b




           q0 q1             q0 q0
           q1 q2             q1 q3
           q2 q2             q2 q3
           q3 q1             q3 q0
 a                      ba           b
Tuesday, March 27, 12
DFAからSFAの構築                  a


                             q’0                           q2
                        q0 q0        /[ab]*a[ab]/
                        q1 q1           DFA            a        b

                        q2 q2                              b
                                                  q1
                        q3 q3            b
                                              a            a
                                                                    q3


                   a           b         q0
                                                       b



               q’1
           q0 q1             q0 q0
           q1 q2             q1 q3
           q2 q2             q2 q3
           q3 q1             q3 q0
 a                      ba           b
Tuesday, March 27, 12
DFAからSFAの構築                  a


                             q’0                           q2
                        q0 q0          /[ab]*a[ab]/
                        q1 q1             DFA          a        b

                        q2 q2                              b
                                                  q1
                        q3 q3            b
                                              a            a
                                                                    q3


                   a           b         q0
                                                       b



               q’1
           q0 q1                 q’2
                             q0 q0
           q1 q2             q1 q3
           q2 q2             q2 q3
           q3 q1             q3 q0
 a                      ba         b
Tuesday, March 27, 12
DFAからSFAの構築                  a


                             q’0                           q2
                        q0 q0          /[ab]*a[ab]/
                        q1 q1             DFA          a        b

                        q2 q2                              b
                                                  q1
                        q3 q3            b
                                              a            a
                                                                    q3


                   a           b         q0
                                                       b



               q’1
           q0 q1                 q’2
                             q0 q0
           q1 q2             q1 q3
           q2 q2             q2 q3                     対応構成法
           q3 q1             q3 q0                    写像の遷移から
 a                      ba         b              状態の遷移に変換!
Tuesday, March 27, 12
DFAからSFAの構築 (cont)
                                     a


                    /[ab]*a[ab]/            q2
                       DFA              a        b


                                            b
                                   q1                q3
                        b                   a
                              a
                                        b
                        q0




Tuesday, March 27, 12
DFAからSFAの構築 (cont)
                                     a


                    /[ab]*a[ab]/
                                                            対応構成法
                                            q2
                       DFA              a               b


                                                b
                                   q1                            q3
                         b                      a
                               a
                                        b                                 a
                        q0                                                b
                                        b                   q2        b
                        q0
                                                                          q6
                               a
                                                                      b        a

                                   q1       b                             b
                                                            q4                     q5

                        SSFA            a
                                            a       b                     a
                                                                      a

                                            q3
Tuesday, March 27, 12
NFA・DFA・SFAの性質
                                                           SFA              SFA
                            NFA          DFA
                                                        from DFA         from NFA

    状態の定義                 q ∈ Qn         q ∈2   Qn
                                                       q ∈ (Qd→Qd) q ∈ (Qn→2 )
                                                                                       Qn



                                                                                   2
          状態数
                                                |Qn|            |Qd|           |Qn|
                        |Qn| = O(|R|) |Qd| = O(2 )      O(|Qd| )          O(2      )

    マッチング                                                O(N/P+P)       O(N/P+P|Qn|)
                         O(Nx|Qn|)       O(N)
          計算量                                          O(N/P+|Qd|logP) O(N/P+|Qn|3logP)


                   |R|: 正規表現の長さ |Qn|: NFAの状態数     
                   N: テキストの長さ |Qd|: DFAの状態数     
                   P: 並列度 A→B : AからBへの写像全体の集合 2 A : Aの冪集合
Tuesday, March 27, 12
SSFA - 効率の良い並列マッチング
    •SFAの状態遷移は決定的 → DFAと同等
    •SFAは受理判定が特殊(並列実行結果のreduce)
    •マッチングの計算量(N: テキスト長)
     •DFA : O(N)
     •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP)




Tuesday, March 27, 12
SSFA - 効率の良い並列マッチング
    •SFAの状態遷移は決定的 → DFAと同等
    •SFAは受理判定が特殊(並列実行結果のreduce)
    •マッチングの計算量(N: テキスト長)
     •DFA : O(N)
     •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP)


                        N = P の時 O(P) or O(|Qd|logP)
                        N >> P の時 O(N/P)
Tuesday, March 27, 12
提案手法2

                  実行時コード生成


Tuesday, March 27, 12
既存のマッチング実装(DFA)




      •状態遷移のコードは完全に静的な記述.
      •状態遷移に必要な二次元配列は動的に構築.
Tuesday, March 27, 12
コード生成を用いたマッチング実装(DFA)

       q0: if (str == end) return 0; //状態番号
            if (*str++ - ’A’ < ’B’ - ’A’ + 1) goto q1; else goto reject;
       q1: if (str == end) return 1;
           static const void*q1_table[256] = { [0 ... 255] = &reject;
                [‘A’ ... ‘B’] = &q1; [‘C’] = &q2; };
                                                              [A-B]
           goto *q1_table[*str++];
       q2: if (str == end) return 2;
                                                      [A-B]                C
           goto reject;                        q0               q1             q2
       reject: return -1;
                  *説明のためC言語で記述.(実際はX86ネイティブコード)

    •状態遷移はコード間のジャンプ命令→ PCが状態!
    •受理判定は生成コード呼び出し側で行う.
Tuesday, March 27, 12
生成コード(DFA)
                        エントリー
   (レジスタ調整,初期状態へジャンプ)
                                   状態コード詳細 (24 Byte)
          状態0のコード

          状態1のコード



      状態遷移テーブル


    •コード生成は JIT ライブラリ Χbyak を使用.
     •Χbyak: サイボウズ・ラボ 光成氏が開発.
Tuesday, March 27, 12
コード生成の利点

    •状態ごとに異なるアドレスのコードを実行.

    •命令/データキャッシュを有効に使える.

    •正規表現に最適化されたコードを生成可能.




Tuesday, March 27, 12
遷移規則に依るコード生成の最適化
       通常はテーブルルックアップ
              [A-B]

                                               C
                                    q0                     q1


       q0: if (str == end) return 0;
             static const void*q0_table[256] = { [0 ... 255] = &reject;
                  [‘A’ ... ‘B’] = &q0; [‘C’] = &q1; };
              goto *q0_table[*str++];
       q1: if (str == end) return 1;
           else goto reject;

Tuesday, March 27, 12
遷移規則に依るコード生成の最適化 cont
           1つの条件分岐で住む場合

                                                    単純比較
    q0: if (str == end) goto reject;
            if (*str++ == ‘A’) goto q1;
            else goto reject;                                   A
                                                          q0           q1
    q1: if (str == end) goto 1;
        else goto reject;



                                                                範囲比較
    q0: if (str == end) goto reject;
            if (*str++ - ’A’ < ’Z’ - ’A’ + 1) goto q1;
            else goto reject;                                  [A-Z]
    q1: if (str == end) goto 1;
                                                         q0             q1
        else goto reject;

Tuesday, March 27, 12
遷移規則に依るコード生成の最適化 cont’
    •遷移先を1つの分岐命令で判定
     •メモリ(テーブル)アクセスが不要
     •分岐予測が効く!!!
    •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化)




Tuesday, March 27, 12
遷移規則に依るコード生成の最適化 cont’
    •遷移先を1つの分岐命令で判定
     •メモリ(テーブル)アクセスが不要
     •分岐予測が効く!!!
    •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化)



       分岐先が限定されるので, コードの展開も可能.
       固定/範囲文字が連続してるほど最適化しやすい.
       ex: http://[a-z]{4}.com
Tuesday, March 27, 12
性能評価


Tuesday, March 27, 12
ベンチマーク条件
     マシン
      •CPU: Intel Core I7 X980
       •3.33GHz, SpeedStep/TurboBoost はOFF
       •6物理コア, 12スレッド
      •Memory: 24GB DDR-SDRAM3
     内容
              •マッチングは完全一致での判定
              •入力文字列はプロセス内でメモリ上に生成
              •比較として Google RE2 (DFAベース実装)
Tuesday, March 27, 12
ベンチマーク: コード生成マッチング
                        Google RE2       コード生成無し DFA            コード生成有り DFA
                   3GB/sec

                  2.5GB/sec                                                  Fast
     Throughput




                   2GB/sec

                  1.5GB/sec

                   1GB/sec

                  0.5GB/sec
                                                                             Slow
                   0GB/sec
                              最適化が効かないパターン                最適化が効くパターン
                               /(([02468][13579]){5})*/    /(0123456789)*/


      •コード生成で正規表現に依らず3倍の高速化.
      •最適化が効く正規表現の場合は更に高速に.
Tuesday, March 27, 12
ベンチマーク: コンパイル時間

       DFAの状態数             128    256    512    1024   2048

   状態の計算時間                 0.05s 0.122s 0.289s 0.676s 1.568s

    状態の計算& 
                           0.05s 0.116s 0.290s 0.683s 1.583s
   コード生成時間


    •1500状態程度のDFAは1秒程度で構築&コード生成
    •コード生成時間は無視できるほど小さい
    •*コード生成は状態数の線形オーダーで可能
Tuesday, March 27, 12
ベンチマーク: 並列マッチング
                                                         /([0-4]{5}[5-9]{5})*/, Input: 1GB
                                      [GB/sec]                    6 Physical Cores            12 Virtual Cores


                                          20
                                                                                                            Fast
                                      16.667

                                      13.333
                         Throughput



                                          10

                                       6.667

                                       3.333
                                                                                                        Slow

                                           0
                                                 1   2      3   4    5    6   7    8   9     10   11   12
                                                                 Number of Threads
                                               コード生成無しSSFA                              コード生成有りSSFA
                                               読み込みだけの指標プログラム


      •DFAの状態数は10, SFAの状態数は109.
      •コード生成版は物理コア数の台数効果(資源限界)
Tuesday, March 27, 12
ベンチマーク:Matching micro-benchmark
            Parallel
                     並列化のオーバーヘッド
                                    Pattern: /(([02468][13579]){5})*/, Input: 100KB~1000KB

                                   Slow                                                             2.40 msec
                          8,000K
                          7,200K
            Clock Cycle




                                                                                                    1.92 msec
                          6,400K
                          5,600K
                                                                                                    1.44 msec
                          4,800K
                          4,000K
                                                                                                    0.96 msec
                          3,200K   Fast
                          2,400K
                          1,600K                                                                    0.48 msec

                           800K
                             0K
                                   100    200   300   400   500   600    700   800   900     1000   [KB]
                                                 Input size
                                    コード生成無し Non-thread                  コード生成無し 2-thread
                                    コード生成有り Non-thread                  コード生成有り 2-thread

    •コード生成無し/有りで300KB/800KB程度で並列
    マッチングが安定して上回る.
Tuesday, March 27, 12
まとめ

    •効率の良い並列マッチングをオートマトンの自然
    な拡張によって実現した. → SFA

    •マッチングにコード生成を用いることで3倍以上
    の高速化.

    •実装は公開 → http://github.com/sinya8282/regen


Tuesday, March 27, 12
課題

    •「正規表現マッチング」の枠組みで高速化はもう
    やりきった?

    •高速な正規表現エンジンが活きるアプリケーショ
    ン/システムを考えていきたい.

    •SFAの状態数について分かっていない問題がいく
    つか....

Tuesday, March 27, 12

More Related Content

What's hot

できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
マルチコアとネットワークスタックの高速化技法
マルチコアとネットワークスタックの高速化技法マルチコアとネットワークスタックの高速化技法
マルチコアとネットワークスタックの高速化技法Takuya ASADA
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタSatoyuki Tsukano
 

What's hot (20)

できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
動的計画法
動的計画法動的計画法
動的計画法
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
マルチコアとネットワークスタックの高速化技法
マルチコアとネットワークスタックの高速化技法マルチコアとネットワークスタックの高速化技法
マルチコアとネットワークスタックの高速化技法
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
arc047
arc047arc047
arc047
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 

More from Ryoma Sin'ya

形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチRyoma Sin'ya
 
有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトンRyoma Sin'ya
 
統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性Ryoma Sin'ya
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜Ryoma Sin'ya
 
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
 
正規言語と代数と論理の対応: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
 
"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介Ryoma Sin'ya
 
正規表現++
正規表現++正規表現++
正規表現++Ryoma Sin'ya
 
正規言語でプログラミング
正規言語でプログラミング正規言語でプログラミング
正規言語でプログラミングRyoma Sin'ya
 
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜Ryoma Sin'ya
 
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装Ryoma Sin'ya
 

More from Ryoma Sin'ya (12)

形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ形式言語理論への 測度論的アプローチ
形式言語理論への 測度論的アプローチ
 
有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン有限モデル理論入門:MSOとオートマトン
有限モデル理論入門:MSOとオートマトン
 
統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性統語的曖昧性・普遍性判定問題の決定可能性
統語的曖昧性・普遍性判定問題の決定可能性
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜
 
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
 
正規言語と代数と論理の対応: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
 
正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めて正規表現入門 星の高さを求めて
正規表現入門 星の高さを求めて
 
"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介"Mix Automatic Sequences"(LATA'13) の紹介
"Mix Automatic Sequences"(LATA'13) の紹介
 
正規表現++
正規表現++正規表現++
正規表現++
 
正規言語でプログラミング
正規言語でプログラミング正規言語でプログラミング
正規言語でプログラミング
 
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
 
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

並列化と実行時コード生成を用いた正規表現マッチングの高速化

  • 1. 並列化と実行時コード生成を用いた 正規表現マッチングの高速化 東京工業大学 新屋 良磨 佐々 政孝 サイボウズ・ラボ 光成 滋生 Tuesday, March 27, 12
  • 2. 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 Tuesday, March 27, 12
  • 3. 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化 Tuesday, March 27, 12
  • 4. 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化 実行時コード生成 Tuesday, March 27, 12
  • 5. 研究概要 目的 正規表現マッチングの高速化 → 数多くの既存実装を超えたい 提案手法 マッチングの並列化 →併用可能 実行時コード生成 Tuesday, March 27, 12
  • 6. 研究成果 •効率の良い並列マッチングをオートマトンの自然 な拡張によって実現した. → SFA •マッチングにコード生成を用いることで, 3倍以上 の高速化に成功した. •実装は公開 → http://github.com/sinya8282/regen Tuesday, March 27, 12
  • 7. 発表の流れ 1. 正規表現マッチングの説明(既存手法) 2. マッチング並列化の説明 (提案手法1) 3. 実行時コード生成の説明 (提案手法2) 4. 性能評価 - ベンチマーク 5. まとめ Tuesday, March 27, 12
  • 9. 正規表現 •正規言語(3型文法)を認識できる文法. •多くのシステムで活用(lex, grep, IDS....) 正規表現マッチング = 有限オートマトンの動作 •DFA: 有限の状態, 決定的な遷移 •NFA: 有限の状態, 非決定的な遷移 Tuesday, March 27, 12
  • 10. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 Tuesday, March 27, 12
  • 11. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 ab aa Tuesday, March 27, 12
  • 12. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 a b a a Tuesday, March 27, 12
  • 13. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a b a a Tuesday, March 27, 12
  • 14. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b a a Tuesday, March 27, 12
  • 15. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a a Tuesday, March 27, 12
  • 16. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a q1 a Tuesday, March 27, 12
  • 17. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 q0 a q1 b q3 a q1 a q2 Tuesday, March 27, 12
  • 18. DFA - 決定性有限オートマトン a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 受理状態(二重丸)に遷移する. よってこのDFAはabaaを受理!! q0 a q1 b q3 a q1 a q2 Tuesday, March 27, 12
  • 19. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 Tuesday, March 27, 12
  • 20. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 ab aa Tuesday, March 27, 12
  • 21. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 a b a a Tuesday, March 27, 12
  • 22. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a b a a Tuesday, March 27, 12
  • 23. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b a a q1 Tuesday, March 27, 12
  • 24. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a a q1 q2 Tuesday, March 27, 12
  • 25. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a q0 a q1 q2 q1 Tuesday, March 27, 12
  • 26. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 q0 a q0 b q0 a q0 a q0 q1 q1 q2 q1 q2 Tuesday, March 27, 12
  • 27. NFA - 非決定性有限オートマトン /[ab]*a[ab]/ [ab] NFA a [ab] q0 q1 q2 受理状態に遷移する場合がある. よってこのNFAはabaaを受理!! q0 a q0 b q0 a q0 a q0 q1 q1 q2 q1 q2 Tuesday, March 27, 12
  • 28. NFA・DFAの性質 NFA DFA 状態の定義 q ∈ Qn q ∈ 2Qn 状態数 |Qn| |Qn| = O(|R|) O(2 ) マッチング O(Nx|Qn|) O(N) 計算量 NFAからDFAを構築: 部分集合構成法 |R|: 正規表現の長さ |Qn|: NFAの状態数 N: テキストの長さ         Tuesday, March 27, 12
  • 30. マッチングの並列化 = 状態遷移の並列化 a b a a •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 31. マッチングの並列化 = 状態遷移の並列化 q0 a b a a •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 32. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 33. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 34. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を a b a a •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 35. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を a b a a •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 36. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a b ? a a •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 37. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a ? b 結果1 ? a ? a 結果2 •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 38. マッチングの並列化 = 状態遷移の並列化 q0 a q1 b q3 a q1 a q2 •このような状態遷移を ? a ? b 結果1 q2 ? a ? a 結果2 •のように文字単位で並列に実行したい Tuesday, March 27, 12
  • 39. 並列マッチング: 先行研究 •Lander, Fisher(1980): 「Parallel Prefix Computation」 •松崎(2011): 「正規表現マッチングの並列化とその Hadoopでの評価」 •DFAベース並列マッチング •O((N/P+logP)|Qd|) •NFAベース並列マッチング •O((N/P+logP)|Qn|3 ) |Qn|, |Qd|: NFA,DFAの状態数 N: テキストの長さ P: 並列度 Tuesday, March 27, 12
  • 40. マッチングを並列化するには? •状態遷移は常に「直前の状態」に依存しており, 単純に並列化できない. Tuesday, March 27, 12
  • 41. マッチングを並列化するには? •状態遷移は常に「直前の状態」に依存しており, 単純に並列化できない. 「各状態を初期状態とした全パターン」について  状態遷移を計算. 結果を最後にまとめる. Tuesday, March 27, 12
  • 42. 並列マッチングの例 a /[ab]*a[ab]/ abaa q2 DFA a b b q1 q3 b a a b q0 Tuesday, March 27, 12
  • 43. 並列マッチングの例 a /[ab]*a[ab]/ q2 DFA a b b a b q1 q3 b a a b q0 a a Tuesday, March 27, 12
  • 44. 並列マッチングの例 a /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3 Tuesday, March 27, 12
  • 45. 並列マッチングの例 初期状態 a /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3 Tuesday, March 27, 12
  • 46. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 a b q1 q3 b a a q1 q1 b q0 q2 q2 q3 q3 q0 q0 q1 q1 a a q2 q2 q3 q3 Tuesday, March 27, 12
  • 47. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q1 q3 b a a q1 q1 q1 q2 b q0 q2 q2 q2 q2 q3 q3 q3 q1 q0 q0 q0 q1 q1 q1 a q1 q2 a q2 q2 q2 q2 q3 q3 q3 q1 Tuesday, March 27, 12
  • 48. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2 Tuesday, March 27, 12
  • 49. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2 Tuesday, March 27, 12
  • 50. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 q0 q0 q0 q1 q0 q2 q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 q3 q3 q3 q1 q3 q2 Tuesday, March 27, 12
  • 51. 並列マッチングの例 初期状態 a 遷移状態 /[ab]*a[ab]/ q2 DFA a b b q0 q0 q0 q1 a b q0 q3 q1 q3 b a a q1 q1 q1 q2 b q1 q3 q0 q2 q2 q2 q2 q2 q3 q3 q3 q3 q1 q3 q3 結果からq0 → q3 → q2 q0 q0 q0 q1 q0 q2 と遷移することが解る. q1 q1 a q1 q2 a q1 q2 q2 q2 q2 q2 q2 q2 abaaは「マッチする」 q3 q3 q3 q1 q3 q2 並列実行ができた! Tuesday, March 27, 12
  • 52. SFA - 同時状態FA 提案手法1 •全状態を初期状態とした遷移を同時に行う. •初期状態から遷移状態の写像を状態として扱う. •部分集合構成法の自然な拡張で構築できる. Tuesday, March 27, 12
  • 53. SFA - 同時状態FA 提案手法1 •全状態を初期状態とした遷移を同時に行う. •初期状態から遷移状態の写像を状態として扱う. •部分集合構成法の自然な拡張で構築できる. オートマトンの自然な拡張 並列実行のための提案モデル 同時状態FA SFA (Simultaneous FA) Tuesday, March 27, 12
  • 54. DFAからSFAの構築 a q2 /[ab]*a[ab]/ DFA a b b q1 q3 b a a b q0 Tuesday, March 27, 12
  • 55. DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 b q0 Tuesday, March 27, 12
  • 56. DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a q0 b q0 q1 q1 q2 q2 q2 q3 q1 Tuesday, March 27, 12
  • 57. DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 Tuesday, March 27, 12
  • 58. DFAからSFAの構築 a q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba b Tuesday, March 27, 12
  • 59. DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba b Tuesday, March 27, 12
  • 60. DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba b Tuesday, March 27, 12
  • 61. DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q’2 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 q3 q1 q3 q0 a ba b Tuesday, March 27, 12
  • 62. DFAからSFAの構築 a q’0 q2 q0 q0 /[ab]*a[ab]/ q1 q1 DFA a b q2 q2 b q1 q3 q3 b a a q3 a b q0 b q’1 q0 q1 q’2 q0 q0 q1 q2 q1 q3 q2 q2 q2 q3 対応構成法 q3 q1 q3 q0 写像の遷移から a ba b 状態の遷移に変換! Tuesday, March 27, 12
  • 63. DFAからSFAの構築 (cont) a /[ab]*a[ab]/ q2 DFA a b b q1 q3 b a a b q0 Tuesday, March 27, 12
  • 64. DFAからSFAの構築 (cont) a /[ab]*a[ab]/ 対応構成法 q2 DFA a b b q1 q3 b a a b a q0 b b q2 b q0 q6 a b a q1 b b q4 q5 SSFA a a b a a q3 Tuesday, March 27, 12
  • 65. NFA・DFA・SFAの性質 SFA SFA NFA DFA from DFA from NFA 状態の定義 q ∈ Qn q ∈2 Qn q ∈ (Qd→Qd) q ∈ (Qn→2 ) Qn 2 状態数 |Qn| |Qd| |Qn| |Qn| = O(|R|) |Qd| = O(2 ) O(|Qd| ) O(2 ) マッチング O(N/P+P) O(N/P+P|Qn|) O(Nx|Qn|) O(N) 計算量 O(N/P+|Qd|logP) O(N/P+|Qn|3logP) |R|: 正規表現の長さ |Qn|: NFAの状態数      N: テキストの長さ |Qd|: DFAの状態数      P: 並列度 A→B : AからBへの写像全体の集合 2 A : Aの冪集合 Tuesday, March 27, 12
  • 66. SSFA - 効率の良い並列マッチング •SFAの状態遷移は決定的 → DFAと同等 •SFAは受理判定が特殊(並列実行結果のreduce) •マッチングの計算量(N: テキスト長) •DFA : O(N) •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP) Tuesday, March 27, 12
  • 67. SSFA - 効率の良い並列マッチング •SFAの状態遷移は決定的 → DFAと同等 •SFAは受理判定が特殊(並列実行結果のreduce) •マッチングの計算量(N: テキスト長) •DFA : O(N) •SFA(from DFA): O(N/P+P) or O(N/P+|Qd|logP) N = P の時 O(P) or O(|Qd|logP) N >> P の時 O(N/P) Tuesday, March 27, 12
  • 68. 提案手法2 実行時コード生成 Tuesday, March 27, 12
  • 69. 既存のマッチング実装(DFA) •状態遷移のコードは完全に静的な記述. •状態遷移に必要な二次元配列は動的に構築. Tuesday, March 27, 12
  • 70. コード生成を用いたマッチング実装(DFA) q0: if (str == end) return 0; //状態番号 if (*str++ - ’A’ < ’B’ - ’A’ + 1) goto q1; else goto reject; q1: if (str == end) return 1; static const void*q1_table[256] = { [0 ... 255] = &reject; [‘A’ ... ‘B’] = &q1; [‘C’] = &q2; }; [A-B] goto *q1_table[*str++]; q2: if (str == end) return 2; [A-B] C goto reject; q0 q1 q2 reject: return -1; *説明のためC言語で記述.(実際はX86ネイティブコード) •状態遷移はコード間のジャンプ命令→ PCが状態! •受理判定は生成コード呼び出し側で行う. Tuesday, March 27, 12
  • 71. 生成コード(DFA) エントリー (レジスタ調整,初期状態へジャンプ) 状態コード詳細 (24 Byte) 状態0のコード 状態1のコード 状態遷移テーブル •コード生成は JIT ライブラリ Χbyak を使用. •Χbyak: サイボウズ・ラボ 光成氏が開発. Tuesday, March 27, 12
  • 72. コード生成の利点 •状態ごとに異なるアドレスのコードを実行. •命令/データキャッシュを有効に使える. •正規表現に最適化されたコードを生成可能. Tuesday, March 27, 12
  • 73. 遷移規則に依るコード生成の最適化 通常はテーブルルックアップ [A-B] C q0 q1 q0: if (str == end) return 0; static const void*q0_table[256] = { [0 ... 255] = &reject; [‘A’ ... ‘B’] = &q0; [‘C’] = &q1; }; goto *q0_table[*str++]; q1: if (str == end) return 1; else goto reject; Tuesday, March 27, 12
  • 74. 遷移規則に依るコード生成の最適化 cont 1つの条件分岐で住む場合 単純比較 q0: if (str == end) goto reject; if (*str++ == ‘A’) goto q1; else goto reject; A q0 q1 q1: if (str == end) goto 1; else goto reject; 範囲比較 q0: if (str == end) goto reject; if (*str++ - ’A’ < ’Z’ - ’A’ + 1) goto q1; else goto reject; [A-Z] q1: if (str == end) goto 1; q0 q1 else goto reject; Tuesday, March 27, 12
  • 75. 遷移規則に依るコード生成の最適化 cont’ •遷移先を1つの分岐命令で判定 •メモリ(テーブル)アクセスが不要 •分岐予測が効く!!! •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化) Tuesday, March 27, 12
  • 76. 遷移規則に依るコード生成の最適化 cont’ •遷移先を1つの分岐命令で判定 •メモリ(テーブル)アクセスが不要 •分岐予測が効く!!! •単純比較, 範囲比較以外にも考えられる?(要はswitch最適化) 分岐先が限定されるので, コードの展開も可能. 固定/範囲文字が連続してるほど最適化しやすい. ex: http://[a-z]{4}.com Tuesday, March 27, 12
  • 78. ベンチマーク条件 マシン •CPU: Intel Core I7 X980 •3.33GHz, SpeedStep/TurboBoost はOFF •6物理コア, 12スレッド •Memory: 24GB DDR-SDRAM3 内容 •マッチングは完全一致での判定 •入力文字列はプロセス内でメモリ上に生成 •比較として Google RE2 (DFAベース実装) Tuesday, March 27, 12
  • 79. ベンチマーク: コード生成マッチング Google RE2 コード生成無し DFA コード生成有り DFA 3GB/sec 2.5GB/sec Fast Throughput 2GB/sec 1.5GB/sec 1GB/sec 0.5GB/sec Slow 0GB/sec 最適化が効かないパターン 最適化が効くパターン /(([02468][13579]){5})*/ /(0123456789)*/ •コード生成で正規表現に依らず3倍の高速化. •最適化が効く正規表現の場合は更に高速に. Tuesday, March 27, 12
  • 80. ベンチマーク: コンパイル時間 DFAの状態数 128 256 512 1024 2048 状態の計算時間 0.05s 0.122s 0.289s 0.676s 1.568s 状態の計算&  0.05s 0.116s 0.290s 0.683s 1.583s コード生成時間 •1500状態程度のDFAは1秒程度で構築&コード生成 •コード生成時間は無視できるほど小さい •*コード生成は状態数の線形オーダーで可能 Tuesday, March 27, 12
  • 81. ベンチマーク: 並列マッチング /([0-4]{5}[5-9]{5})*/, Input: 1GB [GB/sec] 6 Physical Cores 12 Virtual Cores 20 Fast 16.667 13.333 Throughput 10 6.667 3.333 Slow 0 1 2 3 4 5 6 7 8 9 10 11 12 Number of Threads コード生成無しSSFA コード生成有りSSFA 読み込みだけの指標プログラム •DFAの状態数は10, SFAの状態数は109. •コード生成版は物理コア数の台数効果(資源限界) Tuesday, March 27, 12
  • 82. ベンチマーク:Matching micro-benchmark Parallel 並列化のオーバーヘッド Pattern: /(([02468][13579]){5})*/, Input: 100KB~1000KB Slow 2.40 msec 8,000K 7,200K Clock Cycle 1.92 msec 6,400K 5,600K 1.44 msec 4,800K 4,000K 0.96 msec 3,200K Fast 2,400K 1,600K 0.48 msec 800K 0K 100 200 300 400 500 600 700 800 900 1000 [KB] Input size コード生成無し Non-thread コード生成無し 2-thread コード生成有り Non-thread コード生成有り 2-thread •コード生成無し/有りで300KB/800KB程度で並列 マッチングが安定して上回る. Tuesday, March 27, 12
  • 83. まとめ •効率の良い並列マッチングをオートマトンの自然 な拡張によって実現した. → SFA •マッチングにコード生成を用いることで3倍以上 の高速化. •実装は公開 → http://github.com/sinya8282/regen Tuesday, March 27, 12
  • 84. 課題 •「正規表現マッチング」の枠組みで高速化はもう やりきった? •高速な正規表現エンジンが活きるアプリケーショ ン/システムを考えていきたい. •SFAの状態数について分かっていない問題がいく つか.... Tuesday, March 27, 12