42
世界最速の正規表現 JITエンジンの実装 Ryoma Sin’ya (@sinya8282) サイボウズ・ラボユース最終成果報告会 2012/3/26 at 秋葉原ダイビル Monday, March 26, 12

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

Embed Size (px)

DESCRIPTION

3/26(月)サイボウズ・ラボユース 最終成果報告会での資料です。 http://atnd.org/events/26861 実装詳細 → http://www.slideshare.net/sinya8282/ss-12170832

Citation preview

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

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

Ryoma Sin’ya (@sinya8282)

サイボウズ・ラボユース最終成果報告会2012/3/26 at 秋葉原ダイビル

Monday, March 26, 12

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

皆さん正規表現はお好きですか?

Monday, March 26, 12

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

僕は正規表現が好きじゃありません

Monday, March 26, 12

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

僕は正規表現が好きじゃありません

愛してます

Monday, March 26, 12

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

•新屋 良磨 (@sinya8282)

•東京工業大学修士一年•一期生では最年長

•精神は林君が最年長説

•好きな表現は正規表現•好きな言語は正規言語•好きな曲は

% whoami

Monday, March 26, 12

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

•新屋 良磨 (@sinya8282)

•東京工業大学修士一年•一期生では最年長

•精神は林君が最年長説

•好きな表現は正規表現•好きな言語は正規言語•好きな曲は

% whoami

• Regular Expression (by Broken Drum)

Monday, March 26, 12

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

サイボウズ・ラボユースではなにを?

•正規表現エンジンの実装, 高速化• DFAをJITして高速化 (実行時コード生成)

•オートマトンのデータ並列実行による高速化•正規表現を利用したツール/システムの開発

•テキスト検索(grep)

•正規表現変換ツール•正規表現の拡張演算子等

•エンジンはgithubで公開 → Regen(レーゲン)

Monday, March 26, 12

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

•正規表現の歴史は古い。種類(亜種)も多い

•実装も多い(本当に多い)

• 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

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

•正規表現の歴史は古い。種類(亜種)も多い

•実装も多い(本当に多い)

• 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

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

なにが最速?•「正規表現マッチング」が最速•「DFAの状態遷移」が最速 (Not文字列探索)

• DFAをJITすることで状態遷移を高速化•データ並列マッチングをサポート

•なにと比較して?• Google RE2, GNU grep, cgrep 等のDFAベースエンジンと比較して高速(RE2の6~10倍)

Monday, March 26, 12

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

なにが最速?•「正規表現マッチング」が最速•「DFAの状態遷移」が最速 (Not文字列探索)

• DFAをJITすることで状態遷移を高速化•データ並列マッチングをサポート

•なにと比較して?• Google RE2, GNU grep, cgrep 等のDFAベースエンジンと比較して高速(RE2の6~10倍)

詳細はポスターにも!!

Monday, March 26, 12

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

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

我々は並列化と実行時コード生成を用いた高速な正規表現エンジン 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

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

実装の詳細は色々なとこで•「並列化と実行時コード生成を用いた正規表現マッチングの高速化」• 日本ソフトウェア科学会第28回大会 (書き直し中)

• 第53回プログラミング・シンポジウム - 予稿, ポスター

•「正規表現とJITと並列化とベンチマーク」• x86/x64最適化勉強会1 - スライド

•「正規表現の限界」• Shibuya.pm ~夏の正規表現祭り~ - スライド

Monday, March 26, 12

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

実装の詳細は色々なとこで•「並列化と実行時コード生成を用いた正規表現マッチングの高速化」• 日本ソフトウェア科学会第28回大会 (書き直し中)

• 第53回プログラミング・シンポジウム - 予稿, ポスター

•「正規表現とJITと並列化とベンチマーク」• x86/x64最適化勉強会1 - スライド

•「正規表現の限界」• Shibuya.pm ~夏の正規表現祭り~ - スライド

じゃあ今日はなにを喋る?Monday, March 26, 12

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

オリジナルな成果• DFA-JITによる正規表現マッチングの高速化

• JIT特有の最適化等•データ並列マッチングによる高速化

•オートマトンを拡張

•正規表現の拡張演算の提案/実装•弱後方参照, 上限付き再帰, 非強欲繰り返し(DFAver)

Monday, March 26, 12

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

