5

できるツールがあれば知りたいです。

  • 大規模なマルチスレッド アプリケーションのコール グラフを視覚化するのに役立ちます。
  • 具体的には、複数のスレッドが 1 つのコアでインターリーブする方法と、複数のコアで同時に実行する方法を確認したいと考えています。
  • このツールは、可能性のある待機/デッドロック/競合状態を特定するのが理想的です。
  • 最終的には、潜在的なマルチスレッドのバグを見つけるために、実行時にスレッドが相互にどのように相互作用するか (マルチスレッドに関するコード カバレッジ ツール) に関してコード カバレッジを行いたいと考えています。

    質問を明確に説明していない場合は申し訳ありませんが、詳細を提供したいと思います。

4

3 に答える 3

1

IntelのVTune プロファイラーは、ユーザーの要求の一部を実行できます。VTune サイトから:

ロックと待機: インテル® パフォーマンス・プロファイリング・ツールを使用して、並列プログラムでパフォーマンスが低下する一般的な原因をすばやく見つけます。待機中にコアが十分に活用されていない状態でロックを長時間待機していることが原因です。

タイムラインでスレッドの動作を視覚化: スレッドの実行中と待機中、および遷移の発生時期を確認します。

オープンソース/フリーのものを探しているなら、Valgrindには Helgrind と呼ばれる実験的なツールがあり、マルチスレッド プログラムで競合を検出すると思われます。私はそれについてコメントすることはできません、私はそれを使用していません。

マルチスレッドのデバッグと最適化にこれらのプロファイラーや他のプロファイラーをうまく利用できていないことに注意してください。代わりに、独自の手法を開発しました。

ロックの競合を特定するために、私が好む手法は、各インスタンスで行われたすべての操作を記録する拡張 Mutex クラスを使用することです。アプリケーションのパフォーマンスが大きく変わらないように、私は非常に軽量な方法でこれを行います。

競合状態を特定するには、力ずくのアプローチが最適だと思います。場合によっては、数時間または数日かかる場合もあります。また、OS ごとに異なるスケジューラを使用し、カバレッジが向上するため、常に少なくとも 2 つの異なるプラットフォーム (できればそれ以上) でテストを実行しています。

于 2011-10-13T04:18:14.013 に答える
1

ほとんどの問題については (まだ!) お手伝いできませんが、当社のC++ テスト カバレッジツールを使用すると、マルチスレッド テスト カバレッジ データを非常に簡単に提供できると思います。

このツールは、ソース コードを計測します。それをコンパイルして実行します。さまざまなブロックを表すコードに (安価な) インストルメンテーション プローブが作成されます。インストルメンテーションは、プログラムのどの部分が実行されるかを記録します。名目上は、インストルメンテーション プローブごとに 1 ビットのビット ベクトルとして記録されます。実行の最後に (またはいつでも)、このビット ベクトルはダンプされ、ビューアーはそれをコードに重ねて表示します。

マルチスレッド テスト カバレッジを取得する秘訣は、インストゥルメント プローブの動作の定義を完全に制御できることを知っておくことです。それらはマクロです。したがって、本質的にデフォルトのマクロを使用するのではなく、

  probe[n]=true;

ブール配列では、代わりに実装できます

  probe[n]|=1<<threadid;

int 配列 (または、この値を事前計算することで巧妙に安価なもの) で。これを実装するには、おそらく数行のコードしか必要ありません。

人々は、これには技術的に同期の問題があることに気付くかもしれません。それは本当ですが、せいぜい少しのカバレッジ データが失われるだけであり、その可能性はかなり高くなります。ほとんどの人は、完璧ではなく「かなり良い」データに満足しています。完璧を求めると、アトミックな更新命令を使用して高い同期代価を支払うことになります。

また、プローブ ダンプ ロジックを制御することもできます。これを修正して、スレッド固有のカバレッジ データを書き出すことができます (数十行のカスタム コード範囲)。テスト カバレッジ データ ビューアでは、スレッド固有のカバレッジを確認できます (適切なカバレッジ ベクトルを選択するだけです)。また、カバレッジ ベクトルの交差/結合/差分を簡単に計算/表示するための機能が組み込まれているため、スレッドごとのカバレッジの関係が正確に得られます。

于 2011-10-13T04:55:16.107 に答える