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