オリジナルな成果• DFA-JITによる正規表現マッチングの高速化

• JIT特有の最適化等•データ並列マッチングによる高速化

•オートマトンを拡張

•正規表現の拡張演算の提案/実装•弱後方参照, 上限付き再帰, 非強欲繰り返し(DFAver)

全部喋りたい...Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

上京。この時、正規表現(DFA)をJIT

する方法で悩んでいた。(自前, gcc, asm, llvm, libjit, gnu lightning...)

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

ラボユース採択(神タイミング)。

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

C++製JITライブラリXbyakで正規表現JIT。動いた。

・X86最適化の権化、光成さんの 熱血指導の賜物?

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

C++製JITライブラリXbyakで正規表現JIT。動いた。

・X86最適化の権化、光成さんの 熱血指導の賜物?

DFA-JIT

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

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

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

C++製JITライブラリXbyakで正規表現JIT。動いた。

・X86最適化の権化、光成さんの 熱血指導の賜物?

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

正規表現のデータ並列マッチングを実装。(オートマトンを拡張)

・巨大なテキストの全体マッチング では台数効果が見込める。    (詳細はポスターで)

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

正規表現のデータ並列マッチングを実装。(オートマトンを拡張)

・巨大なテキストの全体マッチング では台数効果が見込める。    (詳細はポスターで)

データ並列マッチング

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

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

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

正規表現のデータ並列マッチングを実装。(オートマトンを拡張)

・巨大なテキストの全体マッチング では台数効果が見込める。    (詳細はポスターで)

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

最適化、議論、実装、イベント、論文、学会....。

・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん)

・x86/x64最適化勉強会1 (thanks! 光成さん)

・日本ソフトウェア科学会第28会大会@沖縄

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

最適化、議論、実装、イベント、論文、学会....。

・Shibuya.pm「夏の正規表現祭り」(thanks! 竹迫さん)

・x86/x64最適化勉強会1 (thanks! 光成さん)

・日本ソフトウェア科学会第28会大会@沖縄

・夏休み(学生)ということで、週3で サイボウズ・ラボに出勤。開発。・ラボメンバーさんとの議論が楽しい!!!

・最適化/並列化/新機能等々,,, 色々捗る。

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

ひたすら正規表現と戯れる。

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

ひたすら正規表現と戯れる。

・正規表現の新しい演算を考える等(ポスター)

Monday, March 26, 12

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

正規表現エンジン開発過程を時系列で

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

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

正規表現エンジン開発過程を時系列で

2011年3月 124 5 6 7 8 9 10 11

ひたすら正規表現と戯れる。

・正規表現の新しい演算を考える等(ポスター)

Monday, March 26, 12

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

2012年1月 2 3

Monday, March 26, 12

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

2012年1月 2 3

ポスター発表。・第53回プログラミング・シンポジウム 「並列化と実行時コード生成を用いた  正規表現マッチングの高速化」 → 入り口にあるポスターです。

Monday, March 26, 12

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

2012年1月 2 3

grepの実装。・grep高速化のための機能追加・固定文字列探索の高速化等(未完成)

・ライブラリAPIを整理し始める(ようやく)

Monday, March 26, 12

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

2012年1月 2 3

なう。

Monday, March 26, 12

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

2012年1月 2 3

正規表現エンジンRegen

githubで開発中!!http://github.com/sinya8282/regen

Monday, March 26, 12

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

2012年1月 2 3

そして伝説へ....

正規表現エンジンRegen

githubで開発中!!http://github.com/sinya8282/regen

Monday, March 26, 12

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

サイボウズ・ラボユースではなにを?(再)

•正規表現エンジンの実装, 高速化•「最速の車輪を。」→ Regen

•正規表現を利用したツール/システムの開発

Monday, March 26, 12

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

サイボウズ・ラボユースではなにを?(再)

•正規表現エンジンの実装, 高速化•「最速の車輪を。」→ Regen

•正規表現を利用したツール/システムの開発

そしてこれからは?•欠点も多い(実装で克服できる?)

•メモリ使用量, 制限(キャプチャ,,,), 苦手な正規表現,,,

•ライブラリを完成させにゃ... (目標: Google RE2)

•「文字列探索」以外にも正規表現を。(試行錯誤中)Monday, March 26, 12