Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

プロファイラGuiを用いたコード分析 20160610

1,105 views

Published on

Altera SDK for OpenCL のボトルネック解析ツール、プロファイラ GUI について発表した資料です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

プロファイラGuiを用いたコード分析 20160610

  1. 1. Altera SDK for OpenCL勉強会 プロファイラGUIを用いたコード分析 @h_suzuki
  2. 2. • 「プロファイラGUIを用いたコード分析」というタ イトルを最初に決めたものの、Altera SDK for OpenCL の開発フロー全体像がないとイメー ジできないのでは… • という事で全体にも簡単に触れます。
  3. 3. 目次 • OpenCL 実装モデルと BSP • Guaranteed タイミングフロー • カーネル・プログラム開発フロー • エミュレータ • オプティマイゼーション・レポート • エリア・レポート • プロファイラ • 処理データサイズの違いによるパイプライン稼働率の確認 • まとめ • 参照資料 • Tips
  4. 4. Altera SDK for OpenCL OpenCL モデル < StratixV の 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 )のメインメモリへデータを転送
  5. 5. 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
  6. 6. 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 に保持
  7. 7. Altera SDK for OpenCL OpenCL カーネル・プログラム開発フロー 7 OpenCL カーネル・プログラムの作成 ○ PC 上での検証 ・x86 エミュレータ ・オプティマイゼーションレポート ・Visualizer ( コンパイル時間 : sec ~ min ) ○ 実機検証 ・プロファイラ GUI ( コンパイル時間 : hours ) 要求性能を 満たせていない場合 DONE! ・基本デバッグ(文法/機能) ・パイプラインのストール多 ・消費リソース多
  8. 8. エミュレータ • カーネル・プログラムを x86 用にコンパイル するオプション • 生成される aocx は x86 の実行体 • カーネルプログラム内で printf を使用したデバッグ • 適用方法 • コンパイル時に -march=emulator を追加 • $ aoc -v --report -march=emulator vector_add.cl -o vector_add.aocx --board s5phq
  9. 9. オプティマイゼーション・レポート • ループ文におけるキャリーの依存やループ展開など性能に影響を与える 要因となる項目の解析を行う • -g はコンパイル時間やメモリにあまり影響しないため常にONを推奨 • レポートは下記のコマンド例では、tdfir/tdfir.log として生成される • 適用方法 • コンパイル時に -g を追加 • $ aoc -v -g --report -c device/tdfir.cl -o tdfir.aocx --board s5phq
  10. 10. エリア・レポート • 消費リソースのマッピングを解析、表示するツール • どの行でどの程度のリソース消費するかを確認 • 適用方法 • コンパイル時に -g を追加し、生成される aoco/aocx に対して以下を実行 • HTML ファイルが生成される • $ aocl analyze-area <kernel_name>.aoco • $ aocl analyze-area <kernel_name>.aocx
  11. 11. プロファイラ ボトルネックが • 外部メモリ転送にあるのか • ホスト・デバイス間の通信にあるのか • カーネル・プログラムにあるのか • チャネル転送にあるのか を実機を使って確認するツール ※アルテラのベンダ拡張機能。 OpenCL コードと Qsys IP を Avalone-ST で 通信する I/O チャネル 、カーネル・プログラム間を 通信するデータチャネルの2種類のチャネル転送がある カーネルA BittWare社の Arria 10 GX 搭載ボード、A10PL4
  12. 12. プロファイラの仕組み • Altera SDK for OpenCL では、 カーネル・プログラムのコード が ハード ウェア化されてパイプラインが構築される • 生成した パイプラインに パフォーマンス・カウンタ と プロファイリングロ ジック を実装し、実機実行時に統計情報を取得
  13. 13. プロファイラの仕組み • 物理的にカウンタを実装するため • リソースへの影響:有り • 性能への影響:有り 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 )
  14. 14. プロファイラの利用方法 • 適用方法 • コンパイル時に --profile を追加 • $ aoc -v --report --profile vector_add.cl -o vector_add.aocx --board s5phq • 使用方法 • 実機実行完了後、統計情報がファイル( profile.mon )に書き出されるのでユー ティリティ・ツール、aocl を使用してプロファイラ起動する • $ aocl report vector_add.aocx profile.mon
  15. 15. プロファイラ GUI の見方 Source Code タブ • Altera SDK for OpenCL で構築したパイプラインにおいて、ストールが 発生している箇所、メモリ転送の効率を確認できる タブ名 説明 Attributes メモリ転送やチャネル転送の属性を表す メモリタイプ: ローカル、グローバル 対象のメモリ: DDR、QDR 転送の種類 : リードやライトなど Stall% メモリ及びチャネルアクセスによりパイプラインがストールしている割合 Occupancy% カーネルプログラムがメモリ転送及びチャネル転送を実行している割合 Bandwidth 平均のメモリ・アクセス速度及び効率 転送サイズとロード、ストアユニットの数によって効率が変わる
  16. 16. プロファイラ GUI の見方 Source Code タブ • Occupancy% が低い • パイプラインの稼働率が低い • カーネル実行していない期間が長いこととなり性能低下の要因となる • Stall% が高い • メモリアクセス、チャネル通信が競合 • アクセス・パターンがよくない • チャネル通信においてリードとライトが大きく不均衡になっている • Bandwidth の Efficiency が低い • 有効なデータを得るのに帯域が多く必要 • アクセス・パターンがよくない • 扱うデータ量が少なくオーバーヘッドが大きい
  17. 17. プロファイラ GUI の見方 Kernel Execution タブ • カーネル・プログラム全体の実行プロセスをグラフィカルに表示 • 各カーネル・プログラムの実行時間及び相互関係を表示 • ホスト・プロセッサ上のデータを PCIe 経由で デバイスのグローバル・メモ リに転送 • デフォルトでは表示されないため、ホスト・プログラム実行前に環境変数、 ACL_PROFILE_TIMER を 1 に設定すること • $ export ACL_PROFILE_TIMER=1
  18. 18. プロファイラ GUI の見方 <Kernel 名> タブ • カーネル・プログラムの動作周波数 ( fmax ) • パイプラインが使用しているメモリの帯域
  19. 19. 処理データサイズの違いによる パイプライン稼働率の確認
  20. 20. 使用するプログラム: 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]; }
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. 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
  29. 29. データサイズの違いによる効率の差 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
  30. 30. おまけ • Multithread Vector Operation Design Example ( NEW !! ) • コマンド・キューを 2個用意して マルチスレッドで複数カーネルを動作 • C=A x B と C=A + B ↑ デフォルトのコードを実行した際のプロファイラ表示 ↑ ベリファイのコード削除
  31. 31. まとめ • カーネルの実行時間、パイプラインの稼働率、メモリ アクセスの効率をグラフィカルに表示できるプロファイ ラはボトルネック解析に便利 • エミュレータ、オプティマイゼーション・レポートによる PC上での検証とあわせてそれぞれのツールをうまく 使う事で開発効率向上が期待できる
  32. 32. 参照資料 • 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
  33. 33. ご清聴ありがとうございました

×