EN JA
PMC.K8(3)
PMC.K8(3) FreeBSD Library Functions Manual PMC.K8(3)

名称

pmc.k8AMD Athlon 64 (K8 ファミリ) CPU のための測定イベント

ライブラリ

Performance Counters Library (libpmc, -lpmc)

書式

#include < pmc.h>

解説

AMD K8 PMC は、 AMD Athlon64 と AMD Opteron シリーズの CPU に存在しています。それらは、次に文書化されています。 BIOS and Kernel Developer's Guide for the AMD Athlon(tm) 64 and AMD Opteron Processors, Publication No. 26094, Advanced Micro Devices, Inc., April 2004.

PMC 機能

AMD K8 PMC は、48 ビット幅です。各 CPU は、次のケーパビリティがある 4 つの PMC を含んでいます:
Capability Support
PMC_CAP_CASCADE No
PMC_CAP_EDGE Yes
PMC_CAP_INTERRUPT Yes
PMC_CAP_INVERT Yes
PMC_CAP_READ Yes
PMC_CAP_PRECISE No
PMC_CAP_SYSTEM Yes
PMC_CAP_TAGGING No
PMC_CAP_THRESHOLD Yes
PMC_CAP_USER Yes
PMC_CAP_WRITE Yes

イベント修飾子

AMD K8 PMC のためのイベント指定子は、次のオプションの修飾子を持つことができます:
count= value
1 つのサイクルで測定される設定されたイベントの数が、 value 以上の場合のみ、増加するようにカウンタを設定します。
edge
他のフィールドよって表現された条件の否定アサート (negated-to-asserted) 遷移をカウントするように設定します。言い換えれば、状態が真のままで残っている間クロックの数にかかわらず、与えられた状態が真になるときはいつも、カウンタは一度だけ増加します。
inv
count”修飾子が存在しているとき、比較の意味を逆にし、サイクルごとのイベントの数が、“ count”修飾子によって指定された値より小さいときに、カウンタを増加します。
mask= qualifier
AMD K8 PMC のための多くのイベント指定子は、マスク修飾子を使用してさらに修飾される必要があります。これらの追加修飾子は、イベント特有であり、下記のイベント指定子に関連して文書化されています。
os
特権レベル 0 で起こるイベントをカウントするように、PMC を設定します。
usr
特権レベル 1, 2 または 3 で起こるイベントをカウントするように、 PMC を設定します。

os”または“ usr”修飾子のどちらも指定されなかったなら、デフォルトは、両方を有効にすることです。

AMD K8 イベント指定子

AMD K8 PMC でサポートされたイベント指定子は、次の通りです:
k8-bu-cpu-clk-unhalted
(Event 76H) CPU が HLT または STPCLK 状態でないとき、クロックサイクルの数をカウントします。
k8-bu-fill-request-l2-miss [ ,mask=qualifier]
(Event 7EH) L2 キャッシュでミスした fill 要求をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

dc-fill
データキャッシュ fill 要求をカウントします。
ic-fill
命令キャッシュ fill 要求をカウントします。
tlb-reload
TLB 再ロードをカウントします。

デフォルトは、すべてのタイプの要求をカウントすることです。

k8-bu-fill-into-l2 [ ,mask=qualifier]
(Event 7FH) L2 キャッシュへ書き込まれ、L2 キャッシュから書き込まれた線の数。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

dirty-l2-victim
Icache または Dcache、TLB ページテーブル walk またはハードウェアデータプリフェッチから victim 書き戻し (writeback) のために L2 キャッシュへの書き込み線をカウントします。
victim-from-l2
L2 からシステムへの汚い線の書き戻し (writeback) をカウントします。
k8-bu-internal-l2-request [ ,mask=qualifier]
(Event 7DH) L2 キャッシュへの内部的に発生した要求をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

cancelled
キャンセルされた要求をカウントします。
dc-fill
データキャッシュ fill 要求をカウントします。
ic-fill
命令キャッシュ fill 要求をカウントします。
tag-snoop
タグスムープ (snoop) 要求をカウントします。
tlb-reload
TLB 再ロードをカウントします。

デフォルトは、すべてのタイプの要求をカウントすることです。

k8-dc-access
(Event 40H) マイクロコードスクラッチパッドアクセスを含むデータキャッシュアクセスをカウントします。
k8-dc-copyback [ ,mask=qualifier]
(Event 44H) データキャッシュコピーバック (copyback) 操作をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

