プロファイル/解析

TCF プロファイリング

TCF プロファイラーでは、スタンドアロン アプリケーションと Linux アプリケーションの両方のプロファイリングがサポートされます。TCF プロファイリングには、その他のコンパイラ フラグをアプリケーションのビルド中に設定する必要はありません。JTAG を介したスタンドアロン アプリケーションのプロファイリングは、デバッグ インターフェイスを使用したプログラム カウンターのサンプリングに基づきます。これにより、プログラム実行フローが変わることはなく、スタック トレースがイネーブルになっていない場合は非介入 (non-intrusive) 型です。スタック トレースがイネーブルになっている場合は、デバッガーがスタック トレース情報を収集する必要があるので、プログラム実行速度が落ちます。

  1. プロファイルするアプリケーションを選択します。
  2. アプリケーション を右クリックし、Run As > Launch on Hardware (Single Application Debug) をクリックします。
  3. アプリケーションが main で停止したら、Window > Show View > Debug > TCF Profiler をクリックして TCF プロファイラーを開きます。
  4. ボタンをクリックしてプロファイルを開始します。[Profiler Configuration] ダイアログ ボックスが開きます。
  5. Aggregate Per Function オプションをオンにして、異なるアドレス用に収集されたサンプルすべてを 1 つの関数にまとめます。オフにすると、収集されたサンプルがアドレスごとに表示されます。
  6. Enable stack tracing オプションをオンにすると、サンプル データの各アドレスのスタック トレースが表示されます。1 つのアドレスのスタック トレースを表示するには、プロファイラー ビューでそのアドレスをクリックします。
  7. Max stack frames count に、スタック トレース ビューに表示する最大フレーム数を指定します。
  8. View update interval に、[TCF Profiler] ビューを新しい結果でアップデートする間隔 (ミリ秒) を指定します。これは、プロファイル サンプルが収集される間隔とは異なります。
  9. アプリケーションを再開します。次の図のように、[TCF Profiler] ビューがアップデートされます。


gprof プロファイリング (Zynq-7000 SoC)

重要: この機能は、Zynq-7000 SoC デバイスにしか使用できません。
この機能は、Zynq-7000 SoC デバイスにしか使用できません。GNU gprof からは、プログラムを最適化するために使用可能な情報が 2 種類提供されます。
  • 最も実行時間のかかっているプログラムの関数を見つけることができるヒストグラム
  • 関数がどの関数を何度呼び出すかを示すコールグラフ

プログラムの実行フローは、gprof がデータを取得できるよう変更されます。このため、このプロファイリング方法はソフトウェア介入型と考えられます。プログラム フローは、次の 2 つの方法で変更されます。

  • ヒストグラム データを取得するため、プログラムは定期的に割り込まれて、そのプログラム カウンター ロケーションのサンプルが取得されます。このユーザー定義の間隔の単位は、通常ミリ秒です。プログラム カウンター ロケーションからは、その特定サンプルでどの関数が実行されたのかがわかります。数秒の長い間隔で複数サンプルを見てみると、プログラムで最も実行に時間をかけている関数がわかります。
  • コールグラフ情報を取得するため、コンパイラは各関数呼び出しをアノテートし、呼び出し元および呼び出し先情報をデータ構造に格納します。

次の図はこのプロファイリング ワークフローを示しています。

1: プロファイリング ワークフロー


注記: プロファイリングを実行する際にガベージ コレクター フラグを使用しないでください。ガベージ コレクター フラグを使用すると、エラーが発生することがあります。
GNU gprof の詳細は、http://sourceware.org/binutils/docs-2.18/gprof/index.html を参照してください。

プロファイラー設定の指定

プロファイラーのオプションを設定する手順は、次のとおりです。

  1. [Project Explorer] または [C/C++ Projects] ビューでプロジェクトを選択します。
  2. Run > Run Configuration をクリックします。
  3. [Run Configurations] ダイアログ ボックスで Launch on Hardware (Single Application Debug) を展開します。
  4. 実行コンフィギュレーションを作成します。
  5. Application ビューをクリックします。
  6. Edit ボタンをクリックして Advanced Options を表示および設定します。
  7. [Profile Options] の Enable Profiling をオンにします。
  8. プロファイリングに使用するサンプリング周波数およびスクラッチ メモリを指定します。
    1. サンプリング周波数は、どの関数が現在実行中であるかをプロファイリング ルーチンが定期的にチェックするのに使用する割り込み間隔です。このルーチンは、各割り込みでプログラム カウンターを検証してサンプリングを実行します。
    2. スクラッチ メモリ アドレスは、ドメイン プロファイリング サービスがデータ収集に使用する DDR3 メモリのロケーションです。アプリケーション プログラムがこの空間に触れることはありません。
  9. Run をクリックし、アプリケーションをプロファイルします。

