この記事は、インテル® デベロッパー・ゾーンに掲載されている「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 章) を参照してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。