6
長大な拡張文字列パターンに対する大規模文字列照合の高速化 笹川 裕人 金田 悠作 有村 博紀 北海道大学大学院情報科学研究科 060–0814 札幌市北区北 14 条西 9 丁目 E-mail: †{sasakawa,y-kaneta,arim}@ist.hokudai.ac.jp あらまし 数千個のパターンを照合する大規模並列文字列照合は,ネットワーク不正侵入検出や生物情報処理など, 広い応用分野において重要な基盤技術である.特に,ビット並列パターン照合手法,特に拡張 SHIFT-AND 手法は, 正規表現の有用な部分クラスである拡張文字列パターンに対して,高速なパターン照合を可能とし,GPU FPGA など現代的な並列ハードウェア上の高速実装にも拡張されている(笹川他, FIT2011; Kaneta , FPT2010).一方 で,計算機のレジスタ長を超えるような長大なパターンに対する効率よい実装は難しかった.本稿では,階層的なモ ジュール分割に基づいて拡張 SHIFT-AND 手法を一般化したアルゴリズムを提案する.これにより,レジスタ内並列 性とレジスタ間の計算を融合することで,長大な拡張文字列パターンに対する高速な文字列照合を実現する.提案手 法の単一 CPU 上の性能評価のために,C++言語による実装を与え,計算機実験によってその有効性を示す.また, GPU 上の並列実装についても議論する. キーワード 文字列照合,並列処理,GPGPU,拡張文字列パターン,正規表現照合 Faster Pattern Matching Algorithm for Very Long Extended Patterns with Applications to Large-scale Parallel String Matching Hirohito SASAKAWA , Yusaku KANETA , and Hiroki ARIMURA Graduate School of Information Science and Technology, Hokkaido University Kita 14, Nishi9, Kita–ku, Sapporo, Hokkaido, 060–0814 Japan E-mail: †{sasakawa,y-kaneta,arim}@ist.hokudai.ac.jp 1. はじめに 数千個のパターンを照合する大規模並列文字列照合は,生物 情報処理やネットワーク不正侵入検出,ストリーム処理など, 広い応用分野において重要な基盤技術である.特にゲノムや ネットワークの分野ではハードウェアの高性能化により,扱う データ量が急速に増大しており,データ解析の観点から照合の 更なる高速化が求められている. このため,大規模文字列照合の高速化手法が盛んに研究され ている.例えば,Lin, Tsai [3] は,Aho-Corasick 法と呼ばれ る決定性有限オートマトンを用いた照合アルゴリズムの GPU 上の実装を与えている.Wu, diao, Rizvi [5] は,複合イベン ト処理 (CEP) のための,系列イベントクエリに対する照合ア ルゴリズムを与えている.Kaneta [2] は,FPGA 上で拡張 正規表現に対する,正規表現照合アルゴリズムの実装を与えて いる. 本稿では,正規表現の有用な部分クラスである拡張文字列パ ターンに対する照合手法について考察する.拡張文字列パター ンの照合手法は,特に高速なものとして,ビット並列手法を用 いた照合手法である拡張 SHIFT-AND 法が知られている.し かし,拡張 SHIFT-AND 法には,NFA の状態数が計算機のレ ジスタ長を越えるような長いパターンに対しては,レジスタを 跨ぐビット演算処理が必要になり速度が低下するという問題点 がある. そこで本稿では,特に計算機レジスタ長を越える長いパター ンに着目し,高速な照合を行うため,NFA を階層的に分割す る方法を採用し,レジスタ間の情報を効率よく伝搬することで, 複数レジスタに渡るビット演算処理を高速に実行する方法を開 発し,これに基づいて,拡張文字列パターンに対する効率良い ビット並列パターン照合アルゴリズム RunNFA を提案する. 本方式は 2 階層の構成を用いており, NFA 状態数 < = w(w-1) を満たす拡張文字列パターンを扱える.これは,語長 32 64 (ビット)の場合に,それぞれ最大 = 992 = 4032 となり, NIDS CEP 等のイベントストリーム処理に十分な大きさを もつ. 理論的結果として,提案のアルゴリズム RunNFA は,入力テ —1—

