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

What's hot (20)

Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
Topological sort
Topological sortTopological sort
Topological sort
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
High Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many CoreHigh Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many Core
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
 
Palindromic tree
Palindromic treePalindromic tree
Palindromic tree
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
Abc009
Abc009Abc009
Abc009
 
「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について「日本語LaTeX」が多すぎる件について
「日本語LaTeX」が多すぎる件について
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
Skip Graphをベースとした高速な挿入と検索が可能な構造化オーバレイの提案
Skip Graphをベースとした高速な挿入と検索が可能な構造化オーバレイの提案Skip Graphをベースとした高速な挿入と検索が可能な構造化オーバレイの提案
Skip Graphをベースとした高速な挿入と検索が可能な構造化オーバレイの提案
 

More from 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

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Recently uploaded (16)

20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
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 )
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
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の勉強会で発表されたものです。
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介: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
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 

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

  • 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