Parallel Universeへようこそ―マルチコアプロセッサー向けのソフトウェア開発―

この記事を読むのに必要な時間:およそ 6 分

インテルParallel Inspector

マルチスレッドアプリケーションでエラーの原因を特定することは困難です。インテルParallel Inspectorは,C/C++アプリケーション開発者に次の分析機能を提供し,スレッド化特有のエラーやメモリエラーといったバグを発見し,原因の特定を支援します。

  • リーク,バッファーオーバーランエラー,ポインタの問題など,メモリとリソースに関するさまざまな問題を特定
  • スレッド関連のデッドロック,データ競合,およびその他の同期化問題を予測し特定
  • 並列アプリケーションの潜在的なセキュリティ問題の特定
  • サイズ,頻度,種類順でエラーをすばやくソートし,重大な問題を認識して優先順位を設定

インテルParallel Inspector図3は,Pinと呼ばれる動的なバイナリインストルメンテーションテクノロジを使用して,メモリエラーとスレッド化エラーを検証します。実行中の実行ファイルの任意の場所にC/C++コードを挿入して,プログラムの動作を監視できます。

図3 インテルParallel Inspectorのツールバー

図3 インテルParallel Inspectorのツールバー

インテルParallel Inspectorのメモリ分析

インテルParallel Inspectorのメモリ分析では,Pinの設定を変更して4つのレベルで分析を行うことができます図4⁠。

レベル1分析

プリケーションのメモリリークを見つけるのに役立ちます。メモリリークは,メモリブロックが割り当てられ,解放されない場合に発生します。

レベル2分析

初期化されていないメモリへのアクセス,不正な割り当て解除,割り当てと解除の不一致など,アプリケーションの不正なメモリアクセスを検出します。

レベル3分析

レベル2分析に加え,コールスタックの深さが1から12に変更され,ぶら下がりポインタの拡張チェックが有効です。ぶら下がりポインタとは,すでに存在しないデータにアクセスしたり,そのようなデータを指定しているポインタです。

レベル4分析

すべてのメモリエラーを見つけようとします。コールスタックの深さは32に変更され,ぶら下がりポインタの拡張チェック,システムライブラリーの分析,およびスタック上で発生するメモリエラーの分析も行います。

図4 メモリエラーの分析レベル

図4 メモリエラーの分析レベル

図5に示すように,検出されたメモリエラーを重大度,説明,原因,関数名などでフィルタできます。

図5 検出されたメモリエラーを示すインテルParallel Inspectorの分析結果

図5 検出されたメモリエラーを示すインテルParallel Inspectorの分析結果

インテルParallel Inspectorのスレッド化エラー分析

スレッド化エラーの分析レベルも4つあります図6⁠。インテルParallel Inspectorで認識される主なスレッド化エラーには,データ競合,デッドロック,ロック階層違反,および潜在的なプライバシーの侵害があります。

図6 スレッド化エラーの分析レベル

図6 スレッド化エラーの分析レベル

レベル1分析

アプリケーションのデッドロックを見つけるのに役立ちます。デッドロックは,2つ以上のスレッドが,他のスレッドがリソース(MUTEX,クリティカルセクション,スレッドハンドルなど)を解放するのを待機しているのに,どのスレッドもリソースを解放しない場合に発生します。コールスタックの深さは1に設定されます。

レベル2分析

アプリケーションのデータ競合とデッドロックを検出します。データ競合は最も一般的なスレッド化エラーの1つで,適切な同期処理が行われずに複数のスレッドが同じメモリ位置にアクセスした場合に発生します。このレベルでも,コールスタックの深さは1に設定されます。このレベルのバイトレベルの粒度は4です。

レベル3分析

レベル2のデータ競合とデッドロックを検出に加えて,それらの発生場所も検出します。より詳細な分析を行うために,コールスタックの深さは12に設定されます。このレベルのバイトレベルの粒度は1です。

レベル4分析

すべてのスレッド化エラーを見つけようとします。コールスタックの深さは32に変更され,スタック上で発生するエラーの分析も行います。スタック分析はこのレベルでのみ有効になります。このレベルのバイトレベルの粒度は1です。

データ競合はさまざまな場合に発生します。インテルParallel Inspectorは,write-write(書き込み-書き込み⁠⁠,read-write(読み取り-書き込み⁠⁠,およびwrite-read(書き込み-読み取り)データ競合を検出します。すべての場合において,実行順序が共有データに影響を与えます。

  • write-writeデータ競合:2つ以上のスレッドが同じメモリ位置に書き込みを行う場合に発生
  • read-writeデータ競合:1つのスレッドがメモリ位置から読み取りを行う際に,別のスレッドが同時に同じメモリ位置に書き込みを行う場合に発生
  • write-readデータ競合:1つのスレッドがメモリ位置に書き込みを行う際に,別のスレッドが同時に同じメモリ位置から読み取りを行う場合に発生

図7 検出されたデータ競合問題を示すインテルParallel Inspectorの分析結果

図7 検出されたデータ競合問題を示すインテルParallel Inspectorの分析結果