プロファイリング用のハードウェアの設定

ソフトウェア アプリケーションをプロファイルするには、割り込みが定期的に立ち上がるようにして、プログラム カウンター (PC) 値がサンプリングされるようにする必要があります。これには、タイマーをプログラムして、タイマー割り込みハンドラーを使用して PC を収集して格納する必要があります。プロファイル割り込みハンドラーはタイマーへの完全なアクセスを必要とするので、アプリケーション自体に使用されていない別のタイマーがシステムで使用できるようになっている必要があります。

このプロファイル割り込みハンドラーを含むザイリンクス プロファイリング ライブラリでは、AXI Timer コアがサポートされます。

Zynq-7000 SoC プロセッサのプロファイルの場合は、内部 SCU タイマーを使用する必要があります。

プロファイリング用のソフトウェアの設定

プロファイリング用にソフトウェア アプリケーションを設定する重要な手順は、次の 3 つです。
  1. ソフトウェア プラットフォームでプロファイリングをイネーブルにして、プロファイリング ライブラリを含めます。
    注記: プロファイリングはスタンドアロン ソフトウェア プラットフォームでのみサポートされます。
    1. 追加のコンパイラ フラグに -pg を追加して、プロファイリングを含めてドメインをビルドします。

    2. [Board Support Package Settings] ウィンドウで enable_sw_intrusive_profiling を true に設定します。

  2. C/C++ Build > Settings > Profiling のアプリケーション C/C++ ビルド設定でプロファイリングをイネーブルにします。

ドメインの設定

  1. Application.prj をダブルクリックします。[Application Overview] ページが開きます。Navigate to BSP Settings をクリックします。Modify BSP Settings をクリックします。
  2. standalone などの OS 名をクリックして、パラメーターを設定します。
  3. enable_sw_intrusive_profiling フィールドを true にし、プロファイル ライブラリに使用するタイマーを選択します。
  4. ドメインは -pg コンパイラ オプションを使用してコンパイルする必要があります。これには、ドライバー項目をクリックして、CPU ドライバーを選択します。-pg フラグを extra_compiler_flags オプションに追加します。
  5. OK をクリックします。

ソフトウェア アプリケーションの設定

  1. ソフトウェア アプリケーション コードを変更して、割り込みをイネーブルにします。システムに複数の割り込みソースを使用した割り込みコントローラーがある場合、プロセッサの割り込みをイネーブルにして、割り込みコントローラーでプロファイル タイマーからの割り込みがプロセッサに到達するようにする必要があります。次は、その例です。
    /* enable interrupt controller */
            XIntc_mMasterEnable(SYSINTC_BASEADDR);
            /* service all interrupts */
            XIntc_SetIntrSvcOption(SYSINTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION);
            /* enable the profile timer interrupt */
            XIntc_mEnableIntr(SYSINTC_BASEADDR, PROFILE_TIMER_INTR_MASK);
            /* enable interrupts in the processor */
            microblaze_enable_interrupts();
  2. 割り込みコントローラーの入力に接続される、またはプロセッサに直接接続されるエンティティがプロファイル タイマーだけの場合、自動的に割り込みが設定されるので、アプリケーション コードを変更する必要はありません。
  3. ソフトウェア アプリケーションを右クリックし、C/C++ Settings (または Properties > C/C++ Build > Settings) をクリックします。
  4. gcc compiler > Profiling をクリックし、Enable Profiling (-pg) をおんにしてプロファイリングをイネーブルにします。
  5. OK をクリックします。

プロファイリング結果の表示

プログラムの実行が終了 (exit に到達) したり、[Stop] ボタンをクリックしてプログラムを停止すると、Vitis ソフトウェア プラットフォームはプロファイル データをダウンロードして、gmon.out という名前のファイルに保存します。