exclusive
“exclusive” (排他的な) 状態の線のための操作をカウントします。
invalid
“invalid” (無効) 状態の線のための操作をカウントします。
modified
“modified” (修正された) 状態の線のための操作をカウントします。
owner
“owner” (所有者) 状態の線のための操作をカウントします。
shared
“shared” (共有された) 状態の線のための操作をカウントします。

デフォルトは、すべての上記の状態の線のための操作をカウントすることです。

k8-dc-dcache-accesses-by-locks [ ,mask=qualifier]
(Event 4CH) ロック命令によってアクセスされるデータキャッシュをカウントします。このイベントは、リビジョン C または後のビンテージのプロセッサでのみ利用可能です。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

accesses
ロック命令によるデータキャッシュアクセスをカウントします。
misses
ロック命令によるデータキャッシュミスをカウントします。

デフォルトは、すべてのアクセスをカウントすることです。

k8-dc-dispatched-prefetch-instructions [ ,mask=qualifier]
(Event 4BH) ディスパッチされたプリフェッチ命令の数をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

load
ロード (load) 操作をカウントします。
nta
一時的でない (non-temporal) 操作をカウントします。
store
格納 (store) 操作をカウントします。

デフォルトは、すべての操作をカウントすることです。

k8-dc-l1-dtlb-miss-and-l2-dtlb-hit
(Event 45H) L2 DTLB ヒットである L1 DTLB ミスをカウントします。
k8-dc-l1-dtlb-miss-and-l2-dtlb-miss
(Event 46H) また L2 DTLB でミスした L1 DTLB ミスをカウントします。
k8-dc-microarchitectural-early-cancel-of-an-access
(Event 49H) データキャッシュアクセスのマイクロアーキテクチャの早めのキャンセルをカウントします。
k8-dc-microarchitectural-late-cancel-of-an-access
(Event 48H) データキャッシュアクセスのマイクロアーキテクチャの遅めのキャンセルをカウントします。
k8-dc-misaligned-data-reference
(Event 47H) 整列ミスのデータ参照をカウントします。
k8-dc-miss
(Event 41H) データキャッシュミスをカウントします。
k8-dc-one-bit-ecc-error [ ,mask=qualifier]
(Event 4AH) スクラバ (scrubber) によって見つけられた 1 ビット ECC エラーをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

scrubber
スクラバが検出したエラーをカウントします。
piggyback
ピギーバック (piggyback) スクラバエラーをカウントします。

デフォルトは、両方の種類のエラーをカウントすることです。

k8-dc-refill-from-l2 [ ,mask=qualifier]
(Event 42H) L2 キャッシュからデータキャッシュ refill (リフィル, 補充) をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

exclusive
“exclusive” (排他的な) 状態の線のための操作をカウントします。
invalid
“invalid” (無効) 状態の線のための操作をカウントします。
modified
“modified” (修正された) 状態の線のための操作をカウントします。
owner
“owner” (所有者) 状態の線のための操作をカウントします。
shared
“shared” (共有された) 状態の線のための操作をカウントします。

デフォルトは、すべての上記の状態の線のための操作をカウントすることです。

k8-dc-refill-from-system [ ,mask=qualifier]
(Event 43H) システムメモリから refill (リフィル, 補充) されたデータキャッシュをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

exclusive
“exclusive” (排他的な) 状態の線のための操作をカウントします。
invalid
“invalid” (無効) 状態の線のための操作をカウントします。
modified
“modified” (修正された) 状態の線のための操作をカウントします。
owner
“owner” (所有者) 状態の線のための操作をカウントします。
shared
“shared” (共有された) 状態の線のための操作をカウントします。

デフォルトは、すべての上記の状態の線のための操作をカウントすることです。

k8-fp-cycles-with-no-fpu-ops-retired
(Event 01H) FPU オペレーション (ops) がリタイアしなかったときのサイクルをカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。
k8-fp-dispatched-fpu-fast-flag-ops
(Event 02H) 速いフラグインタフェースを使用するディスパッチされた FPU オペレーション (ops) をカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。
k8-fp-dispatched-fpu-ops [ ,mask=qualifier]
(Event 00H) ディスパッチされた FPU オペレーション (ops) 数をカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

add-pipe-excluding-junk-ops
ジャンクオペレーション (ops) を除いて追加 (add) パイプオペレーション (ops) をカウントします。
add-pipe-junk-ops
追加 (add) パイプでジャンクオペレーション (ops) をカウントします。
multiply-pipe-excluding-junk-ops
ジャンクオペレーション (ops) を除いて乗算 (multiply) パイプオペレーション (ops) をカウントします。
multiply-pipe-junk-ops
乗算 (multiply) パイプでジャンクオペレーション (ops) をカウントします。
store-pipe-excluding-junk-ops
ジャンクオペレーション (ops) を除いて格納 (store) パイプオペレーション (ops) をカウントします。
store-pipe-junk-ops
格納 (store) パイプでジャンクオペレーション (ops) をカウントします。