長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

長大な拡張文字列パターンに対する大規模文字列照合の高速化笹川 裕人† 金田 悠作† 有村 博紀†

† 北海道大学大学院情報科学研究科 〒 060–0814 札幌市北区北 14条西 9丁目E-mail: †{sasakawa,y-kaneta,arim}@ist.hokudai.ac.jp

あらまし 数千個のパターンを照合する大規模並列文字列照合は,ネットワーク不正侵入検出や生物情報処理など,広い応用分野において重要な基盤技術である.特に,ビット並列パターン照合手法,特に拡張 SHIFT-AND手法は,正規表現の有用な部分クラスである拡張文字列パターンに対して,高速なパターン照合を可能とし,GPUや FPGA

など現代的な並列ハードウェア上の高速実装にも拡張されている(笹川他, FIT2011; Kaneta他, FPT2010).一方で,計算機のレジスタ長を超えるような長大なパターンに対する効率よい実装は難しかった.本稿では,階層的なモジュール分割に基づいて拡張 SHIFT-AND手法を一般化したアルゴリズムを提案する.これにより,レジスタ内並列性とレジスタ間の計算を融合することで,長大な拡張文字列パターンに対する高速な文字列照合を実現する.提案手法の単一 CPU上の性能評価のために,C++言語による実装を与え,計算機実験によってその有効性を示す.また,GPU上の並列実装についても議論する.キーワード 文字列照合,並列処理,GPGPU,拡張文字列パターン,正規表現照合

Faster Pattern Matching Algorithm for Very Long Extended Patterns

with Applications to Large-scale Parallel String Matching

Hirohito SASAKAWA†, Yusaku KANETA†, and Hiroki ARIMURA†

† Graduate School of Information Science and Technology, Hokkaido UniversityKita 14, Nishi9, Kita–ku, Sapporo, Hokkaido, 060–0814 Japan

E-mail: †{sasakawa,y-kaneta,arim}@ist.hokudai.ac.jp

1. は じ め に

数千個のパターンを照合する大規模並列文字列照合は,生物情報処理やネットワーク不正侵入検出,ストリーム処理など,広い応用分野において重要な基盤技術である.特にゲノムやネットワークの分野ではハードウェアの高性能化により,扱うデータ量が急速に増大しており,データ解析の観点から照合の更なる高速化が求められている.このため,大規模文字列照合の高速化手法が盛んに研究され

ている.例えば,Lin, Tsaiら [3]は,Aho-Corasick法と呼ばれる決定性有限オートマトンを用いた照合アルゴリズムの GPU

上の実装を与えている.Wu, diao, Rizviら [5]は,複合イベント処理 (CEP)のための,系列イベントクエリに対する照合アルゴリズムを与えている.Kanetaら [2]は,FPGA上で拡張正規表現に対する,正規表現照合アルゴリズムの実装を与えている.本稿では,正規表現の有用な部分クラスである拡張文字列パ

ターンに対する照合手法について考察する.拡張文字列パター

ンの照合手法は,特に高速なものとして,ビット並列手法を用いた照合手法である拡張 SHIFT-AND 法が知られている.しかし,拡張 SHIFT-AND法には,NFAの状態数が計算機のレジスタ長を越えるような長いパターンに対しては,レジスタを跨ぐビット演算処理が必要になり速度が低下するという問題点がある.そこで本稿では,特に計算機レジスタ長を越える長いパター

ンに着目し,高速な照合を行うため,NFA を階層的に分割する方法を採用し,レジスタ間の情報を効率よく伝搬することで,複数レジスタに渡るビット演算処理を高速に実行する方法を開発し,これに基づいて,拡張文字列パターンに対する効率良いビット並列パターン照合アルゴリズム RunNFAを提案する.本方式は 2階層の構成を用いており,NFA状態数 ` <= w(w−1)

を満たす拡張文字列パターンを扱える.これは,語長 32と 64

(ビット)の場合に,それぞれ最大 ` = 992と ` = 4032となり,NIDSや CEP等のイベントストリーム処理に十分な大きさをもつ.理論的結果として,提案のアルゴリズムRunNFAは,入力テ

— 1 —

Page 2: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

キスト T と拡張文字列パターン P に対して,前処理時間 O(`)