Vitis ソフトウェア プラットフォームが自動的に gmon.out ファイルを開きます。gmon.out ファイルがアプリケーション プロジェクトの debug フォルダーに生成されます。

システム デバッガーを使用した Linux アプリケーションのプロファイル

ザイリンクス システム デバッガーを使用して Linux アプリケーションをプロファイルするには、次の手順に従います。

  1. Vitis IDE を使用して、ターゲット用の Linux アプリケーションを新規作成します。
    注記: 手順は ZC702 の Cortex-A9 に基づいて説明されていますが、ほかのターゲットでも同じように使用できるはずです。
  2. 新規プロジェクトにアプリケーション ソースをインポートします。
  3. アプリケーションをビルドします。
  4. ZC702 で Linux を (たとえば SD カードから) 起動し、ターゲットで TCF エージェントを開始します。
  5. [Target Connections] アイコンを使用して TCF エージェント用に新しいターゲット接続を作成します。
  6. プロファイルするアプリケーション用に新しい Xilinx System Debugger デバッグ コンフィギュレーションを作成して、そのデバッグ コンフィギュレーションを開始します。新しい Launch on Hardware (Single Application Debug) を作成します。
  7. [Main] タブの [Debug Type] リストから Linux Application Debug を選択します。
  8. [Application] タブでローカルの .elf ファイル パスとリモートの .elf ファイル パスを指定します。
  9. Debug をクリックします。
  10. main() でプロセス コンテキストが停止したら、Window > Show View > Debug > TCF Profiler をクリックして TCF Profiler を起動します。
  11. [TCF Profiler] ビューで Start ツールバー アイコンをクリックして、プロファイリングを開始します。
    注記: アプリケーション コードの最後にブレークポイントを設定して、プロセスが終了しないようにします。設定しておかないと、プロセスが終了したときに TCF Profiler で収集されたデータが失われます。
  12. プロセス コンテキストを再開します。[TCF Profiler] ビューがそのプロファイル データでアップデートされます。

MicroBlaze プロセッサの非侵入型プロファイリング

ハードウェア デザインで拡張デバッグがイネーブルになっている場合、MicroBlaze でそのプログラム命令の非侵入型プロファイリングがサポートされます。命令カウントかサイクル カウントのどちらをプロファイルするかは設定できます。プロファイリング結果は、デバッグ メモリのプロファイリング バッファーに格納され、MDM デバッグ レジスタを介してレジスタからアクセスできます。バッファーのサイズは、C_DEBUG_PROFILE_SIZE パラメーター (サイズ 0 の場合、プロファイリングはディスエーブル) を使用して 4K ~ 128K の間に設定できます。

プロファイル バッファーは、ビンという部分に分けられます。各ビンは 36 ビット幅で、プログラムのアドレス範囲の命令またはサイクルをカウントできます。各ビンによりプロファイルされるアドレス範囲は、プロファイルされるプログラムの合計サイズによって変わります。ビン サイズは次の式を使用して計算されます。

B = log2((H - L + S * 4) / S * 4)

B はビン サイズを、H おひょび L はプロファイルされるプログラムのアドレス範囲の High アドレスと Low アドレスを、S はプロファイル バッファーのサイズを表しています。

プロファイリングがイネーブルでプログラムが開始されると、アドレス範囲のプロファイル統計が該当するビンに格納されます。ザイリンクス システム デバッガーは、必要に応じてこれらの結果を読み込むことができます。

非侵入型プロファイラー設定の指定

プロファイラーのオプションを設定する手順は、次のとおりです。

  1. Vitis ソフトウェア プラットフォームを起動します。
  2. 新しいスタンドアロン プロジェクトを作成するか、既存のものを選択します。
  3. Run > Run Configuration をクリックします。
  4. [Debug Configurations] ダイアログ ボックスで Launch on Hardware (Single Application Debug) を展開します。
  5. 実行コンフィギュレーションを作成します。
  6. Application ビューをクリックします。
  7. Edit ボタンをクリックしてアドバンス おオプションを表示および設定します。
  8. [Profile Options] の Enable Profiling をオンにします。
  9. Non-Intrusive を選択します。
  10. プロファイルされるプログラム範囲の Low アドレスと High アドレスを指定します。または、Program StartProgram End をオンにして、プログラムから Low アドレスと High アドレスが自動的に計算されるようにします。
  11. Count Instructions をオンにすると、実行される命令数がカウントされます。Count Cycles をオンにすると、経過サイクル数がカウントされます。
  12. Cumulative Profiling をオンにすると、最後の実行からのプロファイリング バッファーが一掃されないでプロファイルされます。
  13. OK をクリックして設定を保存します。
  14. Run をクリックして選択したプロジェクトをプロファイルします。

