...

IoT機器に適した FPGAを用いた文字列分割の高速化

by user

on
Category: Documents
10

views

Report

Comments

Transcript

IoT機器に適した FPGAを用いた文字列分割の高速化
IoT 機器に 適し た FPGA を 用いた 文字列分割の高速化
大和 一洋 ∗
ミ ラ ク ル・ リ ナッ ク ス 株式会社
2016/12/1
概 要
本稿は、 IoT ゲート ウ ェ イ やデータ セ ン タ ーのサーバーに 適する FPGA を 用いた文字列分割の高速化に つい
て の研究成果を 報告する 。 ザイ リ ン ク ス 社の高位合成コ ン パイ ラ を 用いた プロ ト タ イ プは、 200MHz で動作し 、
ク ロ ッ ク 毎に 最大 32 の ASCII 文字を 処理する 。 そ れは、 PCI Express イ ン タ ーフ ェ イ ス を 介し て 、 ホス ト コ ン
ピュ ータ と FPGA ボード 間でデータ 転送を 行う ために OpenCL と 自製のフ レ ーム ワ ーク (Volvox) のいずれかを
利用する 。 評価では、 Volvox を 使っ たプロ ト タ イ プに よ る 処理が、 CPU に よ る 処理よ り も 約 10 倍高速である こ
と が示さ れた 。
1
はじ めに
IoT (Internet of Things) 機器の数は、 2020 年ま でに 208 億台に 達する と 予想さ れて いる [1]。 膨大な 数の機器
を 扱う た めのキ ーと な る コ ン ポーネ ン ト のひと つは、 IoT ゲート ウ ェ イ であ る 。 そ れは、 データ を 機器から 収集
し て イ ン タ ーネ ッ ト サーバーに 転送する こ と に 加え て 、 集約、 フ ォ ーマ ッ ト 変換、 不要な データ の破棄な ど の前
処理も 行う 。 IoT ゲート ウ ェ イ は、 データ セ ン タ ー以外に も 様々 な 場所に 設置さ れる こ と が想定さ れる 。 多く の
機器から のト ラ フ ィッ ク を 処理し な け ればな ら な いに も かかわら ず、 そ こ では、 設置ス ペース 、 冷却、 電力な ど の
制約はよ り 厳し い。 ネ ッ ト ワ ーク ・ プロ ト コ ルやフ ォ ーマ ッ ト に は HTTP や JSON のよ う に テキ ス ト 形式のも の
が多く ある ので、 ト ラ フ ィッ ク に はそ れら テキ ス ト 文字列が含ま れる 。 ま た、 近年、 小型機器でも 動作する 軽量プ
ロ グラ ム 言語 (例え ば、 Python や Ruby) を IoT 機器に 用いる 場合、 入出力に テキ ス ト を 使用する ケ ース も ある 。
そ のため、 効率的な テキ ス ト 処理は、 優れた IoT ゲート ウ ェ イ の重要な 要件のひと つと な る 。
一方、 データ セ ン タ ーでも IoT 機器から の大量のト ラ フ ィッ ク を 処理し な け ればな ら な い。 ま た 、 テ キ ス ト を
使用する 機会も 多い。 例え ば、 (Hadoop [2] を 用いたよ う な ) 収集データ の分散バッ チ処理、 自然言語の構文解析、
AI (Artificial Intelligence) と の対話、 多量のサーバーのロ グ解析な ど である 。
FPGA (Field Programmable Gate Array) は、 こ れら の課題に 対する 有効な 解決策のひと つと 考え ら れる 。 イ
ン テ ル社は、 2020 年ま でに 1/3 のク ラ ウ ド を 構成する サーバーに FPGA が搭載さ れる と 述べて いる [3]。 FPGA
を 使う と 、 ユーザーは自身で目的に 応じ て 回路を 構成でき る 。 良好な 設計がな さ れる と 、 高い性能と 電力効率が
得ら れる [4]。 し かし な がら 、 一般的な ソ フ ト ウ ェ アエン ジニアや運用管理者がそれら を 使いこ な すこ と は難し い。
な ぜな ら 、 そ の設計に は、 デジタ ル回路の知識を はじ め、 シス テム バス や OS な ど のコ ン ピュ ータ に 関する 広範な
知見が必要だから である 。 加え て 、 ア プリ ケ ーショ ン プロ グラ ム が、 構築さ れた FPGA 内の回路を 使用する よ う
に 新規開発ま たは修正を 行う 必要も ある 。
我々 は、 GNU C Library (glibc) [5] のよ う な 基本的な ラ イ ブラ リ から FPGA を 透過的に 使用する OS を 提供す
る こ と で、 こ れら の課題を 解決する こ と を 計画し て いる 。 こ の方式の優位点は、 ア プリ ケ ーショ ン の修正が不要
な こ と である 。 ま た、 最近の CPU と FPGA を 統合する ト レ ン ド に よ っ て 、 こ のコ ン セ プト は Intel プラ ッ ト ホー
ム で ARM でも 実現可能であ る 。 イ ン テ ル社は、 FPGA 技術の先進的な 企業であ る ア ルテ ラ 社の買収が完了し た
と ア ナウ ン ス し た [6]。 も う ひと つの主要な 企業である ザイ リ ン ク ス 社は、 ARM ベース のプロ セッ サと FPGA に
よ る 構成可能な 機能を ひと つに し た SoC (System on Chip) である Zynq を 販売し て いる 。 ARM 社のオーナーで
ある ソ フ ト バン ク の CEO は、 IoT のために ARM ベース のプロ セッ サを 活用する こ と に 積極的な 姿勢を 表明し て
いる [8]。
我々 は、 計画実現の第一歩と し て 、 テ キ ス ト 処理のも っ と も 基本的な 機能のひと つであ る 文字列の単語へ分解
を 行う 分割器のプロ ト タ イ プを 開発し た。 本稿ではそ のア ーキ テク チャ と 評価結果に ついて 述べる 。
∗ Email:
[email protected]
1
プロ ト タ イ プ
2
2.1
全体構成
プロ ト タ イ プは、 図 1 に示し たよ う にホスト コ ン ピュータ と 、 PCI Express イ ン タ ーフ ェイ スで接続さ れた FPGA
ボード (表 1 参照) で構成さ れる 。 図中のコ ン ポーネ ン ト は、 3 つのレ イ ヤ ーに 分類でき る 。 下位レ イ ヤ ー (灰色の
背景) は、 ハード ウ ェ アであり 、 その機能は固定である 。 中間レ イ ヤ ー (青い背景) は、 DMA 転送や割り 込み処理
な ど 様々 な ア プリ ケ ーショ ン で共通し て 使われ、 下位と 上位レ イ ヤ ーの橋渡し を 行う 。 上位レ イ ヤ ー (赤い背景)
は、 ア プリ ケ ーショ ン に 固有の処理を 持つ。
図 1: 全体構成
も っ と も 主要な 役割を 担う 分割器のカ ーネ ル (Tokenizer kernel)
1
を 2.2 節で説明する 。 中間レ イ ヤ ーに 2 つの
異な る フ ーレ ム ワ ーク、 OpenCL と Volvox を 用いて 、 そ れぞの場合に ついて 評価を 行っ た 。 こ れら を 2.3 と 2.4
節で説明する 。 上位レ イ ヤ ーでのホス ト ア プリ ケ ーショ ン に ついて は 2.5 節で解説する 。
FPGA ボード
FPGA デバイ ス
最大レ ーン 幅
最大リ ン ク 速度
DDR
2.2
表 1: FPGA ボート と 関連する 諸元
ALPHA DATA ADM-PCIE-7V3 [11]
Xilinx Virtex-7 XC7VX690T-2
×8
8 GT/s
2 つの 8GB ECC-SODIMM, 速度は最大 1333MT/s
分割器のカ ーネル (Tokenizer kernel)
分割器のカ ーネ ルは、 各行ごと に 、 入力さ れる 文字列の全て の単語に 対し て 、 開始と 終端位置の組を 算出する 。
現在のプロ ト タ イ プの諸元を 表 2 に 示す。 分割器は、 最大 L 行 (表 4 参照) を 一度に 処理する 。 分割器は、 C++で
記述さ れ、 ザイ リ ン ク ス 社の Vivado (HLS) 2016.1 に よ っ て 合成さ れて いる ので、 そ の入出力は表 3 に 示すと お
り C 言語の関数のよ う に 定義さ れる 。
図 2 に 、 2 つの行 ‘MIRACLELINUX’ と ‘Corporatecolorisgreen.’ ( はス ペース を 表す ) の分割
を 例示する 。 入力パラ メ ータ num lines と total length は、 そ れぞれ、 1 回のカ ーネ ル実行での処理さ れる 行
数と そ れら の合計長を 示す。 lengths は各行の長さ を 格納する 配列であ る 。 そ の配列長は、 num lines と 同一で
ある 。 配列 lines は、 処理さ れる 文字列を すべて 含み、 そ れら に はパディ ン グや改行を 示すコ ード は含ま れな い。
‘\n’ が含ま れて いて も 、 そ れは単な る 文字のひと つと し て 扱われる 。
1 FPGA
内に 構成さ れる 処理機構を カ ーネ ルと 呼ぶ。 Linux カ ーネ ルと は異な る ので混同に 注意。
2
区切り 文字
表 2: 分割器のカ ーネ ルのプロ ト タ イ プ諸元
半角ス ペース
マ ルチバイ ト 文字
非対応
連続し た区切り 文字
1 行の最大長
ひと つの区切り 文字と し て 扱う
65535
表 3: 分割器のカ ーネ ルの入出力
ビッ ト 幅
種類
プロ ト コ ル
パラ メ ータ
I/O
要素数/チャ ン ク
num lines
IN
32
scalar
AXI slave (register)
N/A
total length
lines
IN
IN
32
8
scalar
array
AXI slave (register)
AXI master
N/A
32
lengths
markers
IN
OUT
16
32
array
array
AXI master
AXI master
16
8
positions
OUT
16
array
AXI master
16
出力パラ メ ータ markers は、 長さ num lines+1 の配列である 。 その要素は、 対応する 行の分割結果を 格納する
領域の先頭を 指す。 最後の要素は、 positions の次の要素を 指す。 配列 positions は、 単語の開始と 終端の位置
の組を 含む。 そ の配列長は、 入力文字列に よ っ て 変わり 、 markers の最後の要素を 使っ て 次のよ う に 算出でき る 。
Np = Z/Bp
(1)
こ こ で Np , Z と Bp は、 そ れぞれ、 positions の要素数、 markers の最後の値、 positions の要素の大き さ であ
る 。 同様に 単語数 Nt は次のよ う に 得ら れる 。
Nt = Np /2
(2)
カ ーネ ルのブロ ッ ク 図を 図 3 に 示す。 入出力のためのポート は、 実際に はデータ 幅 WD ビッ ト のひと つの AXI
マ ス タ ーイ ン タ ーフ ェ イ ス な ので、 配列中の複数の要素が一度に 読み書き さ れる 。 そ の単位を チャ ン ク と こ こ で
は呼ぶ。 チャ ン ク 中の要素数を 表 3 の ‘要素数/チャ ン ク ’ 列に 示す。
Reader は、 ま ず lengths の全て の要素を 、 続いて lines を 読み出す。 こ の方式は、 メ モリ を シーケ ン シャ ル
に ア ク セ ス し 、 AXI のバース ト リ ード を 引き 起こ す。 バース ト リ ード /ラ イ ト は、 1 回の手続き で連続し たア ド レ
ス の複数のデータ を 転送する こ と に よ り 高いス ループッ ト を 実現する 。 バース ト 転送を 行う こ と は、 高速な デー
タ 入出力のための最も 重要な ポイ ン ト のひと つである 。 Dispatcher は、 読み出さ れた lines のチャ ン ク を 循環的
に ひと つの Splitter に 送り 出す。 Splitter は、 ク ロ ッ ク 毎に 1 文字 (8 ビッ ト ) を 解析し 、 そ の繰り 返し 間隔は
WD /8 ク ロ ッ ク であ る 2 。 繰り 返し 間隔と 同じ 数 Ns 個の Splitter を 配置する こ と で、 合計 Ns 文字が 1 ク ロ ッ
ク で処理さ れる 。 Splitter は、 いく つかのチャ ン ク に 分割さ れたも ののひと つを 解析する ので、 行の中の完全な
位置を 算出する のは不可能であ る 。 そ のた め、 完全な 位置を 後段のブロ ッ ク で計算出来る よ う に 、 いつく かの変
数も 算出する 。 Linearizer は、 循環的に Splitter から 解析結果を 集めて 、 再度ひと つのデータ ス ト リ ーム を 生
成する 。 Unifier は、 以前の結果と 組み合わせて 完全な positions と markers を 計算する 。 こ のア ーキ テク チャ の
表 4: 分割器のカ ーネ ルの構成パラ メ ータ
概要
パラ メ ータ
値
L
WD
8192
256
分割器が 1 度に 処理でき る 最大行数
NS
QW
p
32
64
Splitters の数
positions に 対する バース ト ラ イ ト 長
2 チャ ン ク 中に
AXI マ ス タ ーイ ン タ ーフ ェ イ ス のデータ 幅
16 を 超え る 単語がある 場合、 よ り 大き いク ロ ッ ク 数を 要する
3
図 2: 単語分割の例。 markers と positions は、 見やすく する た めに 実際のビッ ト 幅よ り 小さ く 表示さ れて いる
こ と に 注意。
利点は、 レ イ テン シ (処理時間) が入力さ れる 行の長さ の分布に 依存せず、 主と し て 全体の大き さ に 比例する こ と
である 。
算出さ れた positions と markers は、 そ れぞれ、 Positions formatter と Marker formatter に 送ら れる 。 そ
れら のブロ ッ ク は、 送ら れて く る データ 要素から WD ビッ ト 長のチャ ン ク を 生成する 。 QW
p 個の positions が準
備でき る 度に 、 Writer はそ れら を 書き 出す。 一方、 markers は、 すべて の positions が書き 出さ れる ま で Marker
formatter 内に 蓄積さ れる 。 markers の要素数は最大でも L + 1 な ので、 一時的に こ れら を 保持する こ と はそ れ
ほど 困難ではな い。 こ の手法も バース ト ラ イ ト を 引き 起こ すために 用いら れて いる 。
表 5 のよ う に AXI マスタ ーイ ン タ ーフ ェイ スのパラ メ ータ を 調整し ている 。 上述のと おり positions と markers
のバース ト 長は、 そ れぞれ、 QW
p と L + 1 である 。 な お、 こ こ でのバース ト 長は、 memcpy() ま たは、 for 文の中
で使用さ れる 値のこ と であ る 。 こ れは、 AXI イ ン タ ーフ ェ イ ス のパラ メ ータ のひと つであ り 、 デフ ォ ルト 値 (15)
のま ま であ る AWLEN と 異な る 点に 注意のこ と 。 表中の値は試行錯誤的に 決めら れた 。 こ れら のパラ メ ータ な し で
は、 バース ト ラ イ ト と 次のバース ト ラ イ ト の間隔が、 Vivado HLS の C/RTL co-simulation の結果から 期待さ れ
る 値よ り 長く な っ た。
表 5: 明示的に 指定し た AXI イ ン タ ーフ ェ イ ス パラ メ ータ
パラ メ ータ latency max read burst length
lines
lengths
0
0
32
32
markers
positions
0
0
default (16)
default (16)
分割器のカ ーネ ルは 200MHz で動作する よ う に 設計さ れて いる 。 こ れは、 FPGA ボード ADM-PCIE-7V3 で
OpenCL を 使う 場合の変更でき な い要件であ る 。 Vivado HLS の co-simulation に よ る と 、 1 つのチャ ン ク
3 サイ ズが
Ns バイ ト 以下
4
3
が入
図 3: 分割器のカ ーネ ル (Tokenizer kernel) のブロ ッ ク 図
力さ れた場合のレ イ テン シは 179 であり 、 Ns バイ ト ごと に 増加する 。
2.3
OpenCL フ レ ームワ ーク
OpenCL は、 The Khronos Group [10] に よ っ て 標準化さ れて いる フ レ ーム ワ ーク であ る 。 開発者は、 CPU、
GPU、 FPGA や専用ア ク セ ラ レ ータ な ど 種々 のデバイ ス を C 言語を ベース に し た 1 つの API セ ッ ト で使用でき
る 。 そ の API は、 ホス ト と デバイ ス の両方に 対し て 定義さ れて いる 。 加え て 、 ザイ リ ン ク 社の OpenCL 開発環境
である SDAccel では、 OpenCL C のみな ら ず、 pragma 指示子を 用いた C と C++で FPGA のカ ーネ ルを 記述す
る こ と ができ る 。 我々 は、 分割器のカ ーネ ルを SDAccel を 使っ て C++で記述し た。
図 4 に OpenCL を 使う 場合のデータ の流れの一例を 示す。 OpenCL は、 ‘Host application’ お よ び ‘OpenCL
framework on Host’ と 名付け ら れたボッ ク ス間のイ ン タ ーフ ェ イ ス (API) を 定義する ので、 厳密な シーケ ン スは、
そ のラ イ ブラ リ 実装に 依存する 。 図は仕組みを 容易に イ メ ージする ための補助である 。
ラ ベルの先頭の丸括弧の中の数字は、 それら が使用さ れる 典型的な 順序を 示す。 ラ ベルはそれら と 関連のある コ
ン ポーネ ン ト の近く に配置さ れて いる 。 図ではデータ が一旦 FPGA ボード 上の RAM を 経由し て いる が、 実際のホ
ス ト と FPGA ボード 間の転送方法は、 上述のと おり 実装依存である 。 開発者は、 目的固有の処理のみを OpenCL
C (も し く は C/C++) を 使っ て 設計すればよ く 、 PCI Express や DDR RAM のよ う な ハード ウ ェ ア の詳細を 知る
必要がな い。 こ れは OpenCL を 使う も っ と 有益な 点のひと つである 。
図 4: Volvox フ レ ーム ワ ーク を 使っ たデータ の流れの例
2.4
Volvox フ レ ームワ ーク
Volvox フ レ ーム ワ ーク は、 自製のソ フ ト ウ ェ ア と FPGA のためのグルー・ ロ ジッ ク で構成さ れる 。 こ れを 開発
し た理由は次の 2 つである 。 ひと つは、 OpenCL の API セ ッ ト が様々 な プラ ッ ト ホーム で種々 の目的のために 設
5
計さ れて いる こ と 。 すな わち 、 そ れは本研究の目的に 対し て 最良と は限ら な いこ と 。 他の理由は、 SDAccel がま
だ正式版でな い (β 版な ) ので、 そ れを 使っ た結果に はま だ改善の余地がある かも し れな いためである 。
分割器のカ ーネ ル自身は、 何ら 変更な し に OpenCL と Volvox フ レ ーム ワ ーク で共通し て 使用でき る 。 し かし 、
ホス ト 側では、 出来る 限り の性能を 提供する ために 、 上位レ イ ヤ ーと のイ ン タ ーフ ェ イ ス は OpenCL のそ れと は
非互換である 。 Volvox の特徴のひと つは、 分割器のカ ーネ ルが、 図 5 に示すよ う にアプリ ケ ーショ ン・ プロ グラ ム
のメ モリ 空間に マ ッ プさ れて いる バッ フ ァ に 対し て 直接読み書き する こ と である 。 ま た、 FPGA ボード 上の DDR
RAM は使用さ れず、 Linux カ ーネ ルと ア プリ ケ ーショ ン プロ グラ ム 間のデータ のコ ピ ーも な い。
図 5: Volvox フ レ ーム ワ ーク でのデータ の流れ
2.4.1
FPGA 内のグルー・ ロ ジッ ク
図 6 に 、 分割器が FPGA に 搭載さ れて いる ハード ウ ェ ア ブロ ッ ク を 使っ て PCI Express イ ン タ フ ェ ース に ア ク
セ ス する ためのグルー・ ロ ジッ ク を 示す。 分割器を 除く コ ン ポーネ ン ト はすべて LogiCORE と 呼ばれる ザイ リ ン
ク ス 社の IP であ る 。 そ れら は、 ×8 レ ーン ・ 8GT/s の PCI Express から のト ラ フ ィッ ク を 処理する た めに 、 256
ビッ ト の AXI イ ン タ ーフ ェ イ ス の RDATA およ び WDATA を 用いて 250MHz で動作する 。
AXI Bridge for PCI Express Gen3 は、 AXI と PCI Express 間でリ ード およ びラ イ ト 操作を 転送する 。 言い換
え る と 、 分割器のカ ーネ ルの AXI イ ン タ ーフ ェ イ ス での 1 つのバース ト リ ード (ラ イ ト ) 操作は、 PCI Express で
のバースト リ ード (ラ イ ト ) を 引き 起こ す。 こ のアーキテク チャ では、 分割器がホスト メ モリ へアク セスする DMA
エン ジン と し て 動作する 。
割り 込みコ ン ト ロ ーラ は、 次の 2 つの目的に 使用さ れる 。
(1) レ ベル割り 込みを エッ ジ割り 込みに 変換。 分割器の割り 込みピ ン は、 Vivado HLS に よ っ て 自動的に 生成さ
れ、 開発者はそ の仕様を 変更でき な い。
(2) AXI Bridge のク ロ ッ ク に 同期し た割り 込み信号を 生成。
表 6 に 配置配線後 FPGA のリ ソ ース を 示す。 使用率の点から は、 分割器内の並列度 (Splitter の数) を 増やす
こ と は可能である 。 し かし な がら 、 分割器のカ ーネ ルの論理的な 最大ス ループッ ト は、 すでに PCI Express の最
大転送レ ート に ほぼ匹敵し て いる 。 そ のため、 こ れ以上の並列性は性能に ほと んど 寄与し な い。
6
図 6: Volvox のグルー・ ロ ジッ ク
表 6: 分割器と グルー・ ロ ジッ ク のリ ソ ース
コ ン ポーネ ン ト
LUT
LUTRAM
FF
分割器と グルー・ ロ ジッ ク
2.4.2
20%
7%
11%
BRAM
4%
ホスト コ ン ピ ュ ータ のソ フ ト ウ ェ ア
Volvox フ レ ーム ワ ーク のホス ト 側でのコ ン ポーネ ン ト は、 Linux 用のロ ーダーブルカ ーネ ルモジュ ールのみで
ある 。 そ れは、 サイ ズがそ れぞれ 4MiB である DMA バッ フ ァ 用の 2 つのメ モリ 領域を 2 組確保する 。 各領域は、
そ れぞれ FPGA へのデータ、 およ び、 FPGA から のデータ を 格納する 。 2 組の領域を 使う こ と で、 ホス ト ア プリ
ケ ーショ ン は、 1 つの組を 使っ て 処理が行われて いる 間に 、 次のカ ーネ ル実行のための入力データ を 準備し たり 、
すでに 処理が完了し たデータ に ア ク セ ス 出来る 。 結果と し て 、 こ の機構も 性能の向上に 寄与する 。 Volvox のカ ー
ネ ルモジュ ールは、 mmap シス テム コ ールを 通じ て 、 ホス ト ア プリ ケ ーショ ン に 領域を マ ッ プする 。
カ ーネ ルモジュ ールは、 分割器から の割り 込みを 受け と っ た時に、 ホスト アプリ ケ ーショ ン を 起床する 機能を 持
つ。 し かし な がら 、 割り 込みの使用はオプショ ン である 。 分割器のカ ーネ ルは、 処理状態を 示すビッ ト を 含むレ ジ
ス タ を 提供する ので、 ホス ト ア プリ ケ ーショ ン はそ のレ ジス タ のポーリ ン グに よ り 処理の完了を 知る こ と ができ
る 。 カ ーネ ルモジュ ールは、 Linux の streaming DMA API [12] に 基づく DMA バッ フ ァ の同期機能を 提供する 。
ホス ト ア プリ ケ ーショ ン は、 そ の機能に よ り RAM のキ ャッ シュ のフ ラ ッ シュ や無効化を 行わな け ればな ら な い。
2.5
評価のためのホスト ア プリ ケ ーシ ョ ン
性能評価のた めに 表 7 に 示す 6 つのホス ト ア プリ ケ ーショ ン を 開発し た 。 そ れら は、 2.5.1 と 2.5.2 節で解説さ
れる 2 つのグループに 分類さ れる 。
2.5.1
実性能測定ためのホスト ア プリ ケ ーシ ョ ン
ひと つ目のグループの目的は、 実性能を 測定する こ と である 。 ア プリ ケ ーショ ン FOa と FVa は、 (a) 入力フ ァ
イ ルを 読み込み、 (b) そ の内容を 分割器のカ ーネ ルが利用でき る 形式に 変換し て 、 (c) バッ フ ァ に 書き 込み、 (d)
FPGA 内のカ ーネ ルの処理を 開始する 。 フ ァ イ ルの行数が L を 超え る 場合、 上記の (c)(d) が繰り 返さ れる 。 ア プ
7
リ ケ ーショ ン Ca は、 CPU を 用いて 同様の処理を 行う 時間を 知る ために 作成さ れた。 FOa と FVa と 異な り 、 そ れ
は 1 行ごと に 文字列分割を 行う 。
こ れら のア プリ ケ ーショ ン は、 最初のデータ の準備終了から 分割器のカ ーネ ルの実行完了ま での時間を 測定す
る 。 入力フ ァ イ ルを 読み込む時間の遅延を 低減する ため、 すべて の文字列は、 一旦ア プリ ケ ーショ ン 内のバッ フ ァ
に 予めコ ピ ーさ れる 。 こ の時間は測定に は含ま れな い。
2.5.2
コ ン セプト 実証のためのア プリ ケ ーシ ョ ン
も う 一方のグループの目的は、 C ラ イ ブラ リ (glibc) の関数のひと つである strtok() に相当する 機能を 実現し 、
その性能を 調べる こ と である 。 本稿では、 その機能を strtok v() と 記す。 アプリ ケ ーショ ン FOs と FVs (Cs ) は、
単位時間あたり 何回 strtok v() (strtok()) を 呼び出すかを 測定する 。 1 節で述べたよ う に我々 の目的は、 FPGA
を 透過的に 利用する OS を 提供する こ と であ る 。 こ れは、 そ のコ ン セ プト のひと つのデモン ス ト レ ーショ ン であ
る 。 ただし 、 現在の実装では、 呼び出し 元のア プリ ケ ーショ ン の修正を 不要と する ま での完全な 透過ではな い。
分割器のカ ーネ ルは、 複数の行を 一度に 処理する こ と が想定さ れて いる 。 1 行のみを 取り 扱う こ と はでき る が、
そ の場合、 3.4.1 節で議論する よ う に いく つかのオーバーヘッ ド に よ り 、 不十分な 結果に な る 。 そ れ故、 処理さ れ
る 複数行に 、 そ れら が strtok v() に 渡さ れる 前に ア ク セ ス でき る 必要がある 。 と はいえ 、 こ の制約があっ て も 、
例え ば、 大量のロ グのバッ チ処理な ど に 応用する こ と は可能である 。
ア プリ ケ ーショ ン FOs と FVs は、 ま ず、 複数行に ついて の positions と markers を そ れぞれ FOa と FVa の方
法で得る 。 その後、 それら は、 char *strtok v(char *str) の呼び出し 毎に、 NULL タ ーミ ネ ータ ーを パラ メ ー
タ と し て 与え ら れた文字列に埋め込む。 引数 str は、 本来の strtok のそれと 同じ く 分割さ れる 文字列である 。 返
り 値のポイ ン タ も 、 本来のそ れと 同じ 意味を 持つ。 オリ ジナルの strtok と の違いは、 区切り 文字が固定であり 指
定でき な いこ と である 。 アプリ ケ ーショ ン Cs は、 単純に strtok() を 入力行ごと に呼び出す。 Ca の分割エン ジン
に ついて は我自身々 で作成し たが、 こ ち ら は第三者に よ っ て 開発さ れ、 誰でも 容易に 使用でき る GNU C Library
の一部である 。
ア プリ ケ ーショ ン
表 7: ホス ト ア プリ ケ ーショ ン
FOa
FVa
Ca
FOs
目的
デバイ ス
フ レ ーム ワ ーク
実性能
FPGA
OpenCL
FPGA
Volvox
CPU
N/A
FVs
Cs
strtok() 相当の機能
FPGA
FPGA CPU
OpenCL Volvox N/A
評価
3
3.1
ホスト マシ ン
表 8 に 評価に 用いたホス ト マ シン の諸元を 示す。
CPU
表 8: ホス ト マ シン の諸元
Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
RAM
OS
8 GB ×4
CentOS 6.8 (x86 64)
Max payload size on PCIe
128
8
3.2
入力データ
英語文書から 構成さ れる 10 から 109 の 9 つのサイ ズの入力データ を 用いた。 表 9 に、 それら に含ま れる 単語と 行
の数を 示す。 図 7 と 8 に 、 単語長と 連続し た区切り 文字の反復数の分布を 示す。 最頻出の語長は 3 である 。 90%と
99%の単語は、 そ れぞれ、 9 文字と 13 文字よ り 小さ い。
入力データ サイ ズは、 入力単語の組わせに 依存し 、 入力行数が同じ だと し て も 当然異な る 。 入力行数が最大 (す
な わち L) の場合のおおよ そ サイ ズは数百キ ロ バイ ト である 。
サイ ズ (Bytes)
10
102
表 9: 入力データ の単語数と 行数
103
104
105
106
107
単語数
2
1
18
3
154
43
1579
247
17194
1831
171422
17390
1743974
194936
109
17237031
1988957
172432363
19911073
Frequency
行数
108
0
5
10
15
20
Word length
Frequency
図 7: 入力データ の単語長分布
108
107
106
105
104
103
102
101
0
5
10
15
20
25
30
35
40
45
The number of consecutive separators
図 8: 入力データ 中の区切り 文字の反復数分布
3.3
ア プリ ケ ーシ ョ ン
最大の性能を 得る ために 2.5 節に 記載のア プリ ケ ーショ ン を ポーリ ン グモード で使用し た。 割り 込みを 使っ た場
合、 おおよ そ 5 から 10µs の追加的な 遅延が分割器のカ ーネ ルの実行毎に 発生し た。
処理時間は、 ア プリ ケ ーショ ン 内に 配置さ れた clock gettime(CLOCK MONOTONIC) を 使っ て 測定さ れた。 こ の
関数は測定毎に 2 回呼び出さ れる 。 報告 [13] によ る と 、 こ の関数自身の遅延は約 50ns であり 基本的に無視でき る 。
3.4
3.4.1
結果と 議論
実性能
図 9 に 、 入力データ サイ ズ A に 対する 処理時間 T を 示す。 黒、 青、 赤のマ ーカ ーは、 そ れぞれ、 ア プリ ケ ー
ショ ン FOa 、 Ca およ び FVa を 用いた測定結果を 表す。 Ca の処理時間 (TCa ) は、 A . 103 では最小である 。 一方、
FVa (TF Va ) は、 A & 104 で Ca のそ れよ り 小さ い。 比率 TCa /TF Va と 、 1 秒あ た り に 処理さ れる データ サイ ズで
ある ス ループッ ト F Vs は、 そ れぞれ、 10 およ び 4.13 × 109 B/s である 。
9
Ca の処理時間は、 お お よ そ 入力データ サイ ズに 比例し て いる
4
が、 FVa のそ れは、 A . 103 でほぼ一定で約
7µs である 。 我々 は、 A = 10 での処理時間の内訳を 調べた。 FVa に は、 以下の 3 つの工程がある 。
(1) DMA バッ フ ァ への入力データ の書き 込みと 分割器カ ーネ ルのレ ジス タ 設定。
(2) DMA バッ フ ァ の同期。
(3) 分割器のカ ーネ ルの実行。
そ れぞれの時間は、 そ れぞれ、 約 1、 4、 およ び 2 µs であっ た。 工程 (1) と (3) は、 入力サイ ズと と も に 増加する
が、 工程 (2) はほぼ一定であっ た。
(3) の時間に 関し て 、 2.2 節で述べたよ う に 設計 (C/RTL co-simulation) 上の分割器の最小レ イ テン シは 179 で
ある が、 実際のそ れは、 ク ロ ッ ク 周波数が 200MHz な ので約 400 である こ と を 意味し て いる 。 そ の違いは、 ホス
ト RAM から データ を 得る た めの遅延時間に 起因する 。 図 10 に 、 分割器の AXI イ ン タ ーフ ェ イ ス のいく つかの
信号を 示す。 そ れは、 FPGA 中の実信号のロ ジッ ク ・ ア ナラ イ ザである ILA (Integrated Logic Analyzer) [14] を
用いて 取得さ れた。 最初の ARVALID の立ち 上があり (読み込み要求の開始) から 、 対応する RVALID の立ち 上が
り (要求データ の到着) ま での間隔は、 約 100 ク ロ ッ ク である 。 分割器のカ ーネ ルは lengths と lines のために 、
2 度のバース ト リ ード を 行う ので、 そ の約 100 ク ロ ッ ク の 2 倍の遅延が、 設計上想定さ れる 値に 加算さ れる 。 仮に
lengths と lines の両方を 含むひと つの配列を 使え ば、 遅延時間は減る であ ろ う 。 し かし 、 そ れは可読性と 保守
性の低下を も たら す懸念がある 。
FOa の結果は、 A < 107 に おいて 、 10− 3 . T . 100 の広い 処理時間の分布を 持ち 、 そ の平均時間は、 A = 10
に おいて 、 FVa と Ca に 対し て 、 そ れぞれ、 104 およ び 105 倍である 。 こ の理由は現在不明で、 根本原因を 探る こ
と は OpenCL の実装がプロ プラ イ エタ リ である ために 困難である 。 し かし な がら 、 そ の影響は大き いサイ ズの入
力 (A > 108 ) を 処理する 場合、 無視でき る 。
102
FPGA with OpenCL
CPU
FPGA with Volvox
1
10
100
Process time (Sec.)
10-1
10-2
10-3
10-4
10-5
10-6
10-7
10-8
101
102
103
104
105
106
107
108
109
Input data size (Bytes)
図 9: 入力データ サイ ズに 対する 処理時間。 マ ーカ ーは平均時間を 示す。 エラ ーバーは、 結果の 90%が含ま れる 区
間を 表す。
3.4.2
strtok 相当関数の呼び出し 回数
図 11 は、 1 秒間の呼び出し 回数の測定結果を 示す。 全体的な 結果は、 実性能のそ れと ほぼ合致する 。 Cs に 対す
る FVs の呼び出し 回数の比率は、 約 7 であり 、 前節で議論し た実性能の比率である 約 10 (TCa /TF Va ) よ り 小さ い。
4 入力データ サイ ズが小さ いと こ ろ での非線形性は、
3.3 節で言及し た clock gettime() に 起因する と 考え ら れる 。
10
図 10: 10 バイ ト の文字列を 使用し た場合の分割器の AXI イ ン タ ーフ ェ イ ス の信号
こ れは、 strtok v() の呼び出し と NULL タ ーミ ネ ータ ーの書き 出し のために CPU に よ る 処理が増え たためと 考
え ら れる 。
一般的に 分割さ れた 単語に 対し て 、 さ ら な る 処理が行われる 。 例え ば、 数値型への変換、 大文字化、 そ れら を
使っ た新し い文字列の作成など である 。 次の複数行の処理を 分割器のカーネ ルが処理し て いる 間に、 こ れら を CPU
で行う こ と ができ る ので、 CPU 負荷の観点から は分割処理がな く なっ たよ う に見え る 。 と にかく 、 こ の結果は我々
のコ ン セ プト が実現可能である こ と を 示し て いる 。
CPU
FPGA w/ OpenCL
FPGA w/ Volvox
0
5x108
The count of calls per 1 second
1x109
図 11: strtok() と 相当する 関数 strtok v() の呼び出し 回数の比較。
4
まとめ
本稿では、 急速な 増加が予想さ れて いる IoT 機器に 向け た FPGA を 用いた文字列分割の研究結果に ついて 報告
し た。 ザイ リ ン ク ス社の高位合成コ ン パイ ラ を 用いたプロ ト タ イ プは、 200MHz で動作し 、 最大 32 の ASCII 文字
を ク ロ ッ ク 毎に 処理する 。 評価結果は、 本目的のために 作成さ れた自製フ レ ーム ワ ーク Volvox と 、 注意深く 調整
さ れたバース ト 転送のためのパラ メ ータ を 用いたプロ ト タ イ プに よ る 処理が CPU に よ る 処理よ り 約 10 倍高速で
あっ た 。 我々 のゴ ールは、 1 節で述べた よ う に FPGA を 透過的に 活用する OS を 提供する こ と であ る 。 今後、 他
の文字列処理機能と 、 FPGA 上でそ れら を 組み合わせた処理を 実現し て いく 。
ザイ リ ン ク ス 社に 対し て 、 OpenCL 開発環境であ る SDAccel の β 版を ラ イ セ ン ス し て 頂いた こ と に 感謝する 。
OpenCL を 用いた結果に は不可解な 部分も ある も のの、 協力し て そ れら を 明ら かに し て いき たい。
参考文献
[1] Gartner’s press release, Gartner says 6.4 Billion Connected ”Things” Will Be in Use in 2016, Up 30 Percent
From 2015.
11
[2] http://hadoop.apache.org/
[3] http://simplecore.intel.com/newsroom/wp-content/uploads/sites/11/2016/03/Intel-Investor-ConferenceCall-Deck.pdf
[4] https://www.xilinx.com/products/technology/power.html
[5] https://www.gnu.org/software/libc/
[6] https://newsroom.intel.com/news-releases/intel-completes-acquisition-of-altera/
[7] https://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html
[8] http://www.armtechcon.com/from-trilobites-to-a-trillion-chips-the-iot-explosion/
[9] http://www.xilinx.com/products/design-tools/vivado/integration/esl-design.html
[10] https://www.khronos.org/
[11] http://www.alpha-data.com/dcp/products.php?product=adm-pcie-7v3
[12] https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt
[13] http://btorpey.github.io/blog/2014/02/18/clock-sources-in-linux/
[14] https://www.xilinx.com/products/intellectual-property/ila.html
12
Fly UP