2023/10/18
製品
カテゴリー
タグ
769 Views
マルチコア解析方法
DT+Traceでは、複数コアが動作する環境でもマルチコア情報をテストレポートに付随させて、各コアごとに動作の解析を行うことが可能です。こちらの機能を使用することで、関数遷移スコープが複数コア表示になるほか、テストレポートフィルタとレポートデータトリミング機能を活用する事でコアごとのレポート解析が可能になります。
また、マルチコアをターゲットとしてテストレポートを取得した場合、以下のようなコアに特化した機能を使用できます。
- 1つのテストレポートでのコアの識別
- コアを条件としたテストレポートフィルタ
- 関数遷移スコープでのコアごとの遷移状態の確認
Contents
例えばこんな時・・・
- コアごとの処理のパフォーマンスをまとめて比較したい。
- 特定のコア間の関数の遷移状況を把握したい。
ポイント
マルチコア情報を取得するためには、以下のように3つのステップが必要です。
また、DT+Traceのマルチコア解析機能は、GPIO接続の場合は4コア、ファイル書き出し接続(18Byteの場合)とEthernet接続の場合は最大64コアまで対応可能です。
ドライバのカスタマイズ方法
1. サンプルドライバのダウンロード
サンプルドライバを以下よりダウンロードください。
対応OS | 接続方式 | 言語 | イベントID出力方式 | ダウンロード |
---|---|---|---|---|
Linux | GPIO | C/C++ | カーネル情報出力 | ≫ダウンロード※1 |
Linux | ファイル書き出し | C/C++ | カーネル情報出力 | ≫ダウンロード |
Linux Ethernet ドライバサービスパック | Ethernet | C/C++ | カーネル情報出力 | ≫ダウンロード※2 |
※1 全ての汎⽤ポート接続で同様に使⽤可能です。カスタマイズに関しては、下記のサンプルコードをご参照ください。
※2 こちらは有償になりますので別途お問い合わせください。
2. defineの設定
以下のdefineを有効にする事でCPUの判別処理が有効になります。
/*==========================================================*/
/* Macro: DT_ADD_CPU_INFO */
/* Desc: Please set 1 when you add CPU ID to Test Point. */
/*==========================================================*/
#define DT_ADD_CPU_INFO
3. コア情報取得APIの定義
GPIO接続の場合は下記のように”smp_processor_id()”のようなコア情報を取得するAPIを使用し、addrの19,18bit目に割り当てます。
■ GPIO
/*========================================================================*/
/* Func: _TP_BusOutDrv */
/* Desc: TestPointOutputFunction. */
/*========================================================================*/
static inline void _TP_BusOutDrv( DT_UINT addr, DT_UINT data )
{
#if DT_ADD_CPU_INFO
int cpu_id = 0;
cpu_id = smp_processor_id();
if ((cpu_id < 0) || (cpu_id > 3)) {
cpu_id = 0;
}
addr &= ~(0x3 << 18);
addr |= cpu_id << 18;
#endif
CS_LOW;
ファイル書き出し接続(18Byteファイルフォーマット)の場合やEthernet接続の場合も、同様にコア情報を取得するAPI等を使用してコア情報を取得し、ファイルフォーマットに従って記録します。
■ ファイル書き出し
/*==============================================================================*/
/* Func: _TP_BusOutDrv */
/* Desc: Called by Test Point */
/*==============================================================================*/
static inline void _TP_BusOutDrv(DT_UINT addr, DT_UINT dat)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
struct timespec64 now;
#else
struct timespec now;
#endif
if (write_pos >= DT_PROC_BUFF_SIZE) {
#ifdef RING_BUFF_USE
buff_state = 1;
write_pos = 0;
#else
return;
#endif
}
#if DT_ADD_CPU_INFO
cpu_id = smp_processor_id();
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
ktime_get_real_ts64(&now);
#else
getnstimeofday(&now);
■ Ethernet
/*==============================================================================*/
/* Func: _TP_BusOut */
/* Desc: Called by Test Point */
/*==============================================================================*/
void _TP_BusOut(DT_UINT addr, DT_UINT dat)
{
unsigned long flags;
#if DT_ADD_CPU_INFO
unsigned int cpu_id;
#endif
...
if (init == 0) {
init = dt_init();
if (init == 0) {
return;
}
}
spin_lock_irqsave(&tplock, flags);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0))
ktime_get_real_ts64(&now);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
get_monotonic_boottime(&now);
#else
getnstimeofday(&now);
#endif
#if DT_ADD_CPU_INFO
cpu_id = smp_processor_id();
addr |= (cpu_id << 18);
4. アプリ設定
マルチコア判別を行う場合、以下の設定が必要になります。
GPIO接続の場合とEthernet接続の場合は、「テストレポート収集条件設定」>「その他」>「コア情報を収集する」にチェックし、ログを取得します。
ファイル書き出しの場合は、テストレポートのインポート時に「コア情報を収集する」のチェックを有効にしてインポートしてください。
コアに特化した機能
一つのテストレポートでのコアの識別
コア情報の収集のための各チェックボックスを設定した上で、トレースを行うとテストレポート上の「コア」の欄に、所属するコア番号が表示されます。
コアを条件としたテストレポートフィルタ
コアを条件としてテストレポートフィルタを設定することが可能です。
テストレポートフィルタを設定するには、「レポート解析メニュー」>「テストレポートフィルタ…」>「テストレポートフィルタ」ウィンドウより、表示したいコアの「コア選択」項目をチェックして有効状態にします。
さらに、「コア選択」の項目をダブルクリックし「テストレポートフィルタ:コア選択」ウィンドウで、テストレポートフィルタを適用するコアを選択します。
関数遷移スコープでコアの遷移状況の確認
関数遷移スコープを使って、各コア間の関数の遷移状況を確認することができます。
テストレポートなどの各種ウインドウと同期して確認することでき、各コアの動きが簡単に把握できます。
関数遷移スコープは、「DT+Traceアプリメニュー」>「レポート解析」>「関数遷移スコープ」より確認できます。
各コアごとの遷移状況は、関数名表示ツリーの最上位に表示されます。
ツリーは「コア > プロセス(イベントID) > 関数名」の順で表示されます。