問題タブ [intel-vtune]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ubuntu - VTUNE: データを表示できません
Intel Vtune を使用してメモリ アクセス、アクセス競合などの分析を行っていますが、次のエラーが表示されます: データを表示できません。データを表示できません: データに適用できるビューポートがありません。
Debian 6、Intel Vtune Amplifier (GUI) Update 5 (2013) を使用しています。
Ubuntu でこの問題に関するいくつかの提案を見つけましたが、debian では何も見つかりませんでした。また、ubuntu で提案された解決策は debian には当てはまらないようです。
performancecounter - DTLB ミス数カウントの不一致
32 nm Intel Westmere プロセッサで Linux を実行しています。パフォーマンス カウンターからの DTLB ミス数に関する一見矛盾するデータに懸念があります。次のように、ランダム メモリ アクセス テスト プログラム (シングル スレッド) を使用して 2 つの実験を実行しました。
実験 (1): 次のパフォーマンス カウンターを使用して DTLB ミスをカウントしました
DTLB_MISSES.WALK_COMPLETED ((Event 49H, Umask 02H)
実験 (2): 以下の 2 つのカウンター値を合計して、DTLB ミスをカウントしました。
MEM_LOAD_RETIRED.DTLB_MISS (Event CBH, Umask 80H)
MEM_STORE_RETIRED.DTLB_MISS (Event 0CH, Umask 01H)
これらの実験の結果は似ていると予想しました。しかし、実験 (1) で報告された数は、実験 (2) のほぼ 2 倍であることがわかりました。どうしてこうなったのか途方に暮れています。
誰かがこの明らかな不一致に光を当てるのを助けることができますか?
c++ - g++ (4.6 および 4.7) がこの除算の結果を double に昇格させるのはなぜですか? 止めてもいいですか?
GPU 実装と比較するために、float と double の両方を使用する数値アルゴリズムのベンチマークを行うテンプレート コードを作成していました。
浮動小数点コードが遅いことがわかりました。Intel の Vtune Amplifier を使用して調査した結果、g++ が余分な x86 命令 (cvtps2pd/cvtpd2ps および unpcklps/unpcklpd) を生成して、いくつかの中間結果を float から double に変換してから再び戻すことを発見しました。このアプリケーションのパフォーマンスの低下は、ほぼ 10% です。
フラグ -Wdouble-promotion (ところで、-Wall または -Wextra には含まれていません) を使用してコンパイルした後、十分な g++ が結果が昇格されていることを警告しました。
これを以下に示す簡単なテストケースに減らしました。C++ コードの順序は、生成されるコードに影響することに注意してください。複合ステートメント (T d1 = log(r)/r;) は警告を生成しますが、分離されたバージョン (T d = log(r); d/=r;) は生成しません。
以下は、g++-4.6.3-1ubuntu5 と g++-4.7.3-2ubuntu1~12.04 の両方でコンパイルされ、同じ結果になりました。
コンパイル フラグは次のとおりです。
g++-4.7 -O2 -Wdouble-promotion -Wextra -Wall -pedantic -Werror -std=c++0x test.cpp -o test
ここで、c++11 標準ではコンパイラの裁量が許可されていることを認識しています。しかし、なぜ順序が重要なのでしょうか?
この計算だけに float を使用するように g++ に明示的に指示できますか?
編集:Mike Seymourによって解決されました。C を呼び出す代わりに、 std::log を使用してオーバーロードされたバージョンのログを確実に取得する必要がありましたdouble log(double)
。これはコンバージョンであってプロモーションではないため、分離されたステートメントに対して警告は生成されませんでした。
c - Intel Phi での MKL パフォーマンス
モデルに適合するために小さな行列 (50 ~ 100 x 1000 要素) に対していくつかの MKL 呼び出しを実行するルーチンがあり、それをさまざまなモデルに対して呼び出します。擬似コード:
上記のバージョン 1 を呼び出します。モデルは独立しているため、次のように OpenMP スレッドを使用してモデル フィッティングを並列化できます (バージョン 2)。
ホスト マシンでバージョン 1 を実行すると、約 11 秒かかり、VTune はほとんどの時間をアイドル状態に費やして並列化が不十分であると報告します。ホスト マシンでのバージョン 2 の実行には約 5 秒かかり、VTune は優れた並列化を報告します (ほぼ 100% の時間が 8 つの CPU の使用に費やされます)。ここで、Phi カードでネイティブ モード (-mmic を使用) で実行するコードをコンパイルすると、mic0 のコマンド プロンプトで実行すると、バージョン 1 と 2 の両方で約 30 秒かかります。VTune を使用してプロファイリングすると、次のようになります。
- バージョン 1 には同じ約 30 秒かかり、ホットスポット分析では、ほとんどの時間が __kmp_wait_sleep と __kmp_static_yield に費やされていることが示されています。7710 秒の CPU 時間のうち、5804 秒がスピン時間に費やされます。
- バージョン 2 は fooooorrrreevvvver かかります... VTune で数分実行した後、それを強制終了します。ホットスポット分析は、25254 秒の CPU 時間のうち、21585 秒が [vmlinux] で費やされていることを示しています。
ここで何が起こっているのか、なぜこんなにパフォーマンスが悪いのか、誰かが光を当てることができますか? OMP_NUM_THREADS のデフォルトを使用し、KMP_AFFINITY=compact,granularity=fine を設定しています (Intel の推奨に従って)。私は MKL と OpenMP を初めて使用するので、初歩的な間違いを犯していると確信しています。
ありがとう、アンドリュー
performance - CPU使用率と同時実行ヒストグラムのVTUNE結果
Vtune の結果で、数字 0、1、2 (および 3) が実際に表しているものは何ですか?
0 を超える青いバーの意味は何ですか?
c++ - コードがスレッドセーフであることをどのように確認できますか?
このチュートリアルに従って、VTUNE を使用してロックを解除する方法を理解しています。
このページでは、Vtune の結果を収集した後に次のように述べています。
最もホットなコード行を特定する
ホットスポット ナビゲーション ボタンをクリックして、最も待機時間がかかったコード行に移動します。インテル® VTune™ Amplifier は、draw_task 関数のクリティカルセクション rgb_critical_section に入る行 170 を強調表示します。draw_task 関数は、このコード行の実行中に約 27 秒間待機し、ほとんどの時間、プロセッサが十分に活用されていませんでした。この間、クリティカル セクションは 438 回競合しました。
rgb_critical セクションは、アプリケーションがシリアル化する場所です。各スレッドは、処理を続行する前に、クリティカル セクションが使用可能になるまで待機する必要があります。一度にクリティカル セクションに入れることができるスレッドは 1 つだけです。コードを最適化して、並行性を高める必要があります。
次のセクションに到達するまで、このチュートリアルに従うことができました:ロックを解除する
ロックを外す
マルチスレッド アクセスから計算を保護するために、rgb_critical_section が導入されました。簡単な分析は、コードがスレッド セーフであり、クリティカル セクションが実際には必要ないことを示しています。
私の質問は、コードがスレッドセーフであることをどのように確認するのですか?
示唆されているように、これらの行 (EnterCritical... と LeaveCritical...) にコメントしたところ、パフォーマンスが大幅に向上しましたが、なぜこのクリティカル セクションが不要なのかわかりませんでした。どの分析がこれを教えてくれますか?
関連するコードは、analyze_locks.cpp にあります。
java - インテル VTune Amplifier XE 2013 を使用した Java アプリケーションのプロファイリング
Intel VTune Amplifier XE 2013 (最新の update 15 を適用) で Java マルチコア アルゴリズムをプロファイリングしたいと考えています。
そのために、Oracle JDK 1.7.0_40 (64 ビット) を使用して Eclipse から Java アプリケーションを起動し、実行中の Java プロセスに vtune プロファイラーをアタッチします。オペレーティング システムは Windows 8.1 x64 です。vtune による統計の収集は機能しますが、どうやら vtune は JVM に適切に接続できないため、記録されたほとんどの関数呼び出しは「既知のモジュールの外部」としてマークされます。また、収集を開始する前に、VTune コレクターは次の警告を報告します。
誰かがこれを経験し、VTune で完全な Java プロファイキングを有効にする方法を見つけましたか?