Archived: Real-​Time​実行​トレース​ツール​キット​で​マルチ​コア​アプリケーション​を​デバッグ​する

NI does not actively maintain this document.

This content provides support for older products and technology, so you may notice outdated links or obsolete information about operating systems or other relevant products.

概要

この​ドキュメント​は、​マルチ​コア​プログラミング​の​基本​シリーズ​の​一部​です。
マルチコアプログラミングの基本シリーズ

マルチ​コア​プログラミング​の​基本​シリーズ
​デバッグ​は、​ソフトウェア​開発​において​最も​時間​の​かかる​プロセス​です*1。​Embedded Systems Conference 2007​では、​調査​対象​者​の​56%​が​デバッグ​が​最も​時間​の​かかる​作業​で​ある​と​回答​し​てい​ます。​または、​59%​の​方​は、​普段​使用​し​て​いる​デバッグ​ツール​が​マルチ​コア​または​マルチプロセッサ​で​の​開発​を​サポート​し​てい​ない​と​回答​し​てい​ます*2。​この​ドキュメント​では、​マルチ​コア​アプリケーション​の​デバッグ​方法​について​説明​し​ます。

内容

はじめに

NI LabVIEW​は、​1990​年代​の​中期​頃​から​マルチスレッド​を​標準​で​サポート​し​てい​ます。​LabVIEW​ユーザ​の​開発​者​は、​マルチ​コア​CPU​を​導入​する​こと​により、​この​新しい​技術​の​威力​を​存分​に​活用​でき​ます。​マルチ​コア​CPU​向け​の​並列​アプリケーション​の​プログラミング​では、​複数​スレッド​による​共有​メモリ​へ​の​同時​アクセス​の​同期​や​プロセッサ​親和性​など​の​新しい​テクニック​が​必要​と​さ​れ​ます。​LabVIEW​では、​ほとんどのマルチスレッドタスクが自動的に処理され、​また​ユーザ​が​スレッド​を​特定​の​CPU(または​CPU​の​特定​コア)​に​割り当てる​こと​も​可能​です。

リアルタイム​アプリケーション​を​開発​する​際​は、​リアルタイム​ターゲット​の​実行​トレース​を​キャプチャ​し​て​詳細​な​CPU​使用​率​や​その他​の​イベント​を​監視​する​こと​が​推奨​さ​れ​ます。Real-​Time Execution Trace(Real-​Time​実行​トレース)​ツール​キットを​使用​すると、​リアルタイム​タスク​(VI​スレッド​や​OS​スレッド​を​含む)​の​実行​トレース​を​監視、​分析​する​こと​が​でき​ます。​Real-​Time​実行​トレース​ツール​キット​は、​LabVIEW Real-​Time 7.1.1​以降、​またLabWindows/​CVI Real-​Time 8.5​以降​の​アド​オン​です。​この​ツール​キット​に​は、​30​日間​の​評価​期間​が​設け​ら​れ​てい​ます。​この​アド​オン​は、​計測​器​VI​と​トレース​表示​ユーティリティ​の​2​つ​の​コンポーネント​で​構成​さ​れ​てい​ます。​計測​器​VI​は、​実行​を​トレース​する​コード​の​前後​に​追加​し​ます。​トレース​表示​ユーティリティ​は、​キャプチャ​さ​れ​た​実行​トレース​の​表示​に​使用​し​ます。

下位​レベル​の​実行​情報​は、​ジッタ​の​原因​と​なる​プロセッサ​親和性、​メモリ​割り当て、​優先​度​の​継承、​競合​など​の​特定​に​役立つ​ため、​リアルタイム​アプリケーション​の​最適​化​と​デバッグ​に​は​不可欠​です。

優先​度​の​レベル​が​異なる​複数​の​スレッド​で​リソース​を​共有​すると、​アプリケーション​が​予期​しない​動作​を​する​可能性​が​あり​ます。​表​1​は、​共有​リソース​と​アプリケーション​で​発生​し​得る​潜在​的​な​問題​を​示し​てい​ます。

