パフォーマンスの問題を検索してイベントデータを視覚化する方法


10

高度に非同期の通信パターンでMPIアプリケーションを最適化しようとしています。各ランクには計算するもののリストがあり、入力または出力が異なるランクにある場合は、必要に応じてメッセージを送信します。さらに、各ランクはスレッド化されています(現在、1つの通信スレッドと5つのワーカー)。

コードのさまざまなパフォーマンスクリティカルな部分にタイマーを使用してコードをインストルメント化しました。これにより、各スレッドの(開始、終了、タイプ)トリプルのリストが表示されます。横軸を時間、縦軸をランクとスレッド、そして各スレッドが現在何をしているかを示す色で、わかりやすい方法でプロットすると、6スレッド/ランクの16ランクで次のような画像が得られます。

ペンタゴのランクとスレッドの履歴

私の質問は、パフォーマンスの問題を突き止めるのに役立つこのデータを視覚化する他の方法は何ですか?誰かが非同期アプリケーションのプロファイリングに使用するお気に入りのタイプのプロットを持っていますか?

このデータセットは、データフロー構造を認識していないという点で制限されていますが、より複雑なものを収集する前に、できる限り多くの洞察を得たいと思います。

誰もが見回したい場合に備え、非圧縮画像がここにあります(通常のルートでアップロードできませんでした)。残念ながら、Firefoxは有効であると私が信じているにもかかわらず、それを受け入れません。おそらくそれが単に大きすぎるためです。


私のブラウザや他のほとんどのプログラムが大きな画像をロードするのにかなり苦労しました。結局、gimpはそれを行いましたが、サイズまたはファイル形式のオプションを再検討したい場合があります。
Pedro

申し訳ありません。Firefoxは変換(ImageMagick)で同じエラーを実行しているので、画像は有効だと思います。おそらく、任意のサイズのしきい値を超えています。
ジェフリーアーヴィング

回答:


4

私は共有メモリと分散メモリの両方で並列コードの作成とデバッグに多くの時間を費やしていますが、特定の問題を知らずに、私にとって最適なものだけを伝えることができます。

計算効率を検討する場合、どのルーチンにどのくらいの時間がかかるかを知ることは重要ですが、並列効率を心配している場合は、計算を実行していないときのコードの動作をもっと心配する必要があります。静かすぎると子供たちが何をしているのか気になるような…

ハイブリッド共有/分散メモリアプローチを使用しているので、コードは空欄で、MPI呼び出しまたはmutex /条件変数で待機していると思います。これらの呼び出しをタイマーでラップすることもできます。これにより、たとえばMPI_REDUCE、スレッドがスタックしている状態と常に同じか、常に同じである場合など、何が遅くなっているのかをよりよく把握できます。

私がよく使用するソフトウェアの1つはIntel Vtune Amplifier XEです。スレッドの同時実行を視覚化する優れたプロット機能/オプションがあります。プログラムはあなたのプロットと非常によく似たプロットを描画しますが、スレッドがミューテックスまたは条件変数で待機している場合、待機を開始した時点で、待機中のスレッドから、実際にミューテックスを解放したかシグナルを送信したスレッドに対角線を描画します解放または通知されたときに待機していた状態。これはかなり厄介なことですが、ボトルネックがすぐに現れます。

最後に、バルク統計も収集します。たとえば、各ミューテックス/シグナル/ MPIコールについて、平均および最大待機時間はどれくらいでしたか?収集された待機時間のヒストグラムは何ですか?プロットは全体像を示してくれますが、細かいところまで行くとかなり面倒になります。

最後に、過小評価してはいけない1つの質問:タイミングをどのように収集していますか?あなたのタイマーはあなたのコードに影響を与えないほど十分に邪魔にならないでしょうか?私は可能な限り、つまりRDTSCx86アーキテクチャでCPU命令カウントを使用しています。これは通常、コードに単一の命令を追加するだけです。


データにはすべての待機の周りにすでにブロックがあります。図では、アイドル状態のワーカースレッドは白、待機中の通信スレッドは黄色で表示されます。残念ながら、非同期のため、通信スレッドでのすべての待機は1つのブランケットMPI_Waitsomeで発生します。純粋にスレッド化されたパフォーマンスは本質的に完璧なので、Vtuneはこの場合には適用されませんが、ポインターに感謝します。ヒストグラムの提案も良いものです。
Geoffrey Irving

タイミングのオーバーヘッドについては、私はgettimeofdayを使用しています。これは、pthread条件変数を使用しているため、少なくともアイドルセクション周辺で必要です。このような状況でCPU命令カウントを機能させることはできますか?オーバーヘッドはすでに十分に低くなっていますが、低いほど確かに優れています。
ジェフリーアーヴィング

1
@GeoffreyIrving:はい、使用できますが、constant_tscフラグが設定されているCPU (チェック/proc/cpuinfo)でのみ意味があり、各スレッドを特定のコアにロックする場合、つまり各スレッドは常に同じコアから同じレジスタを読み取ります。たとえばを使用しpthread_setaffinity_npます。後者はLinux固有であり、移植性がないことに注意してください。
Pedro

@GeoffreyIrving:を使用して非公開のイベントを待っている場合でも、MPI_Waitsome実際にどのリクエストがどこから到着したかを記録できます。この情報は役に立つかもしれない
Pedro

5

高レベルのリソース分析により、パフォーマンスの問題に関する別の見方ができる場合があります。メモリ帯域幅などの関連するボトルネックはありますか?すべてのワーカースレッドは同じ量の作業を行いますか?このデータは、LIKWIDツールスイートLIKWID Googleコードプロジェクトからlikwid-perfctrを使用して簡単に収集できます。多くの異なるホットスポットが存在するようなプロファイルの場合、それらを1つずつ取り組む必要がある場合があります。使用されているスレッド/プロセスの数に応じて、異なる問題が発生する場合もあります。


完全な開示のために、GeorgはLIKWIDプロジェクトに取り組んでいます。ペドロの素晴らしい答えを別の視点(および無料で入手できる素晴らしいツール)で補完したかったので、私はこの反応を求めました。
Aron Ahmadia 2012

2

メッセージやイベントによって制御される高度に非同期のプロセスのネットワークで問題が発生した場合は、簡単ではないが効果的な方法を使用します。これには、プロセスのタイムスタンプ付きログを取得し、それらを共通のタイムラインにマージし、アクティビティがトリガーされたときに一部のメッセージの進行状況を追跡し、さらにメッセージをトリガーすることが含まれます。私が探しているのは、メッセージが受信されてから処理されるまでの遅延と、遅延の理由を理解することです。問題が見つかった場合は修正され、プロセスが繰り返されます。このように、あなたは本当に満足のいくパフォーマンスを得ることができます。

これが、測定、測定、測定するアプローチとどのように異なるかを確認することが重要です。測定することでおそらくあなたが知ることができる唯一のものは、どこを見ないかです。実際のパフォーマンスチューニングでは、時間の観点から詳細を注意深く見る必要があります。あなたが探しているのは、時間が費やされている場所ではなく、不必要に費やされている場所です。

幸運を。


言い換えると、私が持っているデータの有用な視覚化はありません。:) Jed Brownは、あなたが提案するデータを収集して視覚化する1つの方法としてJumpshot(および関連するユーティリティ)を提案しました。
Geoffrey Irving

@Geof:視覚化で頑張ってください。私が便利だと思った唯一のツールは、イベントログを収集してマージするものです。これにより、さまざまなスレッドを通過する1つ以上の要求のパスをたどることができます。遅延。これは、パフォーマンスの問題で構成されます-不必要な遅延。
Mike Dunlavey、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.