世界最速の正規表現JITエンジンの実装

  • 10,853 views
Uploaded on

3/26(月)サイボウズ・ラボユース 最終成果報告会での資料です。 …

3/26(月)サイボウズ・ラボユース 最終成果報告会での資料です。
http://atnd.org/events/26861

実装詳細 → http://www.slideshare.net/sinya8282/ss-12170832

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
10,853
On Slideshare
0
From Embeds
0
Number of Embeds
11

Actions

Shares
Downloads
27
Comments
0
Likes
12

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 世界最速の正規表現 JITエンジンの実装 Ryoma Sin’ya (@sinya8282) サイボウズ・ラボユース最終成果報告会 2012/3/26 at 秋葉原ダイビルMonday, March 26, 12
  • 2. 皆さん 正規表現は お好きですか?Monday, March 26, 12
  • 3. 僕は正規表現が 好きじゃありませんMonday, March 26, 12
  • 4. 僕は正規表現が 好きじゃありません 愛してますMonday, March 26, 12
  • 5. % whoami • 新屋 良磨 (@sinya8282) • 東京工業大学修士一年 • 一期生では最年長 • 精神は林君が最年長説 • 好きな表現は正規表現 • 好きな言語は正規言語 • 好きな曲はMonday, March 26, 12
  • 6. % whoami • 新屋 良磨 (@sinya8282) • 東京工業大学修士一年 • 一期生では最年長 • 精神は林君が最年長説 • 好きな表現は正規表現 • 好きな言語は正規言語 • 好きな曲は • Regular Expression (by Broken Drum)Monday, March 26, 12
  • 7. サイボウズ・ラボユース ではなにを? • 正規表現エンジンの実装, 高速化 • DFAをJITして高速化 (実行時コード生成) • オートマトンのデータ並列実行による高速化 • 正規表現を利用したツール/システムの開発 • テキスト検索(grep) • 正規表現変換ツール • 正規表現の拡張演算子等 • エンジンはgithubで公開 → Regen(レーゲン)Monday, March 26, 12
  • 8. なぜ正規表現エンジン? • 正規表現の歴史は古い。種類(亜種)も多い I define UNIX as “30 definitions of regular expressions living under one roof.” — Don Knuth • 実装も多い(本当に多い) • GNU grep, Google RE2, 鬼車, PCRE, TRE,,,, • 車輪の再発明?Monday, March 26, 12
  • 9. なぜ正規表現エンジン? • 正規表現の歴史は古い。種類(亜種)も多い I define UNIX as “30 definitions of regular expressions living under one roof.” — Don Knuth • 実装も多い(本当に多い) • GNU grep, Google RE2, 鬼車, PCRE, TRE,,,, • 車輪の再発明? そうだね。ただし最速の車輪だ。— Ryoma Sin’yaMonday, March 26, 12
  • 10. なにが最速? • 「正規表現マッチング」が最速 • 「DFAの状態遷移」が最速 (Not文字列探索) • DFAをJITすることで状態遷移を高速化 • データ並列マッチングをサポート • なにと比較して? • GoogleRE2, GNU grep, cgrep 等のDFAベースエン ジンと比較して高速(RE2の6~10倍)Monday, March 26, 12
  • 11. なにが最速? • 「正規表現マッチング」が最速 • 「DFAの状態遷移」が最速 (Not文字列探索) • DFAをJITすることで状態遷移を高速化 • データ並列マッチングをサポート • なにと比較して? • GoogleRE2, GNU grep, cgrep 等のDFAベースエン ジンと比較して高速(RE2の6~10倍) 詳細はポスターにも!!Monday, March 26, 12
  • 12. 並列化と実行時コード生成を用いた 正規表現エンジン「Regen」 : 正規表現マッチングの高速化 &そのツール群の紹介 新屋 良磨 † 光成 滋生 †† 佐々 政孝 † Regen でサポートしてる正規表現の拡張演算子, 及びツール群を紹介する. † 東京工業大学 †† サイボウズ・ラボ株式会社 課題や機能についてなど, 多くの意見が聞きたい. 我々は並列化と実行時コード生成を用いた高速な正規表現エンジン Regen を開発した. 拡張演算子 Regen における設計方針や特長を紹介し, 既存実装との違いを説明する. ✦ 積集合 ✦ 弱後方参照 Regenのマッチング内部動作 • /R1 &R2 /→ R1とR2両方にマッチ •PCRE等で使える後方参照の制限版 ✦ 対称差 •有限パターンの参照なら区別できる. •/R1&&R2/→R1かR 一方のみにマッチ •/(1|2|30?) = (1)/ → 恒等式 [01] 1 0 1 NFA DFA •無限パターン(繰り返し)は区別しない. 2 1 変換 1 ✦ 補集合 •/!(R1)/→R1 にマッチしない列にマッチ •/(1|2+) = (1)/ →/1 = 1|2+ = 2 + / q0 q1 q0 q1 0 0 パース&変換 JIT (Χbyak) 正規表現 変換 変換 ✦ 逆順 ✦ 上限付き再帰 /(0 ⇤ 1) + / 0 •/ ⇠ (R1)/→R1のマッチ文字列の逆文字列 •PCRE等で使える再帰(?R)の制限版 •/a@b@c/→“aabcbabcc” 1 文字列に対して ✦ 置換, シャッフル, 非強欲な繰り返し... •紹介してる演算全てDFAで実現 •/(@{0, 2})/→ “()”, “(())”, “((()))” q1 1 0 0 q2 JIT マッチング開始 1 (Χbyak) 入力: 正規表現&文字列 q0 SSFA (並列実行可能なDFA) 正規表現から受理文字列出力 正規表現からDFA(図)出力 1 Regen内部のコード生成(JIT)部抜粋 コード生成(JIT)による性能向上 Example: 論理式を充足する解を全列挙 q7 0 2 Google RE2 Regen Regen JIT (x1 _ x2 _ x3 ) ^ (x1 _ x2 _ x3 ) 1 3 q9 0 q12 q4 3GB/sec 3 Fast 2 2 Throughput 2.5GB/sec 2 3 2GB/sec 3 q10 0 q13 1 1.5GB/sec 0 q1 1 3 q15 0 1GB/sec q0 1 0 q5 1 Slow q2 q14 0.5GB/sec 2 3 正規表現で 2 2 3 0GB/sec 3 最適化が効かないパターン 最適化が効くパターン SATを解く! q6 C++ JIT Library /(([02468][13579]){5})*/ /(0123456789)*/ q3 2 q11 1 Χbyak 0 q8 0 並列マッチングによる性能向上 並列化のオーバーヘッド 1 正規表現: /([0-4]{5}[5-9]{5})*/, 入力: 1GB 正規表現: /(([02468][13579]){5})*/, 入力: 100KB~1000KB 実装済みツール群 今後の課題 [GB/sec] ✦ 正規表現Lib: Regen ✦ 他アーキテクチャ対応 • • 今はX86-64のみ(Χbyak) 20 Slow ベンチマークA ベンチマークB 2.40 msec 8,000K Google RE2 を参考 • • LLVM? (抽象化で性能落ちない?) Fast Google RE2 0.263 0.264 17.5 7,200K Clock Cycle Submatch 未対応 Regen O0 0.449 0.448 1.92 msec Throughput 15 6,400K Regen O3 1.521 2.761 5,600K ✦ 正規表現変換系: recon ✦ Submatch(キャプチャ)の対応 • • 現在でもマッチした文字列全体の取得は可能. 12.5 1.44 msec 4,800K 10 正規表現 to 正規表現 • • マッチした文字列の部分的な取得は未対応 4,000K 0.96 msec Fast 正規表現 to DFA(図) 7.5 3,200K • 2,400K 正規表現 to 受理文字列 ✦ 性能を生かしたツール/システムの考案 5 0.48 msec 1,600K 2.5 Slow 800K grep: regengrep ✦ • 0 0K [KB] JIT版は高速. 100 200 300 400 500 600 700 800 900 1000 1 2 3 4 5 6 • Input size Number of Threads Regen Regen JIT Read only 1スレッド 1スレッドJIT 2スレッド 2スレッドJIT まだ開発中(速度,機能) Thursday, January 5, 12 Thursday, January 5, 12 1 2 3 4 5 6gen 0.449 0.897 1.327 1.759 2.236 2.681 Monday, March 26, 12gen JIT 2.321 4.550 6.917 9.167 11.27 Text 13.59ad 6.041 12.11 16.60 18.37 18.89 19.17
  • 13. 実装の詳細は色々なとこで • 「並列化と実行時コード生成を用いた正規表現 マッチングの高速化」 • 日本ソフトウェア科学会第28回大会 (書き直し中) • 第53回プログラミング・シンポジウム - 予稿, ポスター • 「正規表現とJITと並列化とベンチマーク」 • x86/x64最適化勉強会1 - スライド • 「正規表現の限界」 • Shibuya.pm ~夏の正規表現祭り~ - スライドMonday, March 26, 12
  • 14. 実装の詳細は色々なとこで • 「並列化と実行時コード生成を用いた正規表現 マッチングの高速化」 • 日本ソフトウェア科学会第28回大会 (書き直し中) • 第53回プログラミング・シンポジウム - 予稿, ポスター • 「正規表現とJITと並列化とベンチマーク」 • x86/x64最適化勉強会1 - スライド • 「正規表現の限界」 • Shibuya.pm ~夏の正規表現祭り~ - スライド じゃあ今日はなにを喋る?Monday, March 26, 12
  • 15. オリジナルな成果 • DFA-JITによる正規表現マッチングの高速化 • JIT特有の最適化等 • データ並列マッチングによる高速化 • オートマトンを拡張 • 正規表現の拡張演算の提案/実装 • 弱後方参照, 上限付き再帰, 非強欲繰り返し(DFAver)Monday, March 26, 12
  • 16. オリジナルな成果 • DFA-JITによる正規表現マッチングの高速化 • JIT特有の最適化等 • データ並列マッチングによる高速化 • オートマトンを拡張 • 正規表現の拡張演算の提案/実装 • 弱後方参照, 上限付き再帰, 非強欲繰り返し(DFAver) 全部喋りたい...Monday, March 26, 12
  • 17. 正規表現エンジン 開発過程を時系列でMonday, March 26, 12
  • 18. 正規表現エンジン 開発過程を時系列で 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 19. 上京。 正規表現エンジン この時、正規表現(DFA)をJIT 開発過程を時系列で する方法で悩んでいた。 (自前, gcc, asm, llvm, libjit, gnu lightning...) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 20. ラボユース採択(神タイミング)。 正規表現エンジン 開発過程を時系列で 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 21. C++製JITライブラリXbyakで 正規表現エンジン 正規表現JIT。動いた。 開発過程を時系列で ・X86最適化の権化、光成さんの  熱血指導の賜物? 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 22. DFA-JIT C++製JITライブラリXbyakで 正規表現エンジン 正規表現JIT。動いた。 開発過程を時系列で ・X86最適化の権化、光成さんの  熱血指導の賜物? 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 23. DFA-JIT エントリー (レジスタ調整,初期状態へジャンプ) 状態コード詳細 (24 Byte) C++製JITライブラリXbyakで 状態0のコー 正規表現エンジン 正規表現JIT。動いた。 状態1のコー cmp rdi,rsi #終端判定 je 0x120005030 開発過程を時系列で movzx r10,BYTE PTR [rdi] ・X86最適化の権化、光成さんの inc rdi 状態遷移テーブル  熱血指導の賜物?jmp QWORD PTR [rdx +r10*8] •コード生成は JIT ライブラリ Χbyak を使用. 2011年 3月 •4 5 サイボウズ・ラボ 光成氏が開発.12 Χbyak: 6 7 8 9 10 11Monday, March 26, 12
  • 24. C++製JITライブラリXbyakで 正規表現エンジン 正規表現JIT。動いた。 開発過程を時系列で ・X86最適化の権化、光成さんの  熱血指導の賜物? 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 25. 正規表現のデータ並列マッチン 正規表現エンジン グを実装。(オートマトンを拡張) 開発過程を時系列で ・巨大なテキストの全体マッチング  では台数効果が見込める。     (詳細はポスターで) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 26. データ並列マッチング 正規表現のデータ並列マッチン 正規表現エンジン グを実装。(オートマトンを拡張) 開発過程を時系列で ・巨大なテキストの全体マッチング  では台数効果が見込める。     (詳細はポスターで) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 27. データ並列マッチング マッチングの並列化 = 状態遷移の並列化 a q1 b q3 a q1 a q2 正規表現のデータ並列マッチン q0 正規表現エンジン グを実装。(オートマトンを拡張) •このような状態遷移を 開発過程を時系列で ・巨大なテキストの全体マッチング a a ? b 結果1 a  では台数効果が見込める。 ?     (詳細はポスターで) q2 ? ? 結果2 2011年 •のように文字単位で並列に実行 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 28. 正規表現のデータ並列マッチン 正規表現エンジン グを実装。(オートマトンを拡張) 開発過程を時系列で ・巨大なテキストの全体マッチング  では台数効果が見込める。     (詳細はポスターで) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 29. 最適化、議論、実装、 正規表現エンジン イベント、論文、学会....。 開発過程を時系列で ・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん) ・x86/x64最適化勉強会1 (thanks! 光成さん) ・日本ソフトウェア科学会第28会大会@沖縄 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 30. 最適化、議論、実装、 正規表現エンジン イベント、論文、学会....。 ・夏休み(学生)ということで、週3で 開発過程を時系列で ・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん)  サイボウズ・ラボに出勤。開発。 ・x86/x64最適化勉強会1 (thanks! 光成さん) ・ラボメンバーさんとの議論が楽しい!!! ・日本ソフトウェア科学会第28会大会@沖縄 ・最適化/並列化/新機能等々,,, 色々 る。 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 31. ひたすら正規表現 正規表現エンジン と戯れる。 開発過程を時系列で 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 32. ひたすら正規表現 正規表現エンジン と戯れる。 開発過程を時系列で ・正規表現の新しい演算を考える等(ポスター) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 33. ✦ 弱後方参照 •有限パターンの参照なら区別できる. ひたすら正規表現 •/(1|2|30?) = (1)/ → 恒等式 正規表現エンジン •無限パターン(繰り返し)は区別しない. と戯れる。 = 2 + / 開発過程を時系列で •/(1|2+) = (1)/ →/1 = 1|2+ ・正規表現の新しい演算を考える等(ポスター) ✦ 上限付き再帰 •/a@b@c/→“aabcbabcc” 2011年 •/(@{0, 2})/7→ “()”, 9 10 “((()))” 3月 4 5 6 8 “(())”, 11 12Monday, March 26, 12
  • 34. ひたすら正規表現 正規表現エンジン と戯れる。 開発過程を時系列で ・正規表現の新しい演算を考える等(ポスター) 2011年 3月 4 5 6 7 8 9 10 11 12Monday, March 26, 12
  • 35. 2012年 1月 2 3Monday, March 26, 12
  • 36. ポスター発表。 ・第53回プログラミング・シンポジウム  「並列化と実行時コード生成を用いた   正規表現マッチングの高速化」  → 入り口にあるポスターです。 2012年 1月 2 3Monday, March 26, 12
  • 37. grepの実装。 ・grep高速化のための機能追加 ・固定文字列探索の高速化等(未完成) ・ライブラリAPIを整理し始める(ようやく) 2012年 1月 2 3Monday, March 26, 12
  • 38. なう。 2012年 1月 2 3Monday, March 26, 12
  • 39. 正規表現エンジン Regen githubで開発中!! http://github.com/sinya8282/regen 2012年 1月 2 3Monday, March 26, 12
  • 40. 正規表現エンジン Regen githubで開発中!! http://github.com/sinya8282/regen 2012年 1月 2 3 そして伝説へ....Monday, March 26, 12
  • 41. サイボウズ・ラボユース ではなにを?(再) • 正規表現エンジンの実装, 高速化 Regen • 「最速の車輪を。」→ • 正規表現を利用したツール/システムの開発Monday, March 26, 12
  • 42. サイボウズ・ラボユース ではなにを?(再) • 正規表現エンジンの実装, 高速化 Regen • 「最速の車輪を。」→ • 正規表現を利用したツール/システムの開発 そしてこれからは? • 欠点も多い(実装で克服できる?) • メモリ使用量, 制限(キャプチャ,,,), 苦手な正規表現,,, • ライブラリを完成させにゃ... (目標: Google RE2) • 「文字列探索」以外にも正規表現を。(試行錯誤中)Monday, March 26, 12