これらのイベントの作成者によると、それらは大まかに定義され、使用可能なCPUパフォーマンスカウンターによって概算されます。私が知っているように、perfは、いくつかのハードウェアイベントに基づいていくつかの合成イベントを計算する式をサポートしていないため、Intelの最適化マニュアル(VTuneで実装)のフロントエンド/バックエンドストールバウンドメソッドを使用できませんhttp:// www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf「B.3.2階層型トップダウンパフォーマンス特性評価方法」
%FE_Bound = 100 * (IDQ_UOPS_NOT_DELIVERED.CORE / N );
%Bad_Speculation = 100 * ( (UOPS_ISSUED.ANY – UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / N) ;
%Retiring = 100 * ( UOPS_RETIRED.RETIRE_SLOTS/ N) ;
%BE_Bound = 100 * (1 – (FE_Bound + Retiring + Bad_Speculation) ) ;
N = 4*CPU_CLK_UNHALTED.THREAD" (for SandyBridge)
Andi Kleenのpmu-tools(toplev.py
)で行われたように、適切な式はいくつかの外部スクリプトで使用できます:https://github.com/andikleen/pmu-tools(source)、http://halobates.de/blog/ p / 262(説明):
% toplev.py -d -l2 numademo 100M stream
...
perf stat --log-fd 4 -x, -e
{r3079,r19c,r10401c3,r100030d,rc5,r10e,cycles,r400019c,r2c2,instructions}
{r15e,r60006a3,r30001b1,r40004a3,r8a2,r10001b1,cycles}
numademo 100M stream
...
BE Backend Bound: 72.03%
This category reflects slots where no uops are being delivered due to a lack
of required resources for accepting more uops in the Backend of the pipeline.
.....
FE Frontend Bound: 54.07%
This category reflects slots where the Frontend of the processor undersupplies
its Backend.
元のユニバーサルの代わりに、stalled-cycles-frontendイベントとstalled-cycles-backendイベントを導入したコミットstalled-cycles
:
http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=8f62242246351b5a4bc0c1f00c0c7003edea128a
author Ingo Molnar <mingo@el...> 2011-04-29 11:19:47 (GMT)
committer Ingo Molnar <mingo@el...> 2011-04-29 12:23:58 (GMT)
commit 8f62242246351b5a4bc0c1f00c0c7003edea128a (patch)
tree 9021c99956e0f9dc64655aaa4309c0f0fdb055c9
parent ede70290046043b2638204cab55e26ea1d0c6cd9 (diff)
perfイベント:一般的なフロントエンドとバックエンドのストールサイクルイベント定義を追加します。2つの一般的なハードウェアイベントを追加します:フロントエンドとバックエンドのストールサイクル。
これらのイベントは、CPUがコードを実行しているが、その機能が十分に活用されていない場合の状態を測定します。このような状況を理解して分析することは、コード最適化ワークフローの重要なサブタスクです。
どちらのイベントもパフォーマンスを制限します。ほとんどのフロントエンドストールは、ブランチの予測ミスまたは命令フェッチキャッシュミスによって引き起こされる傾向があり、バックエンドストールは、さまざまなリソース不足または非効率的な命令スケジューリングによって引き起こされる可能性があります。
フロントエンドのストールはより重要なものです。命令ストリームが維持されていないと、コードを高速に実行できません。
バックエンドを使いすぎると、フロントエンドがストールする可能性があるため、同様に注意を払う必要があります。
正確な構成は、プログラムロジックと命令ミックスに大きく依存します。
「ストール」、「フロントエンド」、「バックエンド」という用語を大まかに使用し、これらの概念に近い特定のCPUから利用可能な最良のイベントを使用しようとします。
Cc:Peter Zijlstra Cc:Arnaldo Carvalho de Melo Cc:Frederic Weisbeckerリンク:http://lkml.kernel.org/n/tip-7y40wib8n000io7hjpn1dsrm@git.kernel.org
署名者:Ingo Molnar
/* Install the stalled-cycles event: UOPS_EXECUTED.CORE_ACTIVE_CYCLES,c=1,i=1 */
- intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES] = 0x1803fb1;
+ intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 0x1803fb1;
- PERF_COUNT_HW_STALLED_CYCLES = 7,
+ PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7,
+ PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8,