Altera SDK for OpenCL 勉強会 プロファイラ GUI を用いたコード分析 @h_suzuki
Altera SDK for OpenCL 勉強会
プロファイラGUIを用いたコード分析
@h_suzuki
• 「プロファイラGUIを用いたコード分析」というタイトルを最初に決めたものの、Altera SDK for
OpenCL の開発フロー全体像がないとイメージできないのでは…
•という事で全体にも簡単に触れます。
目次
• OpenCL 実装モデルと BSP
• Guaranteed タイミングフロー
• カーネル・プログラム開発フロー
• エミュレータ
• オプティマイゼーション・レポート
• エリア・レポート
• プロファイラ
• 処理データサイズの違いによるパイプライン稼働率の確認
• まとめ
• 参照資料
• Tips
Altera SDK for OpenCL
OpenCL モデル < Stratix V の PCIe カード・モデル >
4
Host Code
main() { read_data( … ); manipulate( … ); clEnqueueWriteBuffer( … ); clEnqueueNDRange(…,sum,…); clEnqueueReadBuffer( … ); display_result( … ); } Standard
gcc
Compiler
EXE
Altera
Offline
Compiler
AOCX
__kernel void sum (__global float *a, __global float *b, __global float *y) { int gid = get_global_id(0); y[gid] = a[gid] + b[gid]; }
Verilog
Quartus II
OpenCL Accelerator Code
PCIe カードタイプでは、 clEnqueueWriteBuffer I の実行によりホスト( PC ) のメインメモリから、PCIe 経由でターゲット (FPGA )のメインメモリへデータを転送
OpenCL 開発の仕組み : BSP
5
PCIe gen2x8
Host Interface
インターコネクト
DDR3 メモリ
インターフェース
10Gb MAC/UOE
Data Interface
10Gb MAC/UOE
Data Interface
DDR3 メモリ
インターフェース
QDRII メモリ
インターフェース
QDRII メモリ
インターフェース OpenCL
Kernels
OpenCL
Kernels
DDR
DDR
QDR
QDR
10G
ネットワーク
ホスト
OpenCL開発するには BSP が必要。
全ての評価ボードで OpenCL 開発できるわけではないので注意
標準のFPGA 開発ツールで
BSP を設計
OpenCL コンパイラで
ビルドしたモジュールが
BSP
OpenCL コンパイル手法
Guaranteed タイミングフロー
6
kernel.cl
AOC
Synthesis / P&R / STA on the
OpencL Kernels ONLY
Reconfig kernel PLL
DONE!
Post-fit QXP partition (PCIe,
UniPHY, DMA, …) Boardspec.xml
Re-run STA with the new
PLL value
Meet
Timin
g No
Yes
タイミングがメットしたら
PLL の値を ROM に保持
Altera SDK for OpenCL
OpenCL カーネル・プログラム開発フロー
7
OpenCL カーネル・プログラムの作成
○ PC 上での検証
・x86 エミュレータ
・オプティマイゼーションレポート
・Visualizer
( コンパイル時間 : sec ~ min )
○ 実機検証 ・プロファイラ GUI
( コンパイル時間 : hours )
要求性能を 満たせていない場合
DONE!
・基本デバッグ(文法/機能) ・パイプラインのストール多
・消費リソース多
エミュレータ
• カーネル・プログラムを x86 用にコンパイル するオプション
• 生成される aocx は x86 の実行体
• カーネルプログラム内で printf を使用したデバッグ
• 適用方法
• コンパイル時に -march=emulator を追加
• $ aoc -v --report -march=emulator vector_add.cl -o vector_add.aocx --board s5phq
オプティマイゼーション・レポート
• ループ文におけるキャリーの依存やループ展開など性能に影響を与える要因となる項目の解析を行う
• -g はコンパイル時間やメモリにあまり影響しないため常にONを推奨
• レポートは下記のコマンド例では、tdfir/tdfir.log として生成される
• 適用方法
• コンパイル時に -g を追加
• $ aoc -v -g --report -c device/tdfir.cl -o tdfir.aocx --board s5phq
エリア・レポート
• 消費リソースのマッピングを解析、表示するツール
• どの行でどの程度のリソース消費するかを確認
• 適用方法
• コンパイル時に -g を追加し、生成される aoco/aocx に対して以下を実行
• HTML ファイルが生成される
• $ aocl analyze-area <kernel_name>.aoco
• $ aocl analyze-area <kernel_name>.aocx
プロファイラ
ボトルネックが
• 外部メモリ転送にあるのか
• ホスト・デバイス間の通信にあるのか
• カーネル・プログラムにあるのか
• チャネル転送にあるのか
を実機を使って確認するツール
※アルテラのベンダ拡張機能。
OpenCL コードと Qsys IP を Avalone-ST で
通信する I/O チャネル 、カーネル・プログラム間を
通信するデータチャネルの2種類のチャネル転送がある
カーネルA
BittWare社の Arria 10 GX 搭載ボード、A10PL4
プロファイラの仕組み
• Altera SDK for OpenCL では、 カーネル・プログラムのコード が ハードウェア化されてパイプラインが構築される
• 生成した パイプラインに パフォーマンス・カウンタ と プロファイリングロジック を実装し、実機実行時に統計情報を取得
プロファイラの仕組み
• 物理的にカウンタを実装するため
• リソースへの影響:有り
• 性能への影響:有り
Profiler ALUTs Registers Logic utilization DSP Memory bits RAM blocks fmax
vector_add No 41795 59902 40628 0 1686880 351 288
vector_add Yes 43718 61915 41690 0 1686880 351 279
channelizer No 138616 221048 113430 196 8477664 729 276
channelizer Yes 144324 226809 116827 196 8477664 729 271
tdfir No 228931 353738 176046 512 2213954 352 263
tdfir Yes 229290 356544 275054 512 2213954 352 261
jpeg_decoder No 101077 176700 94906 160 5334304 751 182
jpeg_decoder Yes 138790 214375 115218 160 5334304 751 180
プロファイラを適用時の消費リソース差分及び fmax 差分
( ツール : Quartus Prime Standard v16.0.0 b211、ターゲットボード : BittWare S5PHQ D8 )
プロファイラの利用方法
• 適用方法
• コンパイル時に --profile を追加
• $ aoc -v --report --profile vector_add.cl -o vector_add.aocx --board s5phq
• 使用方法
• 実機実行完了後、統計情報がファイル( profile.mon )に書き出されるのでユーティリティ・ツール、aocl を使用してプロファイラ起動する
• $ aocl report vector_add.aocx profile.mon
プロファイラ GUI の見方
Source Code タブ
• Altera SDK for OpenCL で構築したパイプラインにおいて、ストールが発生している箇所、メモリ転送の効率を確認できる
タブ名 説明
Attributes メモリ転送やチャネル転送の属性を表す
メモリタイプ: ローカル、グローバル
対象のメモリ: DDR、QDR
転送の種類 : リードやライトなど
Stall% メモリ及びチャネルアクセスによりパイプラインがストールしている割合
Occupancy% カーネルプログラムがメモリ転送及びチャネル転送を実行している割合
Bandwidth 平均のメモリ・アクセス速度及び効率
転送サイズとロード、ストアユニットの数によって効率が変わる
プロファイラ GUI の見方
Source Code タブ
• Occupancy% が低い • パイプラインの稼働率が低い
• カーネル実行していない期間が長いこととなり性能低下の要因となる
• Stall% が高い • メモリアクセス、チャネル通信が競合
• アクセス・パターンがよくない
• チャネル通信においてリードとライトが大きく不均衡になっている
• Bandwidth の Efficiency が低い • 有効なデータを得るのに帯域が多く必要
• アクセス・パターンがよくない
• 扱うデータ量が少なくオーバーヘッドが大きい
プロファイラ GUI の見方
Kernel Execution タブ
• カーネル・プログラム全体の実行プロセスをグラフィカルに表示
• 各カーネル・プログラムの実行時間及び相互関係を表示
• ホスト・プロセッサ上のデータを PCIe 経由で デバイスのグローバル・メモリに転送
• デフォルトでは表示されないため、ホスト・プログラム実行前に環境変数、
ACL_PROFILE_TIMER を 1 に設定すること
• $ export ACL_PROFILE_TIMER=1
プロファイラ GUI の見方
<Kernel 名> タブ
• カーネル・プログラムの動作周波数 ( fmax )
• パイプラインが使用しているメモリの帯域
処理データサイズの違いによる
パイプライン稼働率の確認
使用するプログラム: vector_add
• 浮動小数点の足し算のサンプル・プログラム
• 問題数を増減させてパイプラインの稼働率とプロファイラの表示を確認
// ホストアプリケーション main.cpp
// Problem data.
unsigned N = 1000000; // problem size
scoped_array<scoped_aligned_ptr<float> > input_a, input_b; // num_devices elements
scoped_array<scoped_aligned_ptr<float> > output; // num_devices elements
// OpenCL カーネル・プログラム
__kernel void vector_add(__global const float *x,
__global const float *y,
__global float *restrict z)
{
// get index of the work item
int index = get_global_id(0);
// add the vector elements
z[index] = x[index] + y[index];
}
N=1
• Bandwidth / Efficiency が低く、濃い赤で表示される
• Occupancy% は 1.1% …
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
1 0 1.1 196.4 6.3 0.532 0.029 32.9
N=10
• Bandwidth / Efficiency が依然として低く、赤で表示される
• Occupancy% は 9.9%
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
10 0 9.9 180.8 62.5 0.351 0.014 681.2
N=100
• Bandwidth / Efficiency があがったが薄い赤で表示される
• Occupancy% は 50.6%
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
100 0 50.6 651.2 89.3 0.553 0.024 3973.6
N=1000
• Bandwidth / Efficiency が通常の色になった
• Occupancy% は 88.5%
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
1000 0 88.5 1026.0 99.2 0.903 0.042 22706.5
N=10000
• Efficiency は 100%。
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
10000 0 98.9 1136.6 100.0 0.876 0.066 144496.1
N=100000
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
100000 0 99.9 1148.0 100.0 2.036 0.415 229801.0
N=1000000
• vector_add のサンプルにおけるデフォルト値
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
1000000 0 100.0 1150.0 100.0 9.368 3.531 270086.2
N=10000000
• N=1000000 の時とスループットは同等
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
10000000 0 100.0 1150.0 100.0 81.121 34.806 273997.1
データサイズの違いによる効率の差
N Stall% Occupancy% Bandwidth[MB/s] Efficiency[%] Turnaround Time[ms] Kernel Time[ms] Thoughput[MB/s]
1 0 1.1 196.4 6.3 0.532 0.029 32.9
10 0 9.9 180.8 62.5 0.351 0.014 681.2
100 0 50.6 651.2 89.3 0.553 0.024 3973.6
1000 0 88.5 1026.0 99.2 0.903 0.042 22706.5
10000 0 98.9 1136.6 100.0 0.876 0.066 144496.1
100000 0 99.9 1148.0 100.0 2.036 0.415 229801.0
1000000 0 100.0 1150.0 100.0 9.368 3.531 270086.2
10000000 0 100.0 1150.0 100.0 81.121 34.806 273997.1
N=10000
N=1000000
おまけ
• Multithread Vector Operation Design Example ( NEW !! )
• コマンド・キューを 2個用意して マルチスレッドで複数カーネルを動作
• C=A x B と C=A + B
↑ デフォルトのコードを実行した際のプロファイラ表示
↑ ベリファイのコード削除
まとめ
•カーネルの実行時間、パイプラインの稼働率、メモリアクセスの効率をグラフィカルに表示できるプロファイラはボトルネック解析に便利
•エミュレータ、オプティマイゼーション・レポートによるPC上での検証とあわせてそれぞれのツールをうまく使う事で開発効率向上が期待できる
参照資料
• Altera SDK for OpenCL Programming Guide (2016.05.02)
• https://www.altera.com/en_US/pdfs/literature/hb/opencl-
sdk/aocl_programming_guide.pdf
• Altera SDK for OpenCL Best Practices Guide (2016.05.02)
• https://www.altera.com/en_US/pdfs/literature/hb/opencl-sdk/aocl-best-practices-
guide.pdf
• OpenCL Vector Addition Design Example ( v16.0 )
• https://www.altera.com/support/support-resources/design-
examples/design-software/opencl/vector-addition.html
• Multithread Vector Operation Design Example( v16.0 )
• https://www.altera.com/support/support-resources/design-
examples/design-software/opencl/multithreaded-vector-operation.html
ご清聴ありがとうございました