デフォルトは、すべてのタイプのオペレーション (ops) をカウントすることです。

k8-fr-decoder-empty
(Event D0H) ディスパッチのために何もないときのサイクルをカウントします (すなわち、デコーダは、空であった)。
k8-fr-dispatch-stall-for-segment-load
(Event D4H) セグメントロードのためのディスパッチストール (行き詰まり) をカウントします。
k8-fr-dispatch-stall-for-serialization
(Event D3H) シリアライゼーションためのディスパッチストールをカウントします。
k8-fr-dispatch-stall-from-branch-abort-to-retire
(Event D2H) リタイア (retiral) のためにアボートする分岐からのディスパッチストールをカウントします。
k8-fr-dispatch-stall-when-fpu-is-full
(Event D7H) FPU が満杯であるときのディスパッチストールをカウントします。
k8-fr-dispatch-stall-when-ls-is-full
(Event D8H) ロード/格納 (load/store) が満杯であるときの
k8-fr-dispatch-stall-when-reorder-buffer-is-full
(Event D5H) リオーダ (reorder) バッファが満杯であるときのディスパッチストールをカウントします。
k8-fr-dispatch-stall-when-reservation-stations-are-full
(Event D6H) リザーブ (予約) ステーションが満杯であるときのディスパッチストールをカウントします。
k8-fr-dispatch-stall-when-waiting-far-xfer-or-resync-branch-pending
(Event DAH) 遠い (far) 制御転送か、または再シンク (resync) 分岐がペンディングであるときのディスパッチストールをカウントします。
k8-fr-dispatch-stall-when-waiting-for-all-to-be-quiet
(Event D9H) すべてが静かであるために待つときのディスパッチストールをカウントします。
k8-fr-dispatch-stalls
(Event D1H) すべてのディスパッチストールをカウントします。
k8-fr-fpu-exceptions [ ,mask=qualifier]
(Event DBH) FPU 例外をカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

sse-and-x87-microtraps
SSE と x87 マイクロトラップをカウントします。
sse-reclass-microfaults
SSE reclass マイクロフォルトをカウントします。
sse-retype-microfaults
SSE retype マイクロフォルトをカウントします。
x87-reclass-microfaults
x87 reclass マイクロフォルトをカウントします。

デフォルトは、すべてのタイプの例外をカウントすることです。

k8-fr-interrupts-masked-cycles
(Event CDH) (CPU RFLAGS フィールドの IF が 0 によって) 割り込みがマスクされたときのサイクルをカウントします。
k8-fr-interrupts-masked-while-pending-cycles
(Event CEH) ペンディングの間に割り込みがマスクされている間のサイクルをカウントします (すなわち、INTR が CPU RFLAGS フィールドの IF が 0 の間にアサートされたときのサイクル)。
k8-fr-number-of-breakpoints-for-dr0
(Event DCH) DR0 のためのブレークポイントの数をカウントします。
k8-fr-number-of-breakpoints-for-dr1
(Event DDH) DR1 のためのブレークポイントの数をカウントします。
k8-fr-number-of-breakpoints-for-dr2
(Event DEH) DR2 のためのブレークポイントの数をカウントします。
k8-fr-number-of-breakpoints-for-dr3
(Event DFH) DR3 のためのブレークポイントの数をカウントします。
k8-fr-retired-branches
(Event C2H) 例外と割り込みを含むリタイアした分岐をカウントします。
k8-fr-retired-branches-mispredicted
(Event C3H) 予測ミスしリタイアした分岐をカウントします。
k8-fr-retired-far-control-transfers
(Event C6H) (常に予測ミスされる) リタイアした遠い (far) 制御転送をカウントします。
k8-fr-retired-fastpath-double-op-instructions [ ,mask=qualifier]
(Event CCH) リタイアしたファーストパス (fastpath) 二重オペレーション (op) 命令をカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

low-op-pos-0
位置 0 で低いオペレーション (low op) での命令をカウントします。
low-op-pos-1
位置 1 で低いオペレーション (low op) での命令をカウントします。
low-op-pos-2
位置 2 で低いオペレーション (low op) での命令をカウントします。

