Más contenido relacionado La actualidad más candente (20) Similar a 世界最速の正規表現JITエンジンの実装 (20) 世界最速の正規表現JITエンジンの実装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’ya
Monday, 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 6
gen 0.449 0.897 1.327 1.759 2.236 2.681
Monday, March 26, 12
gen JIT 2.321 4.550 6.917 9.167 11.27
Text 13.59
ad 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 12
Monday, March 26, 12
19. 上京。
正規表現エンジン
この時、正規表現(DFA)をJIT
開発過程を時系列で
する方法で悩んでいた。
(自前, gcc, asm, llvm, libjit, gnu lightning...)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
20. ラボユース採択(神タイミング)。
正規表現エンジン
開発過程を時系列で
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
21. C++製JITライブラリXbyakで
正規表現エンジン
正規表現JIT。動いた。
開発過程を時系列で
・X86最適化の権化、光成さんの
熱血指導の賜物?
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
22. DFA-JIT
C++製JITライブラリXbyakで
正規表現エンジン
正規表現JIT。動いた。
開発過程を時系列で
・X86最適化の権化、光成さんの
熱血指導の賜物?
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, 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 11
Monday, March 26, 12
24. C++製JITライブラリXbyakで
正規表現エンジン
正規表現JIT。動いた。
開発過程を時系列で
・X86最適化の権化、光成さんの
熱血指導の賜物?
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
25. 正規表現のデータ並列マッチン
正規表現エンジン
グを実装。(オートマトンを拡張)
開発過程を時系列で
・巨大なテキストの全体マッチング
では台数効果が見込める。
(詳細はポスターで)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
26. データ並列マッチング
正規表現のデータ並列マッチン
正規表現エンジン
グを実装。(オートマトンを拡張)
開発過程を時系列で
・巨大なテキストの全体マッチング
では台数効果が見込める。
(詳細はポスターで)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, 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 12
Monday, March 26, 12
28. 正規表現のデータ並列マッチン
正規表現エンジン
グを実装。(オートマトンを拡張)
開発過程を時系列で
・巨大なテキストの全体マッチング
では台数効果が見込める。
(詳細はポスターで)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
29. 最適化、議論、実装、
正規表現エンジン
イベント、論文、学会....。
開発過程を時系列で
・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん)
・x86/x64最適化勉強会1 (thanks! 光成さん)
・日本ソフトウェア科学会第28会大会@沖縄
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
30. 最適化、議論、実装、
正規表現エンジン
イベント、論文、学会....。
・夏休み(学生)ということで、週3で
開発過程を時系列で
・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん)
サイボウズ・ラボに出勤。開発。
・x86/x64最適化勉強会1 (thanks! 光成さん)
・ラボメンバーさんとの議論が楽しい!!!
・日本ソフトウェア科学会第28会大会@沖縄
・最適化/並列化/新機能等々,,, 色々 る。
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
31. ひたすら正規表現
正規表現エンジン
と戯れる。
開発過程を時系列で
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
32. ひたすら正規表現
正規表現エンジン
と戯れる。
開発過程を時系列で
・正規表現の新しい演算を考える等(ポスター)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, 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 12
Monday, March 26, 12
34. ひたすら正規表現
正規表現エンジン
と戯れる。
開発過程を時系列で
・正規表現の新しい演算を考える等(ポスター)
2011年
3月 4 5 6 7 8 9 10 11 12
Monday, March 26, 12
35. 2012年
1月 2 3
Monday, March 26, 12
36. ポスター発表。
・第53回プログラミング・シンポジウム
「並列化と実行時コード生成を用いた
正規表現マッチングの高速化」
→ 入り口にあるポスターです。
2012年
1月 2 3
Monday, March 26, 12
37. grepの実装。
・grep高速化のための機能追加
・固定文字列探索の高速化等(未完成)
・ライブラリAPIを整理し始める(ようやく)
2012年
1月 2 3
Monday, March 26, 12
39. 正規表現エンジン
Regen
githubで開発中!!
http://github.com/sinya8282/regen
2012年
1月 2 3
Monday, 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