非侵入型プロファイリング結果の表示

アプリケーションの実行が終了したり、[Stop] ボタンをクリックしてプログラムを停止すると、Vitis ソフトウェア プラットフォームは非侵入型のプロファイル データをダウンロードして、gmon.out という名前のファイルに保存します。

注記: Vitis ソフトウェア プラットフォームが自動的に gmon.out ファイルを開きます。gmon.out ファイルがアプリケーション プロジェクトの debug フォルダーに生成されます。

STM を使用した FreeRTOS 解析

Vitis ソフトウェア プラットフォームでは、FreeRTOS ベースのアプリケーションで生成されたトレース イベントの収集および解析がサポートされます。Zynq UltraScale+ MPSoC プロセッサでは、ソフトウェア アプリケーション ドリブンのトレース ソースである STM (Software Trace Microcell) ブロックがサポートされ、SWIT (SoftWare Instrumentation Trace) が生成できるようになっています。FreeRTOS イベントを収集して解析する手順は、次のとおりです。

  1. File > New > Application Project をクリックします。New Application Project ウィザードが表示されます。
  2. [Project Name] にプロジェクト名を入力します。
  3. プロジェクトのディレクトリを指定します。[Use default location] チェック ボックスをオンにしたままにすると、[Location] フィールドに表示されるデフォルト ディレクトリを使用できます。デフォルト以外のディレクトリを使用する場合は、このチェック ボックスをオフにし、ディレクトリ名を入力または選択します。
  4. プラットフォームを選択するウィンドウで Create a new platform from hardware (XSA) をクリックし、zcu102 design を選択します。Next をクリックして続行します。
  5. CPU と OS を freertos10_xilinx にします。
    注記: FreeRTOS バージョンは、今後のリリースでは変わる可能性があります。
  6. Next をクリックして [Templates] ページに進みます。

    Vitis ソフトウェア プラットフォームではサンプル アプリケーションが提供されており、[Templates] ページで選択してプロジェクトの作成に使用できます。[Description] に、選択したサンプル アプリケーションの簡単な説明が表示されます。プロジェクトにサンプル アプリケーションを使用すると、Vitis ソフトウェア プラットフォームで必要なソースおよびヘッダー ファイルおよびリンカー スクリプトが作成されます。

  7. 使用するテンプレートを選択します。空のプロジェクトを作成する場合は、Empty Application を選択します。プロジェクトの作成後に C ファイルを追加できます。
  8. [Application Project Settings] ページで Navigate to BSP 設定オプションをクリックします。Open BSP Settings > Overview > FreeRTOS をクリックし、enable_stm_event_trace の値を TRUE に変更します。
  9. アプリケーションを右クリックし、Debug As > Debug Configuration をクリックします。
  10. [Debug Configurations] ダイアログ ボックスで Single Application Debug をダブルクリックして、選択したプロジェクトのコンフィギュレーションを開始します。
  11. Debug をクリックします。実行中ステートのプロセッサを使用してデバッグが開始されます。
  12. 必要なターゲットでシステム デバッガーを使用してプロジェクトがデバッグされます。
  13. プロジェクトがボードにダウンロードされるのを待って、main() で停止します。
  14. Window > Show View > Xilinx をクリックします。[Show View] ダイアログ ボックスが開きます。
  15. [Show View] ダイアログ ボックスで Trace Session Manager をオンにします。[Trace Session Manager] ビューにデバッグされるアプリケーションに関連した実行コンフィギュレーションが表示されます。
  16. [Trace Session Manager] ビューのツールバーの [Start] ボタンをクリックして、FreeRTOS トレース収集を開始します。
  17. [Debug] ビューに切り替えて、プロジェクトを再開します。
  18. プロジェクトを実行させます。
  19. [Trace Session Manager] ビューに戻って、トレース収集を停止します。収集されたトレース データはすべて適切なトレース ファイルにエクスポートされ、[Events] エディターと [FreeRTOS Analysis] ビューで開きます。