デフォルトは、すべてのタイプの命令をカウントすることです。

k8-fr-retired-fpu-instructions [ ,mask=qualifier]
(Event CBH) リタイアした FPU 命令をカウントします。このイベントは、リビジョン B とその後の CPU でサポートされています。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

mmx-3dnow
MMX と 3DNow! 命令をカウントします。
packed-sse-sse2
パックされた SSE と SSE2 命令をカウントします。
scalar-sse-sse2
スカラの SSE と SSE2 命令をカウントします。
x87
x87 命令をカウントします。

デフォルトは、すべてのタイプの命令をカウントすることです。

k8-fr-retired-near-returns
(Event C8H) リタイアした近い (near) リターンをカウントします。
k8-fr-retired-near-returns-mispredicted
(Event C9H) 予測ミスした近い (near) リターンをカウントします。
k8-fr-retired-resyncs
(Event C7H) リタイアした再同時 (resyncs) (非制御転送分岐) をカウントします。
k8-fr-retired-taken-branches
(Event C4H) リタイアして取られた分岐をカウントします。
k8-fr-retired-taken-branches-mispredicted
(Event C5H) 予測ミスされているリアイアして取られた分岐をカウントします。
k8-fr-retired-taken-branches-mispredicted-by-addr-miscompare
(Event CAH) アドレスの比較ミスのためだけに予測ミスされているリタイアして取られた分岐をカウントします。
k8-fr-retired-taken-hardware-interrupts
(Event CFH) リタイアして取られたハードウェア割り込みをカウントします。
k8-fr-retired-uops
(Event C1H) リタイアした uop をカウントします。
k8-fr-retired-x86-instructions
(Event C0H) 例外と割り込みを含むリタイアした x86 命令をカウントします。
k8-ic-fetch
(Event 80H) 命令キャッシュフェッチをカウントします。
k8-ic-instruction-fetch-stall
(Event 87H) 命令のフェッチのためにストールしているサイクルをカウントします。
k8-ic-l1-itlb-miss-and-l2-itlb-hit
(Event 84H) L2 ITLB ヒットである L1 ITLB ミスをカウントします。
k8-ic-l1-itlb-miss-and-l2-itlb-miss
(Event 85H) L1 と L2 ITLB の両方でミスしている ITLB ミスをカウントします。
k8-ic-microarchitectural-resync-by-snoop
(Event 86H) スヌープ (snoop) によって引き起こされたマイクロアーキテクチャの再同期 (resync) をカウントします。
k8-ic-miss
(Event 81H) 命令キャッシュミスをカウントします。
k8-ic-refill-from-l2
(Event 82H) L2 キャッシュからの命令キャッシュリフィル (refill) をカウントします。
k8-ic-refill-from-system
(Event 83H) システムメモリからの命令キャッシュリフィル (refill) をカウントします。
k8-ic-return-stack-hits
(Event 88H) リターンスタックまでヒットをカウントします。
k8-ic-return-stack-overflow
(Event 89H) リターンスタックのオーバフローをカウントします。
k8-ls-buffer2-full
(Event 23H) バッファ 2 (buffer2) のロード/格納 (load/store) 満杯のイベントをカウントします。
k8-ls-locked-operation [ ,mask=qualifier]
(Event 24H) ロックされた操作をカウントします。リビジョン C とその後の CPU に関しては、次の修飾子がサポートされています:

cycles-in-request
ロックの要求/許可 (request/grant) ステージでのサイクルの数をカウントします。
cycles-to-complete
推測的でない、より古いロード/格納 (load/store) 操作である時点で、完了するために取られるロックのサイクルの数をカウントします。
locked-instructions
ロック命令を実行した数をカウントします。

デフォルトは、ロック命令を実行した数をカウントすることです。

k8-ls-microarchitectural-late-cancel
(Event 25H) ロード/格納 (load/store) ユニットでの操作のマイクロアーキテクチャの遅いキャンセルをカウントします。
k8-ls-microarchitectural-resync-by-self-modifying-code
(Event 21H) 自己変更コードに起因するマイクロアーキテクチャの再同期 (resync) をカウントします。
k8-ls-microarchitectural-resync-by-snoop
(Event 22H) スヌープ (snoop) に起因するマイクロアーキテクチャの再同期 (resync) をカウントします。
k8-ls-retired-cflush-instructions
(Event 26H) リタイアした CFLUSH 命令をカウントします。
k8-ls-retired-cpuid-instructions
(Event 27H) リタイアした CPUID 命令をカウントします。
k8-ls-segment-register-load [ ,mask=qualifier]
(Event 20H) セグメントレジスタロード (load) をカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:
cs
CS レジスタロード (load) をカウントします。
ds
DS レジスタロード (load) をカウントします。
es
ES レジスタロード (load) をカウントします。
fs
FS レジスタロード (load) をカウントします。
gs
GS レジスタロード (load) をカウントします。
ss
SS レジスタロード (load) をカウントします。

