インテル® PCM によるインテル® トランザクショナル・シンクロナイゼーション・エクステンションのモニタリング

その他

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Monitoring Intel® Transactional Synchronization Extensions with Intel® PCM」(http://software.intel.com/en-us/blogs/2013/05/20/using-hle-and-rtm-with-older-compilers-with-tsx-tools) の日本語参考訳です。


新しいテクノロジー (新しいプロセッサー、ハードウェア・アクセラレーター、新しい命令など) を導入した後、パフォーマンスを測定するには、そのテクノロジーが正しくかつ効率良く適用されたことを確認する手法が必要です。インテル® トランザクショナル・シンクロナイゼーション・エクステンション (インテル® TSX – ロックで保護されたクリティカル・セクションのスペキュレーティブ・エグゼキューション用の命令) も例外ではありません。

第 4 世代インテル® Core™ プロセッサー (インテル® TSX 対応) では、インテル® TSX 実行の成功を測定し、スペキュレーションの失敗に関する情報を提供する特別なハードウェア・モニター機能が追加されました。これらの機能は『インテル® 64 アーキテクチャーおよび IA-32 アーキテクチャー最適化リファレンス・マニュアル』に記述されており、インテル® TSX Linux* perf プロファイラー (http://software.intel.com/en-us/blogs/2013/05/03/intelr-transactional-synchronization-extensions-intelr-tsx-profiling-with-linux-0) およびインテル® パフォーマンス・カウンター・モニター (インテル® PCM) でサポートされています。インテル® PCM には、Windows*、FreeBSD、OS X*、Linux* カーネルで動作する、シンプルなオープンソースのモニタリング API とサンプルツールが含まれます。

この記事では、インテル® PCM TSX ツールの使用例を紹介します。

インテル® PCM-TSX ツールのビルド

Windows* の場合は、PCM パッケージの PCM-TSX_Win ディレクトリーに含まれている Microsoft* Visual Studio* プロジェクトを使用してインテル® PCM-TSX ツール (pcm-tsx.exe) をビルドします (Windows* カーネルドライバーの入手方法については、WINDOWS_HOWTO.rtf (英語) を参照してください)。その他のオペレーティング・システムの場合は、メイン PCM ディレクトリーで ‘make’ コマンドを実行して pcm-tsx.x 実行ファイルをビルドします。

基本的なトランザクションの成功を測定する

アプリケーションでインテル® TSX を有効にした (http://software.intel.com/en-us/blogs/2013/05/20/using-hle-and-rtm-with-older-compilers-with-tsx-tools) 後の最初のステップは、基本的なトランザクションの成功を測定することです。この測定は、Linux* の “perf stat -T” (http://software.intel.com/en-us/blogs/2013/05/03/intelr-transactional-synchronization-extensions-intelr-tsx-profiling-with-linux-0) と似ています。

./pcm-tsx.x ./program
 Intel(r) Performance Counter Monitor: Intel(r) Transactional Synchronization Extensions Monitoring Utility
 Copyright (c) 2013 Intel Corporation
 Executing "./program" command:
Time elapsed: 42 ms
Core | IPC  | Instructions | Cycles  | Transactional Cycles | Aborted Cycles  | #RTM  | #HLE  | Cycles/Transaction
   0   0.58         47 M       81 M        33 M (40.81%)        127 K ( 0.16%)  7239        0      4583
   1   1.13       3278 K     2905 K         0   ( 0.00%)          0   ( 0.00%)     0        0       N/A
   2   0.84       3831 K     4566 K      2659 K (58.24%)       1460   ( 0.03%)   576        0      4617
   3   0.74         33 M       45 M        32 M (70.23%)         85 K ( 0.19%)  7233        0      4446
------------------------------------------------------------------------
   *   0.66         88 M      134 M        68 M (50.56%)        214 K ( 0.16%)   15 K       0      4519

出力結果は、各コアのメトリックとシステム全体の総計メトリックをレポートします。メトリックは IPC (サイクルあたりの命令数)、命令とサイクル数、トランザクションで実行されたサイクル数、アボートされたトランザクション・サイクル数、開始した RTM スペキュレーション数、開始した HLE スペキュレーション数、およびトランザクションあたりの平均トランザクション・サイクル数 (平均トランザクション長) です。トランザクション・サイクル数の割合が低い場合、プログラムはクリティカル・セクションで多くの時間を費やしていないか、ロックがインテル® TSX HLE を有効にしていません。インテル® TSX のチューニング目標は通常、アボートしたサイクル数の割合をできるだけ小さくすること、つまりトランザクションのコミットレートをできるだけ大きくすることです。

また、アプリケーションのバックグラウンドで pcm-tsx.x を実行することもできます。

pcm-tsx.x <update_delay_in_seconds>

アボート原因のカウントとインテル® TSX イベント

インテル® TSX 対応プロセッサーのハードウェア・モニタリング・イベントを使用してトランザクション・アボート原因をカウントできます。インテル® TSX イベントは、引数なしで pcm-tsx を実行するとリストされます。

Usage: pcm-tsx.exe (delay | "external_program") [-C] [-e event1 ] [-e event2 ] [-e event3 ] [-e event4 ]
  <delay>            - delay in seconds between updates. Either delay or "external program" parameters must be supplied
  "external_program" - start external program and print the performance metrics for the execution at the end
  -C             - output in csv format (optional)
  -e eventX      - monitor custom TSX event (up to 4) - optional. List of supported events: 
RTM_RETIRED.START Number of times an RTM execution started.
RTM_RETIRED.COMMIT Number of times an RTM execution successfully committed
RTM_RETIRED.ABORTED Number of times an RTM execution aborted due to any reasons (multiple categories may count as one)
RTM_RETIRED.ABORTED_MISC1 Number of times an RTM execution aborted due to various memory events
RTM_RETIRED.ABORTED_MISC2 Number of times an RTM execution aborted due to uncommon conditions
RTM_RETIRED.ABORTED_MISC3 Number of times an RTM execution aborted due to HLE-unfriendly instructions
RTM_RETIRED.ABORTED_MISC4 Number of times an RTM execution aborted due to incompatible memory type
RTM_RETIRED.ABORTED_MISC5 Number of times an RTM execution aborted due to none of the previous 4 categories (e.g. interrupt)
HLE_RETIRED.START Number of times an HLE execution started.
HLE_RETIRED.COMMIT Number of times an HLE execution successfully committed
HLE_RETIRED.ABORTED Number of times an HLE execution aborted due to any reasons (multiple categories may count as one)
HLE_RETIRED.ABORTED_MISC1 Number of times an HLE execution aborted due to various memory events
HLE_RETIRED.ABORTED_MISC2 Number of times an HLE execution aborted due to uncommon conditions
HLE_RETIRED.ABORTED_MISC3 Number of times an HLE execution aborted due to HLE-unfriendly instructions
HLE_RETIRED.ABORTED_MISC4 Number of times an HLE execution aborted due to incompatible memory type
HLE_RETIRED.ABORTED_MISC5 Number of times an HLE execution aborted due to none of the previous 4 categories (e.g. interrupt)
TX_MEM.ABORT_CONFLICT Number of times a transactional abort was signaled due to a data conflict on a transactionally accessed address
TX_MEM.ABORT_CAPACITY_WRITE Number of times a transactional abort was signaled due to limited resources for transactional stores
TX_MEM.ABORT_HLE_STORE_TO_ELIDED_LOCK Number of times a HLE transactional region aborted due to a non XRELEASE prefixed instruction writing to an elided lock in the elision buffer
TX_MEM.ABORT_HLE_ELISION_BUFFER_NOT_EMPTY Number of times an HLE transactional execution aborted due to NoAllocatedElisionBuffer being nonzero.
TX_MEM.ABORT_HLE_ELISION_BUFFER_MISMATCH Number of times an HLE transactional execution aborted due to XRELEASE lock not satisfying the address and value requirements in the elision buffer.
TX_MEM.ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT Number of times an HLE transactional execution aborted due to an unsupported read alignment from the elision buffer.
TX_MEM.ABORT_HLE_ELISION_BUFFER_FULL Number of times HLE lock could not be elided due to ElisionBufferAvailable being zero.
TX_EXEC.MISC1 Counts the number of times a class of instructions that may cause a transactional abort was executed. Since this is the count of execution, it may not always cause a transactional abort.
TX_EXEC.MISC2 Counts the number of times a class of instructions that may cause a transactional abort was executed inside a transactional region
TX_EXEC.MISC3 Counts the number of times an instruction execution caused the nest count supported to be exceeded
TX_EXEC.MISC4 Counts the number of times an HLE XACQUIRE instruction was executed inside an RTM transactional region

次のサンプルを用いて、RTM 実行における競合によるアボート数、トランザクション・バッファー・オーバーフローの総数、インテル® TSX 非対応命令によるアボート数、その他のアボート数を推定する方法を説明します。

pcm-tsx.x ./program -e RTM_RETIRED.ABORTED -e RTM_RETIRED.ABORTED_MISC1 -e TX_MEM.ABORT_CONFLICT -e RTM_RETIRED.ABORTED_MISC3
 Intel(r) Performance Counter Monitor: Intel(r) Transactional Synchronization Extensions Monitoring Utility
Executing "./program" command:
Time elapsed: 9549 ms
Event0: RTM_RETIRED.ABORTED Number of times an RTM execution aborted due to any reasons (multiple categories may count as one) (raw 0x4c9)
Event1: RTM_RETIRED.ABORTED_MISC1 Number of times an RTM execution aborted due to various memory events (raw 0x8c9)
Event2: TX_MEM.ABORT_CONFLICT Number of times a transactional abort was signalled due to a data conflict on a transactionally accessed address (raw 0x154)
Event3: RTM_RETIRED.ABORTED_MISC3 Number of times an RTM execution aborted due to HLE-unfriendly instructions (raw 0x20c9)
Core | Event0  | Event1  | Event2  | Event3
   0   8707 K    8701 K    8810 K       0
   1      0         0         0         0
   2      1         0         0         0
   3   8247 K    8242 K    9231 K       0
--------------------------------------------------
   *     16 M      16 M      18 M       0

競合の数は Event 2 (TX_MEM.ABORT_CONFLICT) として、RTM 非対応命令によるアボート数は Event 3 (RTM_RETIRED.ABORTED_MISC3) として、直接取得できます。トランザクション・バッファー・オーバーフローの総数を取得するには、RTM_RETIRED.MISC1 – TX_MEM.ABORT_CONFLICT を計算します。複数のアボートシグナルは異なるカテゴリーで 1 つとしてカウントされる場合があることに注意してください (例えば、TX_MEM.ABORT_CONFLICT > RTM_RETIRED.ABORTED_MISC1)。その他のアボート数は、RTM_RETIRED.ABORTED – RTM_RETIRED.MISC1 – RTM_RETIRED.MISC3 を計算します。その他のアボートの原因を調べるには、上記のリストから異なるインテル® TSX イベントを選択します。

インテル® TSX のチューニング

インテル® TSX のチューニング・プロセスの次のステップは、アプリケーション・コードでアボートの場所 (トランザクションを “kill” しているコード) を調べることです。このステップでは、インテル® TSX PEBS 対応のサンプリング・プロファイラー (http://software.intel.com/en-us/blogs/2013/05/03/intelr-transactional-synchronization-extensions-intelr-tsx-profiling-with-linux-0) (同期アボート: TSX 非対応命令、フォールト、その他) およびインテル® TSX エミュレーター (一部の同期アボートと非同期アボート: 競合とトランザクション・バッファー・オーバーフロー) を使用します。アボートを回避する方法については、インテル® TSX の推奨事項 (第 12 章) を参照してください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました