Top Banner
Altera SDK for OpenCL 勉強会 プロファイラ GUI を用いたコード分析 @h_suzuki
33

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

Jan 21, 2018

Download

Technology

HIDEOMI SUZUKI
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: プロファイラGuiを用いたコード分析 20160610

Altera SDK for OpenCL 勉強会

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

@h_suzuki

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

• 「プロファイラGUIを用いたコード分析」というタイトルを最初に決めたものの、Altera SDK for

OpenCL の開発フロー全体像がないとイメージできないのでは…

•という事で全体にも簡単に触れます。

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

目次

• OpenCL 実装モデルと BSP

• Guaranteed タイミングフロー

• カーネル・プログラム開発フロー

• エミュレータ

• オプティマイゼーション・レポート

• エリア・レポート

• プロファイラ

• 処理データサイズの違いによるパイプライン稼働率の確認

• まとめ

• 参照資料

• Tips

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

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 )のメインメモリへデータを転送

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

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

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

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 に保持

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

Altera SDK for OpenCL

OpenCL カーネル・プログラム開発フロー

7

OpenCL カーネル・プログラムの作成

○ PC 上での検証

・x86 エミュレータ

・オプティマイゼーションレポート

・Visualizer

( コンパイル時間 : sec ~ min )

○ 実機検証 ・プロファイラ GUI

( コンパイル時間 : hours )

要求性能を 満たせていない場合

DONE!

・基本デバッグ(文法/機能) ・パイプラインのストール多

・消費リソース多

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

エミュレータ

• カーネル・プログラムを x86 用にコンパイル するオプション

• 生成される aocx は x86 の実行体

• カーネルプログラム内で printf を使用したデバッグ

• 適用方法

• コンパイル時に -march=emulator を追加

• $ aoc -v --report -march=emulator vector_add.cl -o vector_add.aocx --board s5phq

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

オプティマイゼーション・レポート

• ループ文におけるキャリーの依存やループ展開など性能に影響を与える要因となる項目の解析を行う

• -g はコンパイル時間やメモリにあまり影響しないため常にONを推奨

• レポートは下記のコマンド例では、tdfir/tdfir.log として生成される

• 適用方法

• コンパイル時に -g を追加

• $ aoc -v -g --report -c device/tdfir.cl -o tdfir.aocx --board s5phq

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

エリア・レポート

• 消費リソースのマッピングを解析、表示するツール

• どの行でどの程度のリソース消費するかを確認

• 適用方法

• コンパイル時に -g を追加し、生成される aoco/aocx に対して以下を実行

• HTML ファイルが生成される

• $ aocl analyze-area <kernel_name>.aoco

• $ aocl analyze-area <kernel_name>.aocx

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

プロファイラ

ボトルネックが

• 外部メモリ転送にあるのか

• ホスト・デバイス間の通信にあるのか

• カーネル・プログラムにあるのか

• チャネル転送にあるのか

を実機を使って確認するツール

※アルテラのベンダ拡張機能。

OpenCL コードと Qsys IP を Avalone-ST で

通信する I/O チャネル 、カーネル・プログラム間を

通信するデータチャネルの2種類のチャネル転送がある

カーネルA

BittWare社の Arria 10 GX 搭載ボード、A10PL4

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

プロファイラの仕組み

• Altera SDK for OpenCL では、 カーネル・プログラムのコード が ハードウェア化されてパイプラインが構築される

• 生成した パイプラインに パフォーマンス・カウンタ と プロファイリングロジック を実装し、実機実行時に統計情報を取得

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

プロファイラの仕組み

• 物理的にカウンタを実装するため

• リソースへの影響:有り

• 性能への影響:有り

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 )

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

プロファイラの利用方法

• 適用方法

• コンパイル時に --profile を追加

• $ aoc -v --report --profile vector_add.cl -o vector_add.aocx --board s5phq

• 使用方法

• 実機実行完了後、統計情報がファイル( profile.mon )に書き出されるのでユーティリティ・ツール、aocl を使用してプロファイラ起動する

• $ aocl report vector_add.aocx profile.mon

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

プロファイラ GUI の見方

Source Code タブ

• Altera SDK for OpenCL で構築したパイプラインにおいて、ストールが発生している箇所、メモリ転送の効率を確認できる

タブ名 説明

Attributes メモリ転送やチャネル転送の属性を表す

メモリタイプ: ローカル、グローバル

対象のメモリ: DDR、QDR

転送の種類 : リードやライトなど

Stall% メモリ及びチャネルアクセスによりパイプラインがストールしている割合

Occupancy% カーネルプログラムがメモリ転送及びチャネル転送を実行している割合

Bandwidth 平均のメモリ・アクセス速度及び効率

転送サイズとロード、ストアユニットの数によって効率が変わる

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

プロファイラ GUI の見方

Source Code タブ

• Occupancy% が低い • パイプラインの稼働率が低い

• カーネル実行していない期間が長いこととなり性能低下の要因となる

• Stall% が高い • メモリアクセス、チャネル通信が競合

• アクセス・パターンがよくない

• チャネル通信においてリードとライトが大きく不均衡になっている

• Bandwidth の Efficiency が低い • 有効なデータを得るのに帯域が多く必要

• アクセス・パターンがよくない

• 扱うデータ量が少なくオーバーヘッドが大きい

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

プロファイラ GUI の見方

Kernel Execution タブ

• カーネル・プログラム全体の実行プロセスをグラフィカルに表示

• 各カーネル・プログラムの実行時間及び相互関係を表示

• ホスト・プロセッサ上のデータを PCIe 経由で デバイスのグローバル・メモリに転送

• デフォルトでは表示されないため、ホスト・プログラム実行前に環境変数、

ACL_PROFILE_TIMER を 1 に設定すること

• $ export ACL_PROFILE_TIMER=1

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

プロファイラ GUI の見方

<Kernel 名> タブ

• カーネル・プログラムの動作周波数 ( fmax )

• パイプラインが使用しているメモリの帯域

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

処理データサイズの違いによる

パイプライン稼働率の確認

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

使用するプログラム: 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];

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

データサイズの違いによる効率の差

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

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

おまけ

• Multithread Vector Operation Design Example ( NEW !! )

• コマンド・キューを 2個用意して マルチスレッドで複数カーネルを動作

• C=A x B と C=A + B

↑ デフォルトのコードを実行した際のプロファイラ表示

↑ ベリファイのコード削除

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

まとめ

•カーネルの実行時間、パイプラインの稼働率、メモリアクセスの効率をグラフィカルに表示できるプロファイラはボトルネック解析に便利

•エミュレータ、オプティマイゼーション・レポートによるPC上での検証とあわせてそれぞれのツールをうまく使う事で開発効率向上が期待できる

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

参照資料

• 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

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

ご清聴ありがとうございました