デフォルトは、すべてのタイプのロード (load) をカウントすることです。

k8-nb-ht-bus0-bandwidth [ ,mask=qualifier]
k8-nb-ht-bus1-bandwidth [ ,mask=qualifier]
k8-nb-ht-bus2-bandwidth [ ,mask=qualifier]
(Events F6H, F7H and F8H respectively) HyperTransport(tm) バスでのイベントをカウントします。これらのイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

buffer-release
送ったバッファ解放メッセージをカウントします。
command
送ったコマンドメッセージをカウントします。
data
送ったデータメッセージをカウントします。
nop
送った nop メッセージをカウントします。

デフォルトは、すべてのタイプのメッセージをカウントすることです。

k8-nb-memory-controller-bypass-saturation [ ,mask=qualifier]
(Event E4H) メモリ制御バイパスカウンタ飽和イベントをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

dram-controller-interface-bypass
DRAM コントローラインタフェースバイパスをカウントします。
dram-controller-queue-bypass
DRAM コントローラキューバイパスをカウントします。
memory-controller-hi-pri-bypass
メモリコントローラの高い優先権バイパスをカウントします。
memory-controller-lo-pri-bypass
メモリコントローラの低い優先権バイパスをカウントします。
k8-nb-memory-controller-dram-slots-missed
(Event E2H) (MemClk で) スロットをミスしたメモリコントローラ DRAM コマンドをカウントします。
k8-nb-memory-controller-page-access-event [ ,mask=qualifier]
(Event E0H) メモリコントローラページアクセスイベントをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

page-conflict
ページ競合をカウントします。
page-hit
ページヒットをカウントします。
page-miss
ページミスをカウントします。

デフォルトは、すべてのタイプのイベントをカウントすることです。

k8-nb-memory-controller-page-table-overflow
(Event E1H) メモリコントロールページテーブルオーバフローイベントをカウントします。
k8-nb-memory-controller-turnaround [ ,mask=qualifier]
(Event E3H) メモリ制御ターンアラウンドイベントをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

dimm-turnaround
DIMM ターンアラウンドをカウントします。
read-to-write-turnaround
読み込みから書き込みターンアラウンドをカウントします。
write-to-read-turnaround
書き込みから読み込みターンアラウンドをカウントします。

デフォルトは、すべてのタイプのイベントをカウントすることです。

k8-nb-probe-result [ ,mask=qualifier]
(Event ECH) プローブ (probe) イベントをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

probe-hit
すべてのプローブ (probe) ヒットをカウントします。
probe-hit-dirty-no-memory-cancel
メモリキャンセルなしでプローブ (probe) ヒットをカウントします。
probe-hit-dirty-with-memory-cancel
メモリキャンセルでのプローブ (probe) ヒットをカウントします。
probe-miss
プローブ (probe) ミスをカウントします。
k8-nb-sized-commands [ ,mask=qualifier]
(Event EBH) 発行されたサイズコマンドをカウントします。このイベントは、‘ +’で区切られた次のキーワードの組である qualifier を使用して、さらに修飾できます:

nonpostwrszbyte
nonpostwrszdword
postwrszbyte
postwrszdword
rdszbyte
rdszdword
rdmodwr

デフォルトは、すべてのタイプのコマンドをカウントすることです。

イベント名の別名

次のテーブルは、 Performance Counters Library (libpmc, -lpmc) と使用される基本的なハードウェアイベントによってサポートされた PMC から独立している別名の間のマッピングを表示しています。
Alias Event
branches k8-fr-retired-taken-branches
branch-mispredicts k8-fr-retired-taken-branches-mispredicted
dc-misses k8-dc-miss
ic-misses k8-ic-miss
instructions k8-fr-retired-x86-instructions
interrupts k8-fr-taken-hardware-interrupts
unhalted-cycles k8-bu-cpu-clk-unhalted

歴史

pmc ライブラリは、 FreeBSD 6.0 ではじめて登場しました。

作者

Performance Counters Library (libpmc, -lpmc) ライブラリは、 Joseph Koshy <jkoshy@FreeBSD.org>によって書かれました。
October 4, 2008 FreeBSD