Publicité
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
Publicité
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
Publicité
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
Prochain SlideShare
第9回ACRiウェビナー_セック/岩渕様ご講演資料第9回ACRiウェビナー_セック/岩渕様ご講演資料
Chargement dans ... 3
1 sur 11
Publicité

Contenu connexe

Présentations pour vous(20)

Similaire à 第9回ACRiウェビナー_日立/島田様ご講演資料(20)

Publicité
Publicité

第9回ACRiウェビナー_日立/島田様ご講演資料

  1. 1 © Hitachi, Ltd. 2022. All rights reserved. 株式会社 日立製作所 研究開発グループ デジタルプラットフォームイノベーションセンタ データストレージ研究部 2022/7/26 島田 健太郎 複雑なアルゴリズムのハード化における高位合成の活用事例 第9回ACRiウェビナー © Hitachi, Ltd. 2022. All rights reserved. 1. 自己紹介 2. 背景:複雑なアルゴリズムのハード化における課題・高位合成の利点 3. 題材:圧縮アルゴリズムLZMA 4. 課題:高位合成の初期試行状況 5. 施策①:メモリアクセス幅拡大 6. 施策②:データフロー化 7. 施策③:文字列比較ループアンローリング 8. 評価:本事例における改善施策の効果 9. 高位合成の活用まとめ Contents 1 0 1
  2. 2 2 © Hitachi, Ltd. 2022. All rights reserved. 1.自己紹介 島田 健太郎 研究開発グループ デジタルプラットフォームイノベーションセンタ データストレージ研究部 所属 • 1993年入社 • 入社当初は、スーパーコンピュータのプロセッサの設計開発に従事 • その後、ハードウェア・アーキテクチャの研究開発に従事 • 論理設計は、ASICで、RTLやゲートレベル設計/スケマティックな設計を経験 • 今回、FPGAを用いて複雑なアルゴリズムをハード化するに当たり、高位合成の活用を行った ゲートレベル設計/スケマティック設計 Adder(int a, int b, int c) { c = a + b; } 高位合成(高位言語記述) a b c 3 © Hitachi, Ltd. 2022. All rights reserved. 2.1 背景(1):複雑なアルゴリズムのハード化における課題 1. 複雑なアルゴリズムをハード化する場合、通常のRTL設計であると、詳細設計・実装設計を含め、 多大な開発工数を要し、ハード化の見通しを得るのに⾧期間かかる 2. 設計当初の段階(仕様設計/機能設計段階)では、性能や物量の見通しが困難 3. 設計した結果を性能等評価できるのが、後工程となり、フィードバックを行う工数大 4. 更に元のアルゴリズムレベルでの最適化を行うと、多大な再設計の工数が発生 詳細設計 (RTL設計) 実装設計 FPGA 論理合成 仕様設計/機能設計 RTL 記述 実装結果 •性能(詳細) •物量(詳細) 機能仕様/アルゴリズム 改善/最適化(フィードバック) (実装改善) 実装情報 (部分的RTL改善) アルゴリズムレベル改善⇒大工数発生 RTL設計過程(イメージ) 2 3
  3. 3 4 © Hitachi, Ltd. 2022. All rights reserved. 2.2 背景(2):複雑なアルゴリズムのハード化における高位合成の利点 1. 高位言語で記述された複雑なアルゴリズムでも、短期間でハードウェア化の見通しが得られる 2. 最低限達成可能な、性能や物量が早期にわかる 3. 性能や物量を、早期にプロファイルデータから見ることにより、フィードバックの工数低減可能 4. アルゴリズムレベルでの最適化が容易 Adder(int a, int b, int c) { c = a + b; } 高位合成 合成結果 高位言語ソース (アルゴリズム記述) FPGA プロファイル データ •性能(全体、関数単位) •物量(同上) •詳細データ(依存関係等) 改善/最適化(フィードバック) 仕様設計/機能設計 高位合成設計過程 (イメージ) 5 © Hitachi, Ltd. 2022. All rights reserved. 3. 題材:圧縮アルゴリズム LZMA • 複雑なアルゴリズムへの適用事例として、圧縮アルゴリズム LZMA(Lempel-Ziv-Markov chain-Algorithm)を取 り上げる。 • LZMAは、圧縮率の高い可逆圧縮アルゴリズム。 辞書圧縮部と、レンジコーダによる符号化部からなる。  辞書圧縮部: ①入力データをバイト列として“辞書”に登録 ②”辞書”の内容を探索し、入力データ内の重複を抽出  レンジコーダ: ①データ重複パターンに基づき、0/1の出現確率を予測 ②予測との差分を符号に生成 • ハード化は、辞書探索の制御が複雑になる辞書圧縮部の 方が、確率計算の反復で処理できるレンジコーダより難 A B C D A B C E 入力 データ A B C D E 圧縮 データ 辞書に登録 4文字前と3字一致 図A. 辞書圧縮部の動作例 先 後 A B C D E 圧縮 データ 4文字前と3字一致 0 0 1 0 1 1 1 0 重複パターンを示す 0/1の記号列(中間コード) 図B. レンジコーダの動作例 先行するビットパターンで次の1bitの0/1の 出現確率を予測 予測との差分を 符号に生成 4 5
  4. 4 6 © Hitachi, Ltd. 2022. All rights reserved. 4. 課題:高位合成の初期試行状況 • LZMAのオープンソース(C言語)をベースに、高位合成を試行  合成することはできた。  性能は、見積りの約1/40(圧縮処理時間40倍)。 • プロファイルデータより要因分析  最大の要因は、辞書圧縮部で、文字列検索のためのハッシュテーブルを更新する箇所 ⇒1バイトずつアクセスし、更新していた。  その他は、辞書圧縮部とレンジコーダ部が逐次に実行される構造。 ⇒辞書圧縮部がレンジコーダ部の処理完了を待つ。  また、辞書圧縮部の文字列検索自体も1文字ずつ比較。 Adder(int a, int b, int c) { c = a + b; } 高位合成 合成結果 高位言語ソース プロファイル データ 改善/最適化(フィードバック) 7 © Hitachi, Ltd. 2022. All rights reserved. 4. 課題:高位合成の初期試行状況 Adder(int a, int b, int c) { c = a + b; } 高位合成 合成結果 高位言語ソース プロファイル データ 改善/最適化(フィードバック) • LZMAのオープンソース(C言語)をベースに、高位合成を試行  合成することはできた。  性能は、見積りの約1/40(圧縮処理時間40倍)。 • プロファイルデータより要因分析  最大の要因は、辞書圧縮部で、文字列検索のためのハッシュテーブルを更新する箇所 ⇒1バイトずつアクセスし、更新していた。 ①メモリのアクセス幅拡大  その他は、辞書圧縮部とレンジコーダ部が逐次に実行される構造。 ⇒辞書圧縮部がレンジコーダ部の処理完了を待つ。 ②データフロー化  また、辞書圧縮部の文字列検索自体も1文字ずつ比較。 ③文字列比較ループアンローリング 6 7
  5. 5 8 © Hitachi, Ltd. 2022. All rights reserved. 5.1 施策①:メモリのアクセス幅拡大(1):概要 コピー元配列 コピー先配列 コピー元配列 コピー先配列 Start i = 0 d[i] = s[i] i < N? End s[] d[] s[] d[] t[] i = i + 1 Start i = 0 t[0] = s[i] t[1] = s[i + 1] ... t[7] = s[i + 7] i < N? End i = i + 8 d[i] = t[0] d[i + 1] = t[1] ... d[i + 7] = t[7] No Yes No Yes • 配列から配列にデータをコピーするケース  配列は、コピー元・コピー先とも、FPGAの内部メモリにマップするケース • 配列から配列へ直接コピーする記述や、ループ・アンローリングがされない 場合に、1要素ずつの逐次コピーになり易い • 途中にレジスタ配列を置き、ループ展開することで複数要素同時にコピー • 配列から配列にデータをコピーするケース  配列は、コピー元・コピー先とも、FPGAの内部メモリにマップするケース • 配列から配列へ直接コピーする記述や、ループ・アンローリングがされない 場合に、1要素ずつの逐次コピーになり易い • 途中にレジスタ配列を置き、ループ展開することで複数要素同時にコピー レジスタ配列 • レジスタ配列を 経由 • ループ・ アンローリング • レジスタ配列を 経由 • ループ・ アンローリング 1要素ずつコピー 複数要素 同時コピー (コピー元/コピー先配列ともFPGA内部 メモリにマップ) 9 © Hitachi, Ltd. 2022. All rights reserved. 5.2 施策①:メモリアクセス幅拡大(2): ハッシュテーブル更新 元の構造 文字列(9文字) 位置 文字列(9文字) ①先頭4文字で ハッシュ値計算 位置 ②一組ずつシフト ③先頭に記録 先 後 ハッシュテーブル 入力データ (辞書) 16bit 8bit×9文字 = 72bit Start ①先頭4文字でハッシュ値を計算 i = 7 i ≧1? ハッシュテーブル[ハッシュ値][i].位置 =ハッシュテーブル[ハッシュ値][i-1].位置 現在位置 j = 0 コピー先文字列[j] = コピー元文字列[j] j = j +1 i = i - 1 j < 9? ハッシュテーブル[ハッシュ値][0].位置 =現在位置 9文字コピー: ハッシュテーブル[ハッシュ値][0].文字列 = 現在位置の文字列 9文字コピー: ハッシュテーブル[ハッシュ値][i].文字列 = ハッシュテーブル[ハッシュ値][i-1].文字列 End 9文字コピー End ②一組ずつシフト ③先頭に記録 • ハッシュテーブルに辞書内の位置と先頭の 9文字ずつが登録されている • 既存内容を移動(シフト)した上で、入力デー タの現在位置からの9文字を新規登録 • ハッシュテーブルに辞書内の位置と先頭の 9文字ずつが登録されている • 既存内容を移動(シフト)した上で、入力デー タの現在位置からの9文字を新規登録 先頭から検査 ハッシュテーブル更新 のフローチャート(元) (サブルーチンで記載) No Yes No Yes (16bit+72bit)×8(シノニム) = 704bit(88byte) 大きなエントリを 1文字(バイト)ずつ 逐次アクセス 8 9
  6. 6 10 © Hitachi, Ltd. 2022. All rights reserved. 5.3 施策①:メモリアクセス幅拡大(3):ハッシュテーブル更新 改善策 • ハッシュテーブルを、位置の情報のテーブルと 文字列のテーブルに分割 • エントリ(位置+文字列8組分)をレジスタに ずらして読上げ、書き戻す • ハッシュテーブルを、位置の情報のテーブルと 文字列のテーブルに分割 • エントリ(位置+文字列8組分)をレジスタに ずらして読上げ、書き戻す 位置 16bit 位置 16bit×8 = 128bit 位置 72bit×8 = 576bit ①先頭4文字で ハッシュ値計算 ②ずらして読み上げ ③先頭に格納 先 後 ハッシュテーブル (分割後) 入力データ (辞書) 16bit 8bit×9文字 = 72bit 現在位置 先頭から検査 文字列(9文字) レジスタ ④書き戻し Start ①先頭4文字でハッシュ値を計算 i = 7 i ≧1? レジスタ(位置)[i] =ハッシュテーブル(位置)[ハッシュ値][i-1] i = i - 1 レジスタ(位置)[0] = 現在位置 9文字コピー(プラグマでアンローリング) レジスタ(文字列)[0]=現在位置の文字列 9文字コピー(プラグマでアンローリング) レジスタ(文字列)[i] = ハッシュテーブル(文字列)[ハッシュ値][i-1] End ②ずらして読み上げ ③先頭に格納 ハッシュテーブル更新の フローチャート(改善版) 位置、文字列をそれぞれ 並列にアクセス No Yes ハッシュテーブル(位置)[ハッシュ値][0~7] = レジスタ(位置)[0~7] 9文字コピー(プラグマでアンローリング)×8: ハッシュテーブル(文字列)[ハッシュ値][0~7] = レジスタ(文字列)[0~7] ④書き戻し ② ④ ③ 11 © Hitachi, Ltd. 2022. All rights reserved. 6.1 施策②:データフロー化(1) データーフロー化適用前 • 二つの処理を含むループ • それぞれの処理の間で、変数を用いて、一方から他方へデータを受け渡し ⇒それぞれの回路が逐次動作となる • 二つの処理を含むループ • それぞれの処理の間で、変数を用いて、一方から他方へデータを受け渡し ⇒それぞれの回路が逐次動作となる Start 初期化処理 処理a 終了判定 処理b End 終了処理 変数 変数 変数 初期化処理 回路 処理a 回路 処理b 回路 判定回路 終了処理 回路 初期データ 中間データ 出力データ 繰返し 信号 終了データ 時間軸 T1 T2 T3 T4 T5 T6 T7 T8 初期化回路 動作 処理a 回路 動作 動作 動作 処理b 回路 動作 動作 判定回路 動作 動作 終了処理回路 逐次動作:3サイクルピッチ 処理フローチャート 回路構成 10 11
  7. 7 12 © Hitachi, Ltd. 2022. All rights reserved. 6.2 施策②:データフロー化(2) データフロー化適用後 • 二つの処理のループを分割 • 分割したループの処理の間で、FIFO(ストリーム変数)を用いてデータを受け渡し ⇒それぞれの回路の並列動作が可能となる • 二つの処理のループを分割 • 分割したループの処理の間で、FIFO(ストリーム変数)を用いてデータを受け渡し ⇒それぞれの回路の並列動作が可能となる Start 初期化処理 処理a 終了判定b 処理b End 終了処理 変数 変数 初期化処理 回路 処理a 回路 処理b 回路 判定b回路 終了処理 回路 初期データ 中間データ 出力データ 繰返し 信号 終了データ 時間軸 T1 T2 T3 T4 T5 T6 T7 T8 初期化回路 動作 処理a 回路 動作 動作 動作 動作 判定a回路 動作 動作 動作 処理b 回路 動作 動作 動作 判定b回路 動作 動作 終了処理回路 終了判定a 判定a回路 中間データ 中間データ FIFO 繰返し 信号 FIFO 並列(オーバーラップ)動作: 2サイクルピッチ 13 © Hitachi, Ltd. 2022. All rights reserved. 6.3 施策②:データフロー化(3) LZMAにおける適用 • 辞書圧縮部と、レンジコーダの呼び出しに適用 ⇒辞書圧縮部と、レンジコーダを並列動作させ、動作時間をほぼ半減 • 辞書圧縮部と、レンジコーダの呼び出しに適用 ⇒辞書圧縮部と、レンジコーダを並列動作させ、動作時間をほぼ半減 Start 辞書圧縮部 終了? レンジコーダ End Start 辞書圧縮部 終了? レンジコーダ End 終了? No Yes No Yes 時間軸 T1 T2 T3 T4 T5 T6 辞書圧縮部 動作 動作 動作 レンジコーダ 動作 動作 動作 辞書圧縮回路 レンジコーダ回路 中間データ 圧縮データ 平文データ 繰返し 信号 No Yes 時間軸 T1 T2 T3 T4 T5 T6 辞書圧縮部 動作 動作 動作 動作 動作 動作 レンジコーダ 動作 動作 動作 動作 動作 FIFO 辞書圧縮回路 レンジコーダ回路 中間データ 圧縮データ 平文データ FIFO 中間データ 12 13
  8. 8 14 © Hitachi, Ltd. 2022. All rights reserved. 7.1 施策③:文字列比較ループアンローリング(1):アンローリング適用前 • 配列中の二つの文字列を比較し、連続し て一致する文字数を数える  配列はFPGA内メモリへマップされている  二つの文字列とも、配列中の任意の位 置から、始まる  最大の比較文字数が指定される • 単純にプログラム記述すると、1文字 (1byte)ずつの比較となる。  ループ中に(ループ変数を使った)文字 数判定の条件文があるので、アンローリ ングされても1文字ずつの逐次処理と なる(並列処理されない)  配列のアクセスも、それぞれの文字列を 1文字ずつのアクセスとなる • 配列中の二つの文字列を比較し、連続し て一致する文字数を数える  配列はFPGA内メモリへマップされている  二つの文字列とも、配列中の任意の位 置から、始まる  最大の比較文字数が指定される • 単純にプログラム記述すると、1文字 (1byte)ずつの比較となる。  ループ中に(ループ変数を使った)文字 数判定の条件文があるので、アンローリ ングされても1文字ずつの逐次処理と なる(並列処理されない)  配列のアクセスも、それぞれの文字列を 1文字ずつのアクセスとなる N bytes 文字列a (先頭位置a) 文字列b (先頭位置b) N bytes 文字列が格納されている配列: (FPGA内部メモリへマップ) Start i = 0 i < N? End i = i + 1 i文字目は 一致したか No Yes No Yes N:最大比較文字数 連続して一致する文字数を数える 最大比較 文字数N 未満か 文字列検索(比較)の フローチャート(元) 15 © Hitachi, Ltd. 2022. All rights reserved. 7.2 施策③:文字列比較ループアンローリング(2):条件分岐への対応 •1文字ずつの比較を行う条 件文と、ループの繰返しを分 ける I. アンロールする数を決め る(右例では、8) II. 最大比較文字数に至る まで、アンロールした数分 の比較を行い、一致数 を数える III. ループの繰返しは、数え た一致数が、アンロール した数まで達したかどうか で判定する •1文字ずつの比較を行う条 件文と、ループの繰返しを分 ける I. アンロールする数を決め る(右例では、8) II. 最大比較文字数に至る まで、アンロールした数分 の比較を行い、一致数 を数える III. ループの繰返しは、数え た一致数が、アンロール した数まで達したかどうか で判定する Start i = 0 i < N? End 1文字目は 一致したか ? No Yes No Yes 次の1文字目は、 N文字未満か C = 0 i + 1 < N? 2文字目は 一致したか ? No Yes No Yes C = 1 0文字一致 2文字目は、 N文字未満か 1文字一致 Yes i + 7 < N? 8文字目は 一致したか ? No Yes No Yes C = 7 8文字目は、 N文字未満か 7文字一致 C = 8 i = i + C C < 8? No Yes 8文字一致 一致した文字 数を合計 Ⅱ.一致文字数 を数える ③ ③ ① ② ① ② 繰返し Ⅲ. 一致数は アンロールした 数か? C:一致文字数 N:最大比較文字数 Ⅰ.アンロール数を決める(8) 14 15
  9. 9 16 © Hitachi, Ltd. 2022. All rights reserved. 7.3 施策③:文字列比較ループアンローリング(3):配列アクセスへの対応 •レジスタ配列を二つ使用、それぞれの文字列を レジスタ配列に一旦格納して比較  文字列を格納する配列を、アクセス幅(右 例ではアンロール数に合わせた8Byte)を単 位とする二次元配列とする  レジスタ配列は、一回の配列アクセス幅 (8)の2倍(16)の要素数とする  比較はレジスタ配列上で、それぞれの文字 列位置から、一回に最大アンロール数分 =アクセス幅分の文字数(8)を比較  比較後、レジスタ配列の内容をシフト 1. レジスタ配列の後半内容を前半にコピー 2. 文字列を格納する配列からアクセス幅 (8Byte)分読出し、レジスタ配列の後 半に格納 •レジスタ配列を二つ使用、それぞれの文字列を レジスタ配列に一旦格納して比較  文字列を格納する配列を、アクセス幅(右 例ではアンロール数に合わせた8Byte)を単 位とする二次元配列とする  レジスタ配列は、一回の配列アクセス幅 (8)の2倍(16)の要素数とする  比較はレジスタ配列上で、それぞれの文字 列位置から、一回に最大アンロール数分 =アクセス幅分の文字数(8)を比較  比較後、レジスタ配列の内容をシフト 1. レジスタ配列の後半内容を前半にコピー 2. 文字列を格納する配列からアクセス幅 (8Byte)分読出し、レジスタ配列の後 半に格納 8bytes 前半 後半 アクセル幅(8byte)単位に読出し、 レジスタ配列の後半に格納 レジスタ配列a 一回の比較対象 (最大8文字) 文字列b (先頭位置b) 文字列a (先頭位置a) 文字列が格納されている配列: (2次元配列として、FPGA内部 メモリへマップ) 前半 後半 レジスタ配列b 後半から 前半へ コピー 後半から 前半へ コピー N bytes N bytes 一回当たりの 読出し単位 一回当たりの 読出し単位 17 © Hitachi, Ltd. 2022. All rights reserved. 7.4 施策③:文字列比較ループアンローリング(4):改善後 8bytes N bytes N bytes 前半 後半 レジスタ配列a 一回の比較対象 (最大8文字) 文字列b (先頭位置b) 文字列a (先頭位置a) 文字列が格納されている配列: 前半 後半 レジスタ配列b • ループ開始前の初期化でレジスタ配列の最 初の内容、文字列比較位置を準備 • 繰返し時にレジスタ配列内容を順にシフト • ループ開始前の初期化でレジスタ配列の最 初の内容、文字列比較位置を準備 • 繰返し時にレジスタ配列内容を順にシフト Start i < N? レジスタ配列a[x]= レジスタ配列b[y]? No Yes No Yes C = 0 ③ ① ② レジスタ配列a[] ← 文字列aの先頭含む8byte + 次の8byte レジスタ配列b[] ← 文字列bの先頭含む8byte + 次の8byte x = 文字列aの開始位置(8の剰余) y = 文字列bの開始位置(8の剰余) i = 0 End Yes i + 7 < N? No Yes No Yes C = 7 C = 8 i = i + C C < 8? No Yes ③ ① ② 繰返し レジスタ配列a[x+7]= レジスタ配列b[y+7]? レジスタ配列aの内容シフト (配列前半←配列後半、 配列後半←文字列aの 次の8byte) レジスタ配列bの内容シフト (配列前半←配列後半、 配列後半←文字列bの 次の8byte) y x (文字列aの開始 位置の8の剰余) (文字列bの開始 位置の8の剰余) 16 17
  10. 10 18 © Hitachi, Ltd. 2022. All rights reserved. 8. 評価:本事例における改善施策の効果 • LZMAの高位合成を、以下の三種の改善策により、改善した ① メモリのアクセス幅拡大: ハッシュテーブル更新に適用 ② データフロー化:辞書圧縮部とレンジコーダ、及びレンジコーダ内部へ適用 ③ 文字列比較ループアンローリング:文字列検索に適用 • 改善の結果、ほぼ見積り通りになった(下表)。 見積り 改善前 改善後 主な改善策 全体処理時間 500μS (1.0) 21,540μS (43.1) 516μS (1.0) ② 辞書圧縮部 - 17,461μS 476μS ハッシュテーブル更新 - 12,007μS 246μS ① 文字列検索 - 4,584μS 176μS ③ レンジコーダ - 3,339μS 250μS ② ■32KBのデータの圧縮処理における処理時間の改善結果 19 © Hitachi, Ltd. 2022. All rights reserved. 9. 高位合成の活用まとめ • LZMAを題材とした本事例では、高位合成のプロファイルデータを分析し、元の高位言語ソースの記述へ フィードバックすることで、複雑なアルゴリズムの最適化を行うことができた。 • このような高位合成におけるアルゴリズムレベルの最適化は、複雑なアルゴリズムをハード化する場合の、上流 工程としても活用することが可能。  全体をRTL設計で行うのに比べて、開発工数を大きく短縮することが可能 Adder(int a, int b, int c) { c = a + b; } 高位合成 プロファイル データ 改善/最適化(フィードバック) 上流工程(高位合成) (アルゴルズムレベル最適化) 下流工程(RTL設計) 仕様設計/機能設計 高位言語ソース (アルゴリズム記述) 詳細設計 (RTL設計) RTL 記述 アルゴリズム (最適化済み) 改善のための 手戻り不要 開発工数短縮 = 18 19
  11. 11 © Hitachi, Ltd. 2022. All rights reserved. 20 END 複雑なアルゴリズムのハード化における高位合成の活用事例 第9回ACRiウェビナー 2022/7/26 株式会社 日立製作所 研究開発グループ デジタルプラットフォームイノベーションセンタ データストレージ研究部 島田 健太郎 20 21
Publicité