表​1. 共有​リソース​と​潜在​的​な​問題
共有​リソース 起​こ​り​得る​問題点
  • LabVIEW​メモリ​マネージャ
  • 再入​不可​共有​サブ​VI
  • グローバル​変数
  • ファイル​システム
  • 優先​度​の​逆転
  • 未​設定​の​優先​度​の​逆転
  • 確定​性​の​維持​不能

下記​の​2​項目​で、​プロセッサ​親和性​の​割り当て​および​トレース​方法、​また​共有​リソース​の​潜在​的​な​問題​を​デバッグ​する​方法​について​説明​し​ます。

プロセッサ​親和性

以下​の​2​つ​の​スクリーン​ショット​は、​組み込み​マルチ​コア​RT​ターゲット​で​実行​した​プログラム​の​実行​トレース​を​示し​てい​ます。​この​例​では、​NI LabVIEW​で​2​つのタイミング​ループ(TL)​ストラクチャ​によって​並列​プログラミング​が​実装​さ​れ​てい​ます。​各​TL​は、​別々​の​CPU​に割り当てられ、​各​TL​内部​の​すべて​の​コード​は、​同じ​CPU​で​実行​さ​れ​ます。​プロセッサ​親和性​は​プログラム​が​完了​する​まで​維持​さ​れ​ます。​図​1​と​図​2​は、​各​スレッド​の​CPU​親和性​を​表​し​てい​ます。​各​CPU​に関連付けられたスレッドがハイライト表示され、​それ​以外​の​スレッド​が​グレー​表示​さ​れ​てい​ます。​また、​異なる​CPU​で​実行​さ​れる​スレッド​が​並列​実行​さ​れ​て​いる​ことに​も​注目​し​て​くだ​さい。


[+] 画像​を​拡大

図​1. この​実行​トレース​では、​CPU 0​に​関連​付け​ら​れ​た​スレッド​が​ハイライト​表示​さ​れ​てい​ます。​それ​以外​の​スレッド​は​グレー​表示​さ​れ​てい​ます。


[+] 画像​を​拡大

図​2. この​実行​トレース​では、​CPU 1​に​関連​付け​ら​れ​た​スレッド​が​ハイライト​表示​さ​れ​てい​ます。

関連​トピック:
Developer Zone チュートリアル: Differences Between Multithreading and Multitasking for Programmers

共有​リソース

タイム​クリティカル​ス​レッド​(確定​した​時間​内​に​実行​する​必要​が​ある​スレッド)​で​共有​リソース​を​使用​すると、​リアルタイム​アプリケーション​に​余分​な​ジッタ​が​発生​する​恐れ​が​あり​ます。​たとえば、​LabVIEW​メモリ​マネージャ​は​共有​リソース​です。​LabVIEW​メモリ​マネージャ​は​メモリ​の​動的​な​割り当て​に​使用​さ​れ​ます。

通常​の​優先​度​の​プログラム​が​メモリ​マネージャ​を​使用​し​て​いる​間、​タイム​クリティカル​ス​レッド​を​含む​他の​スレッド​は​共有​リソース​が​使用​可能​に​なる​まで​待機​しな​け​れ​ば​なり​ま​せん。​これ​により、​タイム​クリティカル​ス​レッド​に​ジッタ​が​発生​し​ます。​この​よう​な​場合、​ス​レッド​ス​ケ​ジュー​ラ​は​問題​を​解決​する​ため​に​通常​の​優先​度​の​アプリケーション​を​タイム​クリティカル​ス​レッド​で​実行​さ​れる​よう​指定​し、​通常​の​優先​度​の​アプリケーション​実行​を​高速​化​し​て​メモリ​マネージャ​を​早急​に​解放​しよう​と​し​ます。​この​現象​は、​優先​度​の​継承​または​優先​度​の​逆転​と​呼​ば​れ​ます。​この​よう​な​状況​を​回避​する​ため​に​も、​共有​リソース​を​使用​しない​こと​を​お​勧め​し​ます。​メモリ​マネージャ​の​例​の​場合、​配列​の​メモリ​を​事前​に​割り当てる​こと​で​問題​を​解決​でき​ます。

優先​度​の​継承​は、​2​つ​の​優先​度​の​スケジューリング​スキーム​を​VI​レベル​と​タイミング​ループ​レベル​で​混合​する​こと​で​さらに​促進​さ​れる​場合​が​あり​ます。​たとえば​図​3​では、​タイム​クリティカル​サブ​VI(赤い​アイコ​ン)​と​タイミング​ループ​が​同じ​メモリ​リソース​を​同時に​使用​しよう​として​い​ます。​タイム​クリティカル​サブ​VI​と​タイミング​ループ​が​共有​リソース​を​同時に​使用​しよう​と​すると、​優先​度​の​継承​が​発生​し​ます。

図​3. 2​つ​の​異なる​優先​度​割り当て​スキーム​を​使用​する例

図​4​は、​通常​の​優先​度​の​サブ​VI​と​タイム​クリティカル​サブ​VI​が​共有​リソース​(メモリ​マネージャ)​を​使用​する​別​の​プログラム​の​実行​トレース​を​示し​てい​ます。​緑色​の​フラグ​は​動的​な​メモリ​割り当て​を​示し、​オレンジ​色​の​フラグ​は​優先​度​の​継承​を​示し​てい​ます。​タイム​クリティカル​ス​レッド​の​実行​は、​共有​リソース​が​より​早急​に​解放​さ​れる​よう​通常​の​優先​度​の​サブ​VI​を​タイム​クリティカル​ス​レッド​で​実行​する​ため​に、​中断​さ​れ​ます。​この​動作​により、​タイム​クリティカル​サブ​VI​の​確定​性​が​損​な​われ​ます。


[+] 画像​を​拡大

図​4. 緑色​の​フラグ​は、​動的​な​メモリ​割り当て​(メモリ​マネージャ​へ​の​アクセス)​を​示し​てい​ます。​オレンジ​色​の​フラグ​は、​優先​度​の​継承​を​示し​て​し​ます。

関連​トピック:
Preallocating Arrays for Deterministic Loops
Avoiding Shared Resources and Priority Inversions for Deterministic Applications
LabVIEW Real-​Time Memory Management (example code)
連続​メモリ​の​競合​を​回避​する​(RT​モジュール)

Real-​Time Execution Trace(Real-​Time​実行​トレース)​ツール​キット​の​用途

  • シングル​プロセッサ​および​マルチプロセッサ​アプリケーション​における​ラン​タイム​の​問題​を​デバッグ​する
  • 共有​リソース​と​メモリ​割り当て​を​特定​する
  • 予期​さ​れる​タイミング​動作​を​検証​する
  • CPU​使用​率​と​マルチ​コア​間​の​対応​を​監視​する
  • LabVIEW​実行​モデル​を​確認​する

その他​の​デバッグ​ツール​の​使用

Real-​Time​実行​トレース​ツール​キット​以外​に​も、​標準​的​な​デバッグ​ツール​を​使用​し​て​アプリケーション​の​パフォーマンス​を​確認​する​こと​を​強​く​お​勧め​し​ます。

VI​レベル​で​の​デバッグ​ツール

  • プローブ、​ブレーク​ポイント、​実行​ハイライト
  • NI​タイム​スタンプ​VI(RDTSC)
  • 「RT​デバッグ​文字​列」​VI
  • ユーザ​コード

システム​レベル​で​の​デバッグ​ツール

  • Real-​Time​システム​マネージャ​(オン​スクリーン​CPU​使用​率)
  • VI​プロ​ファ​イラ
  • Real-​Time 実行​トレース​ツール​キット


参考文献:

  1. Richard Goering, Embedded Developer Survey Reveals Debugging Challenges, EETimes, May 11, 2007
  2. Virtutech​による​Embedded Systems Conference 2007​で​の​354​人​の​回答​者​を​対象​と​した​調査