と領域 O(|Σ|d`/we)語を使い,計算時間 O(nd`/we)で P の T

中のすべての出現を見つける.ここに,nはテキスト長であり,` はパターン P に対応する NFA の総状態数である.さらに,本アルゴリズムは GPUなどの並列ハードウェア上でも実装可能である.この場合,前処理時間 O(`)と,一台当たり O(|Σ|)語の領域使用する O(d`/we)台のプロセッサを用いて,並列計算時間 O(n log w)で P の T 中のすべての出現を見つける.また,提案アルゴリズム RunNFAと,従来型アルゴリズム

LongNFA を CPU 上で実装し,計算機実験により,提案アルゴリズムの有効性を確認した.

2. 準 備

2. 1 拡張文字列照合問題文字集合 Σをアルファベットとする.テキストは,長さ nの

文字列 T = t1 · · · tn ∈ Σ∗ である.[定義 1] Σ 上の正規表現 P = a1 . . . am (m >= 0) が拡張文字列パターンであるとは,任意の i = 1, . . . , m に対して, ai が下記の定義の (1)-(6) のいずれかであることをいう. なおここで,≡ は構文糖衣を表し,· と,∗, | は言語の連結と,繰り返し,選言をそれぞれ表す.( 1) 定数文字 : a ∈ Σ. L(a) = a.

( 2) ワイルドカード : “.”. L(.) = Σ.

( 3) 文字種 : β = [abc · · · ]⊂=Σ. L(β) = β.

( 4) オプション文字 : β? ≡ (β|ε). L(β?) = L(β) ∪ {ε}.( 5) 限定繰り返し : β{x, y} ≡ (β?)y−xβx.

( 6) 0個以上の非限定繰り返し : β∗. L(β∗) = L(β)∗.

( 7) 1個以上の非限定繰り返し : β+ ≡ ββ∗.

ここで, 拡張文字列パターン P = a1, · · · , am のサイズを P

の中の文字と演算子の個数の総和とし,その言語を, L(P ) =

L(a1) · · ·L(am) と定義する.

[定義 2] パターン P が T の部分系列として位置 1 <= q <= n

に出現するとは,長さ 0以上の文字列 u, v, w ∈ Σ∗ が存在して,

(i) T = uvw かつ (ii) v ∈ L(a), (iii) q = |uv| + 1 となることをいう.すなわち, q は,パターン P の後端の出現位置である.

[例 1] アルファベット Σ = {A, B, C} に対して,P1 =

AB+A?B?C?CB?C?A?は拡張文字列パターンの例である.拡張文字列照合問題とは,与えられたパターンとテキストに

対し,パターンが出現するテキスト中の位置を列挙する問題である.正確には,次のように定義する.[定義 3] 拡張文字列照合問題: テキスト T と拡張文字列パターン P を入力として受け取り,P の T 中の出現位置を全て求める.

2. 2 拡張 SHIFT-AND法ビット並列手法とは,ビット演算と,数値演算レジスタ内並列

性を利用し,計算を高速化する手法である.拡張 SHIFT-AND

法は Navvaroら [4]によるビット並列手法を用いた,拡張文字列パターンに対する照合アルゴリズムである.このアルゴリズムでは,前処理時に,与えられた拡張文字列パターンに対応する非決定性有限オートマトン (NFA)を構築し,照合時に,こ

0 1 2 3 4 5 6 7 8 9A B A B C C B C A

B ε ε ε ε ε ε

Σ

図 1 例 1のパターン P1 に対応する非決定性有限オートマトン (NFA)

の NFAの遷移をビット演算と,整数の加算を用いて模倣し照合を行う.例えば,例 1のパターンに対しては,図 1のようなNFAが構築される.ここで,テキスト長を n,NFAの状態数を `とする.拡張 SHIFT-AND法は,前処理に 0(m + |Σ|)時間,照合に O(nd`/we) 時間それぞれかかり,アルゴリズム全体で (2Σ + 4)d`/weの領域を使用する.

2. 3 計算モデル計算モデルとして,レジスタ長 w の RAMモデルを用いる.

ここで,レジスタ内の AND演算 “&”,OR演算 “|”,NOT演算 “∼”,XOR演算 “⊕”,左シフト演算 “<<”,右シフト演算“<<”,整数の加減算を O(1) 時間で実行できると仮定する.ビットマスク (マスク)は,幅 w のビット列である.また,各0 <= j <= w − 1に対して,Bit(j)は,j 番目のビットのみに 1

が立ったビットマスクを表す.

3. アルゴリズム

本節では,階層的なモジュール分割を用いた照合手法について説明する.以下では,`をパターン P に対する NFAの状態数とする.また,変数が所属するモジュールを明確にするために,モジュールM が持つ変数 X を表す時は,M.X と書くことにする.

3. 1 アルゴリズムの概要提案手法の照合アルゴリズムの概要を説明する.提案手法で

は,まず,前処理として,入力パターン P を階層型 NFAと呼ぶ,NFAの集合に変換する.次に,図 2 の実行時アルゴリズムを用いて,この階層型 NFAの遷移を入力テキスト上で模倣し,パターン照合を行う.図 2の実行時アルゴリズムでは,まず,1~4行目までで,階

層型 NFAの初期化を行う.次に,テキストを 1文字ずつ読みながら,以下の操作を繰り返し行う.

Step1 UMから LMへ遷移情報を伝える (6行目).Step2 LMの遷移を行う (7行目).Step3 LMから UMへ遷移情報を伝える (8行目).Step4 UMの遷移を行う (9行目).Step5 UMが終了状態に達したかどうかをチェックし,達していれば報告する (10行目).以下では,アルゴリズムの詳細を説明する.3. 2 NFAの階層的モジュール分割NFA の階層的モジュール分割について説明する.下位モ

ジュールの個数を k = d`/weとする. パターン P に対応するNFA を N とし,その状態を Q = {q0, · · · , ql−1} とする.N

は階層的モジュール分割によって,階層型 NFAに変換される.階層型 NFAは,上位モジュール(upper module)UM と,下位モジュール(lower module)(LM0, . . . , LMk−1)で構成される.

— 2 —

Page 3: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

Algorithm 1 RunNFA(UM, (LMj)k−1j=0 : Module, T : Text)

1: procedure Search

2: n← length(T );

3: UM.I ← 0w−11;

4: EpsClo(UM);

5: for i = 0 to n do

6: par j = 0 to k − 1 do UpperToLower(UM, LMj);

7: par j = 0 to k − 1 do RunExShiftAnd(LMj);

8: par j = 0 to k − 1 do LowerToUpper(LMj , UM);

9: EpsClo(UM)

10: if UM.S & Bit(w) 6= 0 then

11: report an occurrence at i;

図 2 階層型 NFA による照合アルゴリズム

Algorithm 2 EpsClo(M : Module)

1: M.S ←M.S |M.I

2: Z ←M.S |M.Eend

3: M.S ←M.S | (M.Eblk &((∼ (Z −M.Ebeg))⊕ Z))

図 3 手続き EpsClo

Algorithm 3 RunExShiftAnd(LMj : module, T [i]: letter)

1: LM.S ← LM.S | LM.I;

2: EpsClo(LM);

3: LM.S ← ((LM.S << 1) | LM.I)& LM.Ch[T [i]] |(LM.S & LM.Rep[T [i]]);

4: EpsClo(LM);

図 4 手続き RunExShiftAnd

Algorithm 4 UpperToLower(UM, LM : Modules)

1: if UM.S & Bit(j) 6= then LM.I ← 1;

2: else LM.I ← 0;

図 5 手続き UpperTolower

Algorithm 5 LowerToUpper(LM, UM : Modules)

1: if LM.S & Bit(j) 6= 0

2: then UM.S ← UM.S | Bit(j); . j ビット目を 1 にする3: else UM.S ← UM.S &(∼ Bit(j)); . j ビット目を 0 にする

図 6 手続き LowerToUpper

例として,図 1の NFAを,w = 4のとき,階層型 NFAに変換したものを図 7に示す.ここに,上位モジュールは,下位モジュールの遷移情報を隣

のモジュールに伝えるための中継点の役割をするモジュールである.UM の i番目の状態は,LMi−1 の最終ビットの状態を受け取り,LMi の初期ビットへ渡す役割を果たしている.さらに,ビット幅 w を超える長さの ε 遷移の連続したブロックを

0 1 2 3 3 4 5 6 6 7 8 9

ε

ε ε εε ε ε

121110

Σ

13

[Step4]

[Step1]

[Step3]

[Step2] [Step2] [Step2]

[Step1] [Step1]

[Step3] [Step3]

図 7 階層型 NFA の動き

正しく扱うために,金田ら [1]によって導入されたバイパス化技法に基づき,対応する下位モジュール 1 <= j <= w − 1の初期ビットから終了ビットが ε遷移だけで直接到達可能ならば,上位モジュールの状態 qj から qj+1 をつなぐ ε遷移をもつ.下位モジュール LMj は,元の NFAN の状態 qi(w−1) から状

態 q(i+1)(w−1) までの計 w 個の状態を格納するモジュールである.これは,状態マスクと,一組のマスクを保持し,実行時に Navarro と Raffinot らの Extended-Shift-And アルゴリズムを,モジュールに対応する小さな拡張文字列パターンの NFA

に対して実行する.ビット幅 w の上位モジュールは,w − 1 の下位モジュール

を持つことができる.したがって,階層モジュール全体で状態数 w(w − 1) = O(w2) の NFA を扱うことができる.例えば,w = 32 と w = 64 の場合,それぞれに,` = 992 状態と` = 4032状態の NFAを表現可能である.

3. 3 上位モジュールの実装上位モジュール UM0 は,次のビットマスクを持つ.• 状態マスク S ∈ {0, 1}w. 各 0 <= i <= w − 1 に対して

S[i] = 1 であることは,UM0 の i 番目の状態がアクティブであることを表す.次は, ε遷移用マスクである.• 開始位置を表すマスク Ebeg ∈ {0, 1}w 各 0 <= i <= w− 1

に対して,Ebeg[i] = 1であることは,UM0 の i + 1番目の状態から 1回以上連続する ε遷移が始まることを表す.

• 開始位置を表すマスクEend ∈ {0, 1}w 各 0 <= i <= w−1

に対して,Eend[i] = 1であることは,UM0 の i番目の状態で1回以上連続する ε遷移が終了することを表す.

• 開始位置を表すマスク Eblk ∈ {0, 1}w 各 0 <= i <= w − 1

に対して,Eblk[i] = 1であることは,UM0 の i番目の状態で1回以上連続する ε遷移が行われることを示す.モジュール内の更新式を説明する.モジュールの更新は,図

3 の手続き EpsClo で行う.これは,Navarro と Raffinot [4,

Chap. 4] により Extended-SHIFT-AND 法のために提案された手続きであり,ビット演算と加算を用いて,モジュールが表す NFAの ε閉包を計算する.ここに,ε閉包とは,0回以上のε遷移を適用により,到達可能な全ての場所にビットを移動することである.一つのモジュールに対する計算時間は O(1)時間である.

3. 4 下位モジュールの実装マスク: 下位モジュール LMj(0 <= j <= k − 1)は,次の情報

— 3 —

Page 4: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

を持つ.マスクは全て幅 w ビットである.• 状態マスク S ∈ {0, 1}w. 各 0 <= i <= w − 1 に対して

S[i] = 1であることは,LMj の i番目の状態がアクティブであることを表す.

• 幅 1 ビットの LMj の開始状態を表す変数 I ∈ {0, 1}.I = 1であることは,LMj の開始状態がアクティブであることを表す.

• 文字マスク Ch[c] ∈ {0, 1}w.各 0 <= i <= w− 1と,文字c ∈ Σに対して Ch[c][i] = 1であることは,LMj の i番目の文字遷移が文字 cによって行われることを表す.

• 繰り返しマスクRep[c] ∈ {0, 1}w.0 <= i <= w− 1と,文字 c ∈ Sigmaに対して Rep[c][i] = 1であることは,LMj の i

番目の文字繰り返しが文字 cによって行われることを表す.次は,ε遷移用マスクである.

• 開始位置を表すマスクEbeg ∈ {0, 1}w.各 0 <= i <= w−1

に対して,Ebeg[i] = 1であることは,LMj の i + 1番目の状態から 1回以上連続する ε遷移が始まることを表す.

• 開始位置を表すマスクEend ∈ {0, 1}w.各 0 <= i <= w−1

に対して,Eend[i] = 1であることは,LMj の i番目の状態で1回以上連続する ε遷移が終了することを表す.

• 開始位置を表すマスクEblk ∈ {0, 1}w.各 0 <= i <= w−1

に対して,Eblk[i] = 1であることは,LMj の i番目の状態で1回以上連続する ε遷移が行われることを示す.モジュール内の更新式を説明する.モジュールの更新は,図

4の手続き RunExShiftAndで行う.これは,Navarroと Raf-

finot [4, Chap. 4] の Extended-SHIFT-AND 法そのものである.ビット演算と加算を用いて,レジスタに収まる小さなサイズの拡張文字列パターンの NFAの遷移を模倣する.一つのモジュールに対する計算時間は O(1)時間である.

3. 5 上位モジュールと下位モジュール間のビット伝搬の実装モジュール間のビット伝搬手続きを説明する.上位モジュー

ルから下位モジュールへのビット伝搬は,図 5の手続きUpper-

ToLowerで行う.これは,各 0 <= j <= k − 1に対して,上位モジュールの状態マスクの j 番目のビットの値を,j 番目の下位モジュールの初期状態に対応するビットにコピーする.下位モジュールから上位モジュールへのビット伝搬は,図 6

の手続き LowerToUpperで行う.これは,各 0 <= j <= k − 1に対して,j 番目の下位モジュールの終了状態に対応するビットの値を,上位モジュールの状態マスクの j + 1番目のビットにコピーする.一つの下位モジュールに対する計算時間は,それぞれ,O(1)時

間である.ただし,全ての下位モジュールへのビット伝搬は,互いに同じビットへの書き込みが競合するため,並列実行には注意が必要である.平衡木スキームを用いるとO(log k) = O(log w)

並列時間で同時に実行可能である.

4. 計算量の解析

本節では,前節の階層的分割した NFAのアルゴリズムについて,記憶領域と計算時間について詳しく解析する.

4. 1 記 憶 領 域上位モジュール数は 1であり,下位モジュール数は k = d`/we

個である.上位モジュール一つ当たり,NFAの状態集合を表すビットを 1個と,ε遷移のためのマスクビットを 3個用いるので,合計で Su = 4 (語)の領域を使用する.下位モジュール一つ当たり,NFAの状態集合を表すビットを 1個と,ε遷移のためのマスクビットを 3個,文字遷移と文字繰り返しのためのマスクビットをそれぞれ Σ個用いるので,合計で Sl = (2|Σ|+4)d`/we (語)

の領域を使用する.以上から,アルゴリズムRunNFAは合計で,

Sall = (2|Σ| + 4)d`/we + 4

= O(|Σ|d`/we) (語)

の領域を使用する (表 1).マルチストリームマッチングは,s個の入力ストリームに対

して,一つのパターンの照合を同時に行う.この場合,前処理で構築するマスクを一組だけ保持して共有し,状態マスクのみを s個保持することで単純に s台のパターン照合アルゴリズムを走らせることができる.このとき,領域は

Sall = s(d`/we + 1) + (2|Σ| + 3)d`/we + 3

= O((s + |Σ|)d`/we) (語)

となり,入力ストリーム数 sが非常に大きいときにメモリ削減に有効である.

表 1 記憶領域の分析

Module ε 遷移 文字遷移 状態 Module 数 合計Upper 3 0 1 1 4

Lower 3 2Σ 1 d`/we (4 + 2Σ)d`/we

4. 2 計 算 時 間NFAサイズが `のパターンの前処理時間は,O(`)時間であ

る.図 2の手続きRunNFAは,テキスト T の文字を一文字読むごとに,forループ内 (5~11行目)の手続きを行う.6~8行目のUpperToLower(図 5),RunExShidtAnd(図 4),LowerToUp-

per(図 6)の 3つの手続きは,すべての LMj(0 <= j <= k− 1)について行われ,各 LMj に対して O(1) 時間かかるので,合計で O(k) = O(d`/we)時間かかる.また,9行目の EpsCloは,UM0について実行され,O(1)時間かかる.以上から,forループ内の処理には,

O(d`/we) + O(1) = O(d`/we) (時間) (1)

かかる.よって,逐次計算量について,次の定理を示すことが出来る.

[定理 1] 提案アルゴリズム RunNFAは,` <= w(w − 1)を満たす拡張文字列パターン P と入力テキスト T に対して,前処理時間 O(`)と領域 O(|Σ|d`/we)語を使い,計算時間 O(nd`/we)で P の T 中のすべての出現を見つける.ここに,nはテキスト長であり,`はパターンに対応する NFAの総状態数である.

— 4 —

Page 5: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

GPU などの並列ハードウェアの理論的モデルである並列RAM(PRAM)上の並列計算量について,次の結果を示すことが出来る.[定理 2] 提案アルゴリズム RunNFAは,` <= w(w − 1)を満たす拡張文字列パターン P と入力テキスト T に対して,前処理時間 O(`)と,一台当たり O(|Σ|)語の領域使用する O(d`/we)台のプロセッサを用いて,並列計算時間 O(n log w)で P の T

中のすべての出現を見つける.ここに,nはテキスト長であり,`はパターンに対応する NFAの総状態数である.このアルゴリズムは CUDAなどの GPUシステム上で実装

可能である.NFAサイズ `が非常に大きなパターンに対して,多くのプロセッサを用いることで高速化できる.

5. 実 験

本論文で提案した階層モジュール分割を用いたビット並列アルゴリズム RunNFAと,比較対象として,レジスタ長を超える,長いビットマスクを直接模倣するタイプの従来型のビット並列アルゴリズム LongNFAをC++言語で実装した.複数の超大レジスタの組を,RunNFAは垂直分割(vertical partition)を用いて分割し,LongNFAは水平分割(horizontal partition)を用いて分割していると言える.これらを比較するため計算機実験を行った.以下では,その

内容について詳しく説明する.5. 1 デ ー タテキストデータとして,ExPASy : SIB Bioinformatics Re-

source Portal(注1)から取得した 100MB のアミノ酸配列データを用いた.アミノ酸配列データは,|Σ| = 20のテキストデータであり,パターンは,ランダムに生成した拡張文字列パターンを使用した.また,以下では,パターンに含まれる {∗, +, ?}の文字を特殊文字と呼ぶ事にする.

5. 1. 1 実 験 1

パターンに含まれる特殊文字の割合を変化させていき,実行時間の比較を行った.表 2にパターン長を 2ワードとした時の実験結果を示す.RunNFA,LongNFAともに,パターンに含まれる特殊文字の割合に関わらず,ほぼ一定の実行時間となった.これは,どちらのアルゴリズムも,特殊文字の種類や量に関わらず,1文字読むごとに,文字遷移と ε遷移を行う定数回の計算をを繰り返すためであり,他のパターン長で実験しても同様の結果であった.

表 2 パターンに含まれる特殊文字の割合と実行時間

割合 (%) 10 30 50 70

RunNFA(秒) 2.991 2.991 2.989 2.992

LongNFA(秒) 3.551 3.551 3.552 3.551

(注1):ExPASy : SIB Bioinformatics Resource Portal- http://expasy.

org/

5. 1. 2 実 験 2

パターンの使用するワード数と,実行時間についての比較を行った.パターンはワード数を変化させながらランダムに生成し,特殊文字の割合は 20%とした.図 8に実験結果を示す.どちらも実行時間は,ワード数に対してほぼ線形に伸びているのが分かる.また,ワード数が小さい時には両者の実行時間にほとんど差はないが,ワード数が増えるにつれてその差が広がってきている.これは,LongNFAでは,計算の正当性を保証するため,各ワード間で同期が必要となる処理が,キャリービットの伝搬が必要な,シフト演算部分と,減算部分の 2箇所であるのに対して,RunNFAでは,8行目の LowerToUpperを実行する 1回のみであることが要因であると考えられる.

使用ワード数と処理時間の変化

使用ワード数(語)

時間(秒)

5

10

15

20

25

5 10 15 20

RunNFALongNFA

図 8 パターンのワード数と実行時間

6. お わ り に

本稿では,計算機のレジスタ長を越えるような長大なパターンに対する高速な文字列照合を実現する方法について考察を行った.提案アルゴリズムでは,NFAをモジュールに分割して照合を行う事で,レジスタをまたぐビット演算を回避し,高速な照合を実現した.また,この構成では,各モジュールは非同期に実行可能であ

り,複数の演算コアを備えた計算環境 (GPU や FPGA など)

では,各モジュールの計算を並列に実行する事で,更なる高速化が可能である.この場合,下位モジュールの情報を上位モジュールに伝える際に,上位モジュールに対して,複数の下位モジュールからの同時書き込みが発生する.これには,現在 2

つの解決法を考えている.一つ目は平衡木スキームを用いた並列化である.これは,O(k)回の同時アクセスを O(logk)回に減らす事が可能である.2つ目は,上位モジュールをレジスタによる実装ではなく,配列によって実装することで同時アクセスを無くす方法である.しかし,この方法では,上位モジュールにおいて,ビット並列手法による高速な遷移が行えなくなる

— 5 —

Page 6: 長大な拡張文字列パターンに対する大規模文字列照合の高速化db-event.jpn.org/deim2012/proceedings/final-pdf/b8-4.pdf · 長大な拡張文字列パターンに対する大規模文字列照合の高速化

欠点がある.このような実装上の工夫により高速化が可能であるかどうかは,今後の研究で検証する予定である.また,この構成をより一般化し,多階層の構成にすることで,

より複雑な正規表現の照合を実現することも重要なテーマである.

文 献[1] Y. Kaneta, S. Minato, and H. Arimura. Fast bit-parallel

matching for network and regular expressions. In Proceed-

ings of the 17th International Conference on String Pro-

cessing and Information Retrieval (SPIRE’10), pages 372–

384. Springer-Verlag, 2010.

[2] Y. Kaneta, S. Yoshizawa, S. Minato, H. Arimura, and

Y. Miyanaga. Dynamic reconfigurable bit-parallel archi-

tecture for large-scale regular expression matching. In

Proceedings of the International Conference on Field-

Programmable Technology (FPT’10), pages 21–28. IEEE,

2010.

[3] C.-H. Lin, S.-Y. Tsai, C.-H. Liu, S.-C. Chang, and J.-M.

Shyu. Accelerating string matching using multi-threaded

algorithm on GPU. In the 2010 IEEE Global Telecommu-

nications Conference (GLOBECOM’10), pages 1 –5, dec.

2010.

[4] G. Navarro and M. Raffinot. Flexible Pattern Matching

in Strings: Practical on-line search algorithms for texts

and biological sequences. Cambridge University Press, 2002.

ISBN 0-521-81307-7. 280 pages.

[5] E. Wu, Y. Diao, and S. Rizvi. High-performance com-

plex event processing over streams. In Proceedings of the

ACM SIGMOD International Conference on Management

of Data (SIGMOD’06), pages 407–418. ACM, 2006.

— 6 —