mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 08:15:07 -04:00
Merge tag 'perf-tools-for-v7.3-2026-08-21' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools
Pull perf tools updates from Namhyung Kim:
"perf c2c:
- Add 'function view' in perf c2c report TUI (switched by pressing
'TAB' in the cacheline view) to organize samples around functions
rather than cachelines in 3-level hierarchy:
Level 1: Read-side function (sorted by estimated Cycles %)
Level 2: Contending writer functions (sorted by Store count)
Level 3: Shared cacheline addresses
Users can navigate the entries and fold/unfold using 'e' key. An
example output would look like below:
Shared Data Functions Table (19 entries, sorted on Cycles %)
Cycles Store
% count Function / Contending function / Cacheline
----------------------------------------------------------------------
+ 35.67% 876 + [k] cpupri_set
+ 24.31% 424 + [k] pull_rt_task
- 16.53% 555 - [k] dequeue_pushable_task
145 - [k] pull_rt_task
145 0xff2d0082809da080
139 - [k] enqueue_pushable_task
70 0xff2d00a2071f9640
69 0xff2d0082809da000
python module support:
- Extend "perf" python module so that it can be fully functional. The
goal is to run scripts directly, not by 'perf script' command. This
would give better performance as well as more control to build
standalone programs with UI.
- Add LiveSession helper (perf_live.py) to enable live event
collection directly from Python using perf.evlist and
perf.parse_events.
perf stat:
- Add --hide-zero-events option to suppress zero-count events
- Reject conflicting --field-separator and --json-output options
- Fix duplicate event output with --for-each-cgroup
perf sched latency:
- Add -H/--histogram and --hist-mode (log|linear) options to show
scheduler wait latency histograms
- Add --time option to filter analysis by time span in 'perf sched
latency'
ARM CoreSight:
- Synthesize callchains for instruction samples from CoreSight trace
using thread stack ('--itrace=g...')
- Support call indentation ('perf script -F +callindent') to display
call depth hierarchy on branch samples
- Decode ETE (Embedded Trace Extension) exception packets
Build system:
- Add 'make install-build-deps' target to install required packages
- Parallelize JSON and metric pre-computation in jevents.py for
faster builds
Vendor event/metric updates:
- Add Intel Nova Lake events and update tables for existing models
- Update AMD Zen 5 and Zen 6 core events
- Update Arm64 Tegra410 metrics and PowerPC hcalls
Internal changes and fixes:
- Harden trace-event and synthetic event parsing against corrupted
data
- Fix unwinding of multi-threaded processes in libdw unwinder
- Fix memory leaks in various commands and python bindings
- Speed up 'perf test' shell tests"
* tag 'perf-tools-for-v7.3-2026-08-21' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: (232 commits)
perf vendor events arm64: Fix Tegra410 Olympus event 0x0197
perf vendor events arm64: fix swapped MetricGroup for Tegra410 L1 prefetcher metrics
perf evlist: Warn when 'sleep' workload is used without system-wide (-a) option
perf c2c: document function view in perf-c2c man page
perf c2c: add function view browser UI and cacheline detail
perf c2c: build and finalize the function view hierarchy
perf c2c: add function view hierarchy entry creation
perf c2c: add function view stats merge and memory management
perf c2c: add HPP list parsing for function view columns
perf c2c: add column rendering for function view
perf c2c: add function view model skeleton
perf c2c: extract shared data structures into util/c2c.h
perf test sample-parsing: Validate PERF_FORMAT_GROUP values without LOST
perf dso: Replace assert with runtime check in dso__read_symbol()
perf dso: Guard against cache underflow on short reads in dso_cache__memcpy()
perf dso: Use stored fd error instead of stale errno in file_read() and file_size()
perf dso: Guard close() against invalid fd in dso__decompress_kmodule_path()
perf dso: Guard against errno==0 when dso__get_filename() returns NULL
perf build: install-build-deps: add RHEL family devel package mapping
perf build: Remove leftover feature tests for removed cxx and clang support
...
This commit is contained in:
@@ -285,20 +285,20 @@ according to the format described previously (take 8DW as an example):
|
||||
[...perf headers and other information]
|
||||
. ... HISI PTT data: size 4194304 bytes
|
||||
. 00000000: 00 00 00 00 Prefix
|
||||
. 00000004: 01 00 00 60 Header DW0
|
||||
. 00000008: 0f 1e 00 01 Header DW1
|
||||
. 0000000c: 04 00 00 00 Header DW2
|
||||
. 00000010: 40 00 81 02 Header DW3
|
||||
. 00000014: 33 c0 04 00 Time
|
||||
. 00000004: 60 00 00 01 Header DW0
|
||||
. 00000008: 01 00 1e 0f Header DW1
|
||||
. 0000000c: 00 00 00 04 Header DW2
|
||||
. 00000010: 02 81 00 40 Header DW3
|
||||
. 00000014: 00 04 c0 33 Time
|
||||
. 00000020: 00 00 00 00 Prefix
|
||||
. 00000024: 01 00 00 60 Header DW0
|
||||
. 00000028: 0f 1e 00 01 Header DW1
|
||||
. 0000002c: 04 00 00 00 Header DW2
|
||||
. 00000030: 40 00 81 02 Header DW3
|
||||
. 00000034: 02 00 00 00 Time
|
||||
. 00000024: 60 00 00 01 Header DW0
|
||||
. 00000028: 01 00 1e 0f Header DW1
|
||||
. 0000002c: 00 00 00 04 Header DW2
|
||||
. 00000030: 02 81 00 40 Header DW3
|
||||
. 00000034: 00 00 00 02 Time
|
||||
. 00000040: 00 00 00 00 Prefix
|
||||
. 00000044: 01 00 00 60 Header DW0
|
||||
. 00000048: 0f 1e 00 01 Header DW1
|
||||
. 0000004c: 04 00 00 00 Header DW2
|
||||
. 00000050: 40 00 81 02 Header DW3
|
||||
. 00000044: 60 00 00 01 Header DW0
|
||||
. 00000048: 01 00 1e 0f Header DW1
|
||||
. 0000004c: 00 00 00 04 Header DW2
|
||||
. 00000050: 02 81 00 40 Header DW3
|
||||
[...]
|
||||
|
||||
@@ -20,9 +20,6 @@ HOST_OVERRIDES := AR="$(HOSTAR)" CC="$(HOSTCC)" LD="$(HOSTLD)" ARCH="$(HOSTARCH)
|
||||
CROSS_COMPILE="" CLANG_CROSS_FLAGS="" EXTRA_CFLAGS="$(HOSTCFLAGS)"
|
||||
|
||||
RM ?= rm
|
||||
HOSTCC ?= gcc
|
||||
HOSTLD ?= ld
|
||||
HOSTAR ?= ar
|
||||
HOSTPKG_CONFIG ?= pkg-config
|
||||
CROSS_COMPILE =
|
||||
|
||||
|
||||
@@ -123,9 +123,7 @@ FEATURE_TESTS_EXTRA := \
|
||||
libbfd-liberty-z \
|
||||
libopencsd \
|
||||
libperl \
|
||||
cxx \
|
||||
llvm \
|
||||
clang \
|
||||
libbpf \
|
||||
libpfm4 \
|
||||
libdebuginfod \
|
||||
|
||||
@@ -55,7 +55,6 @@ FILES= \
|
||||
test-bpf.bin \
|
||||
test-libbpf.bin \
|
||||
test-sdt.bin \
|
||||
test-cxx.bin \
|
||||
test-gettid.bin \
|
||||
test-jvmti.bin \
|
||||
test-jvmti-cmlr.bin \
|
||||
@@ -63,7 +62,6 @@ FILES= \
|
||||
test-sched_getcpu.bin \
|
||||
test-setns.bin \
|
||||
test-libopencsd.bin \
|
||||
test-clang.bin \
|
||||
test-llvm.bin \
|
||||
test-llvm-perf.bin \
|
||||
test-libaio.bin \
|
||||
@@ -335,9 +333,6 @@ $(OUTPUT)test-libbpf.bin:
|
||||
$(OUTPUT)test-sdt.bin:
|
||||
$(BUILD)
|
||||
|
||||
$(OUTPUT)test-cxx.bin:
|
||||
$(BUILDXX) -std=gnu++11
|
||||
|
||||
$(OUTPUT)test-gettid.bin:
|
||||
$(BUILD)
|
||||
|
||||
@@ -363,15 +358,6 @@ $(OUTPUT)test-llvm-perf.bin:
|
||||
$(shell $(LLVM_CONFIG) --system-libs) \
|
||||
> $(@:.bin=.make.output) 2>&1
|
||||
|
||||
$(OUTPUT)test-clang.bin:
|
||||
$(BUILDXX) -std=gnu++17 \
|
||||
-I$(shell $(LLVM_CONFIG) --includedir) \
|
||||
-L$(shell $(LLVM_CONFIG) --libdir) \
|
||||
-Wl,--start-group -lclang-cpp -Wl,--end-group \
|
||||
$(shell $(LLVM_CONFIG) --libs Core option) \
|
||||
$(shell $(LLVM_CONFIG) --system-libs) \
|
||||
> $(@:.bin=.make.output) 2>&1
|
||||
|
||||
-include $(OUTPUT)*.d
|
||||
|
||||
$(OUTPUT)test-libaio.bin:
|
||||
|
||||
@@ -9,10 +9,6 @@ srctree := $(patsubst %/,%,$(dir $(srctree)))
|
||||
#$(info Determined 'srctree' to be $(srctree))
|
||||
endif
|
||||
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
AR ?= $(CROSS_COMPILE)ar
|
||||
LD ?= $(CROSS_COMPILE)ld
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
INSTALL = install
|
||||
|
||||
@@ -31,7 +31,8 @@ int fdarray__grow(struct fdarray *fda, int nr)
|
||||
|
||||
priv = realloc(fda->priv, psize);
|
||||
if (priv == NULL) {
|
||||
free(entries);
|
||||
/* this will be freed by fdarray__exit() */
|
||||
fda->entries = entries;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -50,7 +51,7 @@ struct fdarray *fdarray__new(int nr_alloc, int nr_autogrow)
|
||||
|
||||
if (fda != NULL) {
|
||||
if (fdarray__grow(fda, nr_alloc)) {
|
||||
free(fda);
|
||||
fdarray__delete(fda);
|
||||
fda = NULL;
|
||||
} else {
|
||||
fda->nr_autogrow = nr_autogrow;
|
||||
@@ -115,6 +116,9 @@ int fdarray__filter(struct fdarray *fda, short revents,
|
||||
return 0;
|
||||
|
||||
for (fd = 0; fd < fda->nr; ++fd) {
|
||||
if (fda->priv[fd].flags & fdarray_flag__nonfilterable)
|
||||
continue;
|
||||
|
||||
if (!fda->entries[fd].events)
|
||||
continue;
|
||||
|
||||
@@ -122,12 +126,17 @@ int fdarray__filter(struct fdarray *fda, short revents,
|
||||
if (entry_destructor)
|
||||
entry_destructor(fda, fd, arg);
|
||||
|
||||
/*
|
||||
* Set fd to -1 so poll() ignores this entry; otherwise
|
||||
* POLLHUP/POLLERR are still reported for events=0 fds
|
||||
* (POSIX: always checked), causing a poll storm.
|
||||
*/
|
||||
fda->entries[fd].fd = -1;
|
||||
fda->entries[fd].revents = fda->entries[fd].events = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(fda->priv[fd].flags & fdarray_flag__nonfilterable))
|
||||
++nr;
|
||||
++nr;
|
||||
}
|
||||
|
||||
return nr;
|
||||
|
||||
@@ -115,12 +115,12 @@ PC_FILE := $(addprefix $(OUTPUT),$(PC_FILE))
|
||||
|
||||
TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags)
|
||||
|
||||
GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
|
||||
GLOBAL_SYM_COUNT = $(shell $(HOSTREADELF) -s --wide $(BPF_IN_SHARED) | \
|
||||
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
|
||||
sed 's/\[.*\]//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}' | \
|
||||
sort -u | wc -l)
|
||||
VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
|
||||
VERSIONED_SYM_COUNT = $(shell $(HOSTREADELF) --dyn-syms --wide $(OUTPUT)libbpf.so | \
|
||||
sed 's/\[.*\]//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}' | \
|
||||
grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
|
||||
@@ -183,12 +183,12 @@ check_abi: $(OUTPUT)libbpf.so $(VERSION_SCRIPT)
|
||||
"versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
|
||||
"Please make sure all LIBBPF_API symbols are" \
|
||||
"versioned in $(VERSION_SCRIPT)." >&2; \
|
||||
readelf -s --wide $(BPF_IN_SHARED) | \
|
||||
$(HOSTREADELF) -s --wide $(BPF_IN_SHARED) | \
|
||||
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
|
||||
sed 's/\[.*\]//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'| \
|
||||
sort -u > $(OUTPUT)libbpf_global_syms.tmp; \
|
||||
readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
|
||||
$(HOSTREADELF) --dyn-syms --wide $(OUTPUT)libbpf.so | \
|
||||
sed 's/\[.*\]//' | \
|
||||
awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}'| \
|
||||
grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \
|
||||
|
||||
@@ -9,10 +9,6 @@ srctree := $(patsubst %/,%,$(dir $(srctree)))
|
||||
#$(info Determined 'srctree' to be $(srctree))
|
||||
endif
|
||||
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
LD ?= $(CROSS_COMPILE)ld
|
||||
AR ?= $(CROSS_COMPILE)ar
|
||||
|
||||
RM = rm -f
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
@@ -9,10 +9,6 @@ srctree := $(patsubst %/,%,$(dir $(srctree)))
|
||||
#$(info Determined 'srctree' to be $(srctree))
|
||||
endif
|
||||
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
AR ?= $(CROSS_COMPILE)ar
|
||||
LD ?= $(CROSS_COMPILE)ld
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
INSTALL = install
|
||||
|
||||
@@ -2,15 +2,18 @@ BasedOnStyle: InheritParentConfig
|
||||
SortIncludes: true
|
||||
IncludeBlocks: Regroup
|
||||
IncludeCategories:
|
||||
# Python.h must be first
|
||||
- Regex: '^<Python\.h>'
|
||||
Priority: -1
|
||||
# Implicitly the corresponding header for the C file has Priority 0
|
||||
# C Standard Library Headers
|
||||
- Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
|
||||
- Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbit|stdbool|stdckdint|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
|
||||
Priority: 1
|
||||
# OS/System-Specific Headers (directories)
|
||||
- Regex: '^<(sys|linux|asm|arpa|net|netinet|x86_64|machine)/.*>'
|
||||
- Regex: '^<(arpa|asm|asm-generic|linux|machine|net|netinet|sys|uapi|x86_64)/.*>'
|
||||
Priority: 2
|
||||
# OS/System-Specific Headers (POSIX/System flat headers)
|
||||
- Regex: '^<(unistd|pthread|fcntl|dirent|dlfcn|poll|sched|semaphore|spawn|syslog|termios|pwd|grp|netdb|sysexits|err|paths|pty|utmp|resolv|ifaddrs|elf|libelf|gelf)\.h>'
|
||||
- Regex: '^<(aio|byteswap|dirent|dlfcn|elf|endian|err|execinfo|fcntl|features|fnmatch|ftw|gelf|getopt|grp|ifaddrs|libelf|libgen|malloc|memory|mntent|netdb|numa|numaif|paths|poll|pthread|pty|pwd|regex|resolv|sched|semaphore|spawn|strings|syscall|sysexits|syslog|termios|unistd|utmp|x86intrin)\.h>'
|
||||
Priority: 2
|
||||
# Third-Party Library Headers
|
||||
- Regex: '^<.*>'
|
||||
|
||||
@@ -365,6 +365,77 @@ TUI OUTPUT
|
||||
The TUI output provides interactive interface to navigate
|
||||
through cachelines list and to display offset details.
|
||||
|
||||
Pressing the 'TAB' key in the cacheline view switches to the function
|
||||
view. The function view shows a three-level hierarchy of the symbolized
|
||||
entries retained in the cacheline view, organized around functions rather
|
||||
than cachelines. Levels 1 and 2 normally show function names, while level 3
|
||||
shows cacheline addresses. Lower levels are indented beneath their parents.
|
||||
Verbose mode also includes code addresses in function rows, and code addresses
|
||||
remain available in the per-cacheline detail view ('d').
|
||||
|
||||
The function view requires `iaddr` in the cacheline coalescing fields. If
|
||||
`--coalesce` omits it, TAB reports that the view is unavailable rather than
|
||||
attributing already-coalesced samples to an arbitrary function.
|
||||
|
||||
Level 1: the read-side function, sorted by Cycles % (estimated load
|
||||
cycles: HITM, peer-snoop and other-load cycles)
|
||||
Level 2: the functions sampled writing the shared lines read by the
|
||||
level-1 function, sorted by store count. This can be the same
|
||||
function when it has both read and write samples
|
||||
Level 3: the specific cachelines shared by the reader/writer pair
|
||||
|
||||
The Cycles % value is the function's share of event-provided load
|
||||
latency/weight estimates from cacheline-detail entries retained in the
|
||||
current view. It can include non-HITM and non-peer loads coalesced into
|
||||
entries that pass the C2C filter, so it is not a pure contention-cycle
|
||||
percentage. The share is relative to the functions and entries retained
|
||||
for the current report and is not comparable across recordings or different
|
||||
`--coalesce` settings.
|
||||
|
||||
The store count on a level-1 row is the number of sampled stores by writers
|
||||
shown in the function view into the cachelines that function reads, including
|
||||
stores from the same function. It decomposes into the level-2 writer rows;
|
||||
each level-2 count in turn decomposes into that writer's stores on its level-3
|
||||
cachelines. A level-3 count is therefore not the cacheline's total store
|
||||
count. The level-1 value is not the number of stores made by the reader and
|
||||
is not additive across level-1 rows: two functions reading the same line each
|
||||
carry the stores into that line.
|
||||
|
||||
Each function aggregates all of its code addresses into a single entry,
|
||||
and a level-2 writer aggregates all of its shared cachelines, so a
|
||||
reader/writer pair is a single row with its total shown -- there is no
|
||||
need to sum a writer's traffic across cachelines by hand.
|
||||
|
||||
In the function view the 'd' key opens the detail view of the selected
|
||||
level-3 cacheline, 'e'/'+' expands or collapses the current entry, and 'TAB',
|
||||
'ESC', 'q' or Ctrl-C returns to the cacheline view.
|
||||
|
||||
For example, with the first two read-side functions collapsed and
|
||||
dequeue_pushable_task expanded to show the functions writing the lines it
|
||||
reads -- two of which are further expanded to their individual cachelines:
|
||||
|
||||
Shared Data Functions Table (19 entries, sorted on Cycles %)
|
||||
Cycles Store
|
||||
% count Function / Contending function / Cacheline
|
||||
----------------------------------------------------------------------
|
||||
+ 35.67% 876 + [k] cpupri_set
|
||||
+ 24.31% 424 + [k] pull_rt_task
|
||||
- 16.53% 555 - [k] dequeue_pushable_task
|
||||
145 - [k] pull_rt_task
|
||||
145 0xff2d0082809da080
|
||||
139 - [k] enqueue_pushable_task
|
||||
70 0xff2d00a2071f9640
|
||||
69 0xff2d0082809da000
|
||||
|
||||
Here dequeue_pushable_task pays 16.53% of the estimated read-side load-cycle
|
||||
cost. Its store count decomposes into its level-2 writers, and each writer's
|
||||
count decomposes into its level-3 cachelines: pull_rt_task's 145 stores fall
|
||||
on a single line, while enqueue_pushable_task's 139 stores split across two
|
||||
lines (70 and 69). A writer can be the same function as the reader when it
|
||||
has both read and write samples; after cacheline coalescing and
|
||||
function-level grouping, the view cannot distinguish same-thread accesses
|
||||
from different threads running the same function.
|
||||
|
||||
For details please refer to the help window by pressing '?' key.
|
||||
|
||||
CREDITS
|
||||
|
||||
@@ -40,6 +40,12 @@ There are several variants of 'perf sched':
|
||||
Tasks with the same command name are merged and the merge count is
|
||||
given within (), However if -p option is used, pid is mentioned.
|
||||
|
||||
If -H or --histogram option is passed, a CPU wait latency distribution
|
||||
histogram is displayed illustrating how long tasks waited for CPU
|
||||
runtime across latency buckets between snapshots. The --time
|
||||
option (start,stop) limits analysis to a specific snapshot time interval.
|
||||
The --hist-mode option (log or linear) configures the latency bucketing scheme.
|
||||
|
||||
'perf sched script' to see a detailed trace of the workload that
|
||||
was recorded (aliased to 'perf script' for now).
|
||||
|
||||
|
||||
@@ -162,6 +162,9 @@ null run - Don't start any counters.
|
||||
This can be useful to measure just elapsed wall-clock time - or to assess the
|
||||
raw overhead of perf stat itself, without running any counters.
|
||||
|
||||
--hide-zero-events::
|
||||
Do not show events with a zero count.
|
||||
|
||||
-v::
|
||||
--verbose::
|
||||
be more verbose (show counter open errors, etc)
|
||||
|
||||
@@ -57,7 +57,8 @@ OPTIONS
|
||||
--workload=::
|
||||
Run a built-in workload, to list them use '--list-workloads', current
|
||||
ones include: noploop, thloop, leafloop, sqrtloop, brstack, datasym,
|
||||
context_switch_loop, deterministic, named_threads and landlock.
|
||||
context_switch_loop, deterministic, named_threads, landlock and
|
||||
callchain.
|
||||
|
||||
Used with the shell script regression tests.
|
||||
|
||||
@@ -69,7 +70,8 @@ OPTIONS
|
||||
'named_threads' accepts the number of threads and the number of loops to
|
||||
do in each thread.
|
||||
|
||||
The datasym, landlock and deterministic workloads don't accept any.
|
||||
The datasym, landlock, deterministic and callchain workloads don't accept
|
||||
any.
|
||||
|
||||
--list-workloads::
|
||||
List the available workloads to use with -w/--workload.
|
||||
|
||||
@@ -247,6 +247,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs.
|
||||
pretty-printing serves as a fallback to hand-crafted pretty printers, as the latter can
|
||||
better pretty-print integer flags and struct pointers.
|
||||
|
||||
--bitmask-list::
|
||||
Show bitmasks as a human-readable, condensed list (e.g. "0,2-5,7")
|
||||
instead of the default hexadecimal representation.
|
||||
|
||||
--bpf-summary::
|
||||
Collect system call statistics in BPF. This is only for live mode and
|
||||
works well with -s/--summary option where no argument information is
|
||||
|
||||
@@ -87,7 +87,7 @@ if (slots_fd < 0)
|
||||
|
||||
/* Memory mapping the fd permits _rdpmc calls from userspace */
|
||||
void *slots_p = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, slots_fd, 0);
|
||||
if (!slot_p)
|
||||
if (slots_p == MAP_FAILED)
|
||||
.... error ...
|
||||
|
||||
/*
|
||||
@@ -107,7 +107,7 @@ if (metrics_fd < 0)
|
||||
|
||||
/* Memory mapping the fd permits _rdpmc calls from userspace */
|
||||
void *metrics_p = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, metrics_fd, 0);
|
||||
if (!metrics_p)
|
||||
if (metrics_p == MAP_FAILED)
|
||||
... error ...
|
||||
|
||||
Note: the file descriptors returned by the perf_event_open calls must be memory
|
||||
|
||||
@@ -174,15 +174,10 @@ endef
|
||||
|
||||
LD += $(EXTRA_LDFLAGS)
|
||||
|
||||
HOSTCC ?= gcc
|
||||
HOSTLD ?= ld
|
||||
HOSTAR ?= ar
|
||||
CLANG ?= clang
|
||||
|
||||
# Some distros provide the command $(CROSS_COMPILE)pkg-config for
|
||||
# searching packges installed with Multiarch. Use it for cross
|
||||
# compilation if it is existed.
|
||||
ifneq (, $(shell which $(CROSS_COMPILE)pkg-config))
|
||||
ifneq (, $(shell command -v $(CROSS_COMPILE)pkg-config 2>/dev/null))
|
||||
PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config
|
||||
else
|
||||
PKG_CONFIG ?= pkg-config
|
||||
@@ -213,15 +208,18 @@ FIND = find
|
||||
INSTALL = install
|
||||
FLEX ?= flex
|
||||
BISON ?= bison
|
||||
STRIP = strip
|
||||
AWK = awk
|
||||
READELF ?= readelf
|
||||
|
||||
# include Makefile.config by default and rule out
|
||||
# non-config cases
|
||||
config := 1
|
||||
|
||||
NON_CONFIG_TARGETS := clean python-clean TAGS tags cscope help
|
||||
# install-build-deps runs the install-build-deps.sh script, which
|
||||
# derives the package list from the feature test sources in
|
||||
# tools/build/feature/, so it needs neither the fixdep build nor a
|
||||
# config/feature detection pass: in a fresh container without gcc or
|
||||
# pkg-config those would fail before the script could install them.
|
||||
NON_CONFIG_TARGETS := clean python-clean TAGS tags cscope help install-build-deps
|
||||
|
||||
ifdef MAKECMDGOALS
|
||||
ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
|
||||
@@ -517,12 +515,15 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
|
||||
# Create python binding output directory if not already present
|
||||
$(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
|
||||
|
||||
$(OUTPUT)python/perf$(PYTHON_EXTENSION_SUFFIX): util/python.c util/setup.py $(PERFLIBS_PY)
|
||||
$(OUTPUT)python/perf$(PYTHON_EXTENSION_SUFFIX): util/python.c util/setup.py python/perf.pyi $(PERFLIBS_PY)
|
||||
$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
|
||||
CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBS_PY)' \
|
||||
$(PYTHON_WORD) util/setup.py \
|
||||
$(python_setup_quiet) build_ext; \
|
||||
cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
|
||||
cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/; \
|
||||
if [ "$(abspath python/perf.pyi)" != "$(abspath $(OUTPUT)python/perf.pyi)" ]; then \
|
||||
cp python/perf.pyi $(OUTPUT)python/; \
|
||||
fi
|
||||
|
||||
python_perf_target:
|
||||
@echo "Target is: $(OUTPUT)python/perf$(PYTHON_EXTENSION_SUFFIX)"
|
||||
@@ -677,7 +678,7 @@ $(OUTPUT)dlfilters/%.o: dlfilters/%.c include/perf/perf_dlfilter.h
|
||||
.SECONDARY: $(DLFILTERS:.so=.o)
|
||||
|
||||
$(OUTPUT)dlfilters/%.so: $(OUTPUT)dlfilters/%.o
|
||||
$(QUIET_LINK)$(CC) $(EXTRA_CFLAGS) -shared -o $@ $<
|
||||
$(QUIET_LINK)$(CC) $(filter-out -static,$(LDFLAGS)) $(EXTRA_CFLAGS) -shared -o $@ $<
|
||||
|
||||
ifndef NO_JVMTI
|
||||
LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o
|
||||
@@ -752,6 +753,7 @@ help:
|
||||
@echo ' HINT: use "prefix" or "DESTDIR" to install to a particular'
|
||||
@echo ' path like "make prefix=/usr/local install install-doc"'
|
||||
@echo ' install - install compiled binaries'
|
||||
@echo ' install-build-deps - install the development packages needed to build'
|
||||
@echo ' install-doc - install *all* documentation'
|
||||
@echo ' install-man - install manpage documentation'
|
||||
@echo ' install-html - install html documentation'
|
||||
@@ -896,6 +898,15 @@ install-bin: install-tools install-tests
|
||||
|
||||
install: install-bin try-install-man
|
||||
|
||||
# Install the development packages needed to build perf, derived from the
|
||||
# feature tests in tools/build/feature/. Currently supported: the Fedora
|
||||
# (dnf), Ubuntu (apt) and Debian (apt, reusing the Ubuntu mapping)
|
||||
# package mappings, see the script.
|
||||
# INSTALL_BUILD_DEPS_ARGS, when set, is passed to the script, so
|
||||
# extra options like --list, --dry-run or --distro can be given from make.
|
||||
install-build-deps:
|
||||
$(Q)$(SHELL) $(srctree)/tools/perf/scripts/install-build-deps.sh $(INSTALL_BUILD_DEPS_ARGS)
|
||||
|
||||
install-python_ext:
|
||||
$(PYTHON_WORD) util/setup.py $(python_setup_quiet) install --root='/$(DESTDIR_SQ)'
|
||||
|
||||
@@ -964,7 +975,7 @@ endif
|
||||
|
||||
FORCE:
|
||||
|
||||
.PHONY: all install clean config-clean strip install-gtk
|
||||
.PHONY: all install install-build-deps clean config-clean strip install-gtk
|
||||
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
|
||||
.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare bpf-skel-prepare
|
||||
.PHONY: python_perf_target
|
||||
|
||||
@@ -201,7 +201,7 @@ static int cs_etm_validate_config(struct perf_pmu *cs_etm_pmu,
|
||||
{
|
||||
unsigned int idx;
|
||||
int err = 0;
|
||||
struct perf_cpu_map *event_cpus = evsel->evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *event_cpus = evlist__core(evsel->evlist)->user_requested_cpus;
|
||||
struct perf_cpu_map *intersect_cpus;
|
||||
struct perf_cpu cpu;
|
||||
|
||||
@@ -325,7 +325,7 @@ static int cs_etm_recording_options(struct auxtrace_record *itr,
|
||||
container_of(itr, struct cs_etm_recording, itr);
|
||||
struct perf_pmu *cs_etm_pmu = ptr->cs_etm_pmu;
|
||||
struct evsel *evsel, *cs_etm_evsel = NULL;
|
||||
struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
bool privileged = perf_event_paranoid_check(-1);
|
||||
int err = 0;
|
||||
|
||||
@@ -551,7 +551,7 @@ cs_etm_info_priv_size(struct auxtrace_record *itr,
|
||||
{
|
||||
unsigned int idx;
|
||||
int etmv3 = 0, etmv4 = 0, ete = 0;
|
||||
struct perf_cpu_map *event_cpus = evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *event_cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
struct perf_cpu_map *intersect_cpus;
|
||||
struct perf_cpu cpu;
|
||||
struct perf_pmu *cs_etm_pmu = cs_etm_get_pmu(itr);
|
||||
@@ -790,7 +790,7 @@ static int cs_etm_info_fill(struct auxtrace_record *itr,
|
||||
u32 offset;
|
||||
u64 nr_cpu, type;
|
||||
struct perf_cpu_map *cpu_map;
|
||||
struct perf_cpu_map *event_cpus = session->evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *event_cpus = evlist__core(session->evlist)->user_requested_cpus;
|
||||
struct perf_cpu_map *online_cpus = perf_cpu_map__new_online_cpus();
|
||||
struct cs_etm_recording *ptr =
|
||||
container_of(itr, struct cs_etm_recording, itr);
|
||||
@@ -800,7 +800,7 @@ static int cs_etm_info_fill(struct auxtrace_record *itr,
|
||||
if (priv_size != cs_etm_info_priv_size(itr, session->evlist))
|
||||
return -EINVAL;
|
||||
|
||||
if (!session->evlist->core.nr_mmaps)
|
||||
if (!evlist__core(session->evlist)->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
/* If the cpu_map has the "any" CPU all online CPUs are involved */
|
||||
|
||||
@@ -60,7 +60,7 @@ static bool arm_spe_is_set_freq(struct evsel *evsel)
|
||||
*/
|
||||
static struct perf_cpu_map *arm_spe_find_cpus(struct evlist *evlist)
|
||||
{
|
||||
struct perf_cpu_map *event_cpus = evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *event_cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
struct perf_cpu_map *online_cpus = perf_cpu_map__new_online_cpus();
|
||||
struct perf_cpu_map *intersect_cpus;
|
||||
|
||||
@@ -157,7 +157,7 @@ static int arm_spe_info_fill(struct auxtrace_record *itr,
|
||||
if (priv_size != arm_spe_info_priv_size(itr, session->evlist))
|
||||
return -EINVAL;
|
||||
|
||||
if (!session->evlist->core.nr_mmaps)
|
||||
if (!evlist__core(session->evlist)->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
cpu_map = arm_spe_find_cpus(session->evlist);
|
||||
@@ -363,7 +363,7 @@ static int arm_spe_setup_tracking_event(struct evlist *evlist,
|
||||
{
|
||||
int err;
|
||||
struct evsel *tracking_evsel;
|
||||
struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
|
||||
/* Add dummy event to keep tracking */
|
||||
err = parse_event(evlist, "dummy:u");
|
||||
@@ -396,7 +396,7 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
|
||||
struct arm_spe_recording *sper =
|
||||
container_of(itr, struct arm_spe_recording, itr);
|
||||
struct evsel *evsel, *tmp;
|
||||
struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
bool discard = false;
|
||||
int err;
|
||||
u64 discard_bit;
|
||||
|
||||
@@ -53,7 +53,7 @@ static int hisi_ptt_info_fill(struct auxtrace_record *itr,
|
||||
if (priv_size != HISI_PTT_AUXTRACE_PRIV_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
if (!session->evlist->core.nr_mmaps)
|
||||
if (!evlist__core(session->evlist)->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
auxtrace_info->type = PERF_AUXTRACE_HISI_PTT;
|
||||
|
||||
@@ -46,7 +46,6 @@ static int dummy_workload_1(unsigned long count)
|
||||
{
|
||||
int (*func)(void);
|
||||
int ret = 0;
|
||||
char *p;
|
||||
char insn1[] = {
|
||||
0xb8, 0x01, 0x00, 0x00, 0x00, /* mov 1,%eax */
|
||||
0xc3, /* ret */
|
||||
@@ -59,18 +58,11 @@ static int dummy_workload_1(unsigned long count)
|
||||
0xcc, /* int 3 */
|
||||
};
|
||||
|
||||
p = calloc(2, page_size);
|
||||
if (!p) {
|
||||
printf("malloc() failed. %m");
|
||||
return 1;
|
||||
}
|
||||
|
||||
func = (void *)((unsigned long)(p + page_size - 1) & ~(page_size - 1));
|
||||
|
||||
ret = mprotect(func, page_size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
if (ret) {
|
||||
printf("mprotect() failed. %m");
|
||||
goto out;
|
||||
func = mmap(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (func == MAP_FAILED) {
|
||||
pr_debug("mmap() failed. %m\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (count < 100000)
|
||||
@@ -93,7 +85,7 @@ static int dummy_workload_1(unsigned long count)
|
||||
}
|
||||
|
||||
out:
|
||||
free(p);
|
||||
munmap(func, page_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong hybrid type", test_hybrid_type(evsel, PERF_TYPE_RAW));
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
|
||||
@@ -38,7 +38,7 @@ static int test__hybrid_hw_group_event(struct evlist *evlist)
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong hybrid type", test_hybrid_type(evsel, PERF_TYPE_RAW));
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
|
||||
@@ -57,7 +57,7 @@ static int test__hybrid_sw_hw_group_event(struct evlist *evlist)
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
|
||||
|
||||
@@ -74,7 +74,7 @@ static int test__hybrid_hw_sw_group_event(struct evlist *evlist)
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong hybrid type", test_hybrid_type(evsel, PERF_TYPE_RAW));
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
|
||||
@@ -91,7 +91,7 @@ static int test__hybrid_group_modifier1(struct evlist *evlist)
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong hybrid type", test_hybrid_type(evsel, PERF_TYPE_RAW));
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
|
||||
@@ -113,7 +113,7 @@ static int test__hybrid_raw1(struct evlist *evlist)
|
||||
{
|
||||
struct perf_evsel *evsel;
|
||||
|
||||
perf_evlist__for_each_evsel(&evlist->core, evsel) {
|
||||
perf_evlist__for_each_evsel(evlist__core(evlist), evsel) {
|
||||
struct perf_pmu *pmu = perf_pmus__find_by_type(evsel->attr.type);
|
||||
|
||||
TEST_ASSERT_VAL("missing pmu", pmu);
|
||||
@@ -127,7 +127,7 @@ static int test__hybrid_raw2(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, 0x1a));
|
||||
return TEST_OK;
|
||||
@@ -137,7 +137,7 @@ static int test__hybrid_cache_event(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong config", 0x2 == (evsel->core.attr.config & 0xffffffff));
|
||||
return TEST_OK;
|
||||
@@ -148,7 +148,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
|
||||
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong config", 10 == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong config1", 1 == evsel->core.attr.config1);
|
||||
@@ -168,7 +168,7 @@ static int test__hybrid_hw_group_event_2(struct evlist *evlist)
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
|
||||
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist__nr_entries(evlist));
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong hybrid type", test_hybrid_type(evsel, PERF_TYPE_RAW));
|
||||
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
|
||||
@@ -268,7 +268,7 @@ static int test_event(const struct evlist_test *e)
|
||||
ret = e->check(evlist);
|
||||
}
|
||||
parse_events_error__exit(&err);
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ static int event_cb(void *state, struct pmu_event_info *info)
|
||||
*ret = TEST_FAIL;
|
||||
}
|
||||
}
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ static int test_sort(const char *str, int expected_slots_group_size,
|
||||
CHECK_COND(slots_seen, "slots seen");
|
||||
ret = TEST_OK;
|
||||
out_err:
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
parse_events_error__exit(&err);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
|
||||
int *err)
|
||||
{
|
||||
char buffer[64];
|
||||
struct perf_cpu cpu = perf_cpu_map__min(evlist->core.all_cpus);
|
||||
struct perf_cpu cpu = perf_cpu_map__min(evlist__core(evlist)->all_cpus);
|
||||
int ret;
|
||||
|
||||
*err = 0;
|
||||
|
||||
@@ -79,10 +79,10 @@ static int intel_bts_info_fill(struct auxtrace_record *itr,
|
||||
if (priv_size != INTEL_BTS_AUXTRACE_PRIV_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
if (!session->evlist->core.nr_mmaps)
|
||||
if (!evlist__core(session->evlist)->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
pc = session->evlist->mmap[0].core.base;
|
||||
pc = evlist__mmap(session->evlist)[0].core.base;
|
||||
if (pc) {
|
||||
err = perf_read_tsc_conversion(pc, &tc);
|
||||
if (err) {
|
||||
@@ -114,7 +114,7 @@ static int intel_bts_recording_options(struct auxtrace_record *itr,
|
||||
container_of(itr, struct intel_bts_recording, itr);
|
||||
struct perf_pmu *intel_bts_pmu = btsr->intel_bts_pmu;
|
||||
struct evsel *evsel, *intel_bts_evsel = NULL;
|
||||
const struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
|
||||
const struct perf_cpu_map *cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
bool privileged = perf_event_paranoid_check(-1);
|
||||
|
||||
if (opts->auxtrace_sample_mode) {
|
||||
|
||||
@@ -360,10 +360,10 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
|
||||
filter = intel_pt_find_filter(session->evlist, ptr->intel_pt_pmu);
|
||||
filter_str_len = filter ? strlen(filter) : 0;
|
||||
|
||||
if (!session->evlist->core.nr_mmaps)
|
||||
if (!evlist__core(session->evlist)->nr_mmaps)
|
||||
return -EINVAL;
|
||||
|
||||
pc = session->evlist->mmap[0].core.base;
|
||||
pc = evlist__mmap(session->evlist)[0].core.base;
|
||||
if (pc) {
|
||||
err = perf_read_tsc_conversion(pc, &tc);
|
||||
if (err) {
|
||||
@@ -376,7 +376,8 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
|
||||
ui__warning("Intel Processor Trace: TSC not available\n");
|
||||
}
|
||||
|
||||
per_cpu_mmaps = !perf_cpu_map__is_any_cpu_or_is_empty(session->evlist->core.user_requested_cpus);
|
||||
per_cpu_mmaps = !perf_cpu_map__is_any_cpu_or_is_empty(
|
||||
evlist__core(session->evlist)->user_requested_cpus);
|
||||
|
||||
auxtrace_info->type = PERF_AUXTRACE_INTEL_PT;
|
||||
auxtrace_info->priv[INTEL_PT_PMU_TYPE] = intel_pt_pmu->type;
|
||||
@@ -621,7 +622,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
|
||||
struct perf_pmu *intel_pt_pmu = ptr->intel_pt_pmu;
|
||||
bool have_timing_info, need_immediate = false;
|
||||
struct evsel *evsel, *intel_pt_evsel = NULL;
|
||||
const struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
|
||||
const struct perf_cpu_map *cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
bool privileged = perf_event_paranoid_check(-1);
|
||||
u64 tsc_bit;
|
||||
int err;
|
||||
|
||||
@@ -332,13 +332,15 @@ static int iostat_event_group(struct evlist *evl,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int iostat_prepare(struct evlist *evlist, struct perf_stat_config *config)
|
||||
int iostat_prepare(struct evlist **evlist_ptr, struct perf_stat_config *config)
|
||||
{
|
||||
if (evlist->core.nr_entries > 0) {
|
||||
struct evlist *evlist = *evlist_ptr;
|
||||
|
||||
if (evlist__nr_entries(evlist) > 0) {
|
||||
pr_warning("The -e and -M options are not supported."
|
||||
"All chosen events/metrics will be dropped\n");
|
||||
evlist__delete(evlist);
|
||||
evlist = evlist__new();
|
||||
evlist__put(evlist);
|
||||
*evlist_ptr = evlist = evlist__new();
|
||||
if (!evlist)
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -400,7 +402,7 @@ void iostat_prefix(struct evlist *evlist,
|
||||
struct perf_stat_config *config,
|
||||
char *prefix, struct timespec *ts)
|
||||
{
|
||||
struct iio_root_port *rp = evlist->selected->priv;
|
||||
struct iio_root_port *rp = evlist__selected(evlist)->priv;
|
||||
|
||||
if (rp) {
|
||||
/*
|
||||
@@ -463,7 +465,7 @@ void iostat_print_counters(struct evlist *evlist,
|
||||
iostat_prefix(evlist, config, prefix, ts);
|
||||
fprintf(config->output, "%s", prefix);
|
||||
evlist__for_each_entry(evlist, counter) {
|
||||
perf_device = evlist->selected->priv;
|
||||
perf_device = evlist__selected(evlist)->priv;
|
||||
if (perf_device && perf_device != counter->priv) {
|
||||
evlist__set_selected(evlist, counter);
|
||||
iostat_prefix(evlist, config, prefix, ts);
|
||||
|
||||
@@ -76,7 +76,7 @@ static struct evlist *bench__create_evlist(char *evstr, const char *uid_str)
|
||||
parse_events_error__exit(&err);
|
||||
pr_err("Run 'perf list' for a list of valid events\n");
|
||||
ret = 1;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
parse_events_error__exit(&err);
|
||||
if (uid_str) {
|
||||
@@ -85,24 +85,24 @@ static struct evlist *bench__create_evlist(char *evstr, const char *uid_str)
|
||||
if (uid == UINT_MAX) {
|
||||
pr_err("Invalid User: %s", uid_str);
|
||||
ret = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
ret = parse_uid_filter(evlist, uid);
|
||||
if (ret)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
ret = evlist__create_maps(evlist, &opts.target);
|
||||
if (ret < 0) {
|
||||
pr_err("Not enough memory to create thread/cpu maps\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
evlist__config(evlist, &opts, NULL);
|
||||
|
||||
return evlist;
|
||||
|
||||
out_delete_evlist:
|
||||
evlist__delete(evlist);
|
||||
out_put_evlist:
|
||||
evlist__put(evlist);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ static int bench__do_evlist_open_close(struct evlist *evlist)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = evlist__mmap(evlist, opts.mmap_pages);
|
||||
err = evlist__do_mmap(evlist, opts.mmap_pages);
|
||||
if (err < 0) {
|
||||
pr_err("evlist__mmap: %s\n", str_error_r(errno, sbuf, sizeof(sbuf)));
|
||||
return err;
|
||||
@@ -124,7 +124,7 @@ static int bench__do_evlist_open_close(struct evlist *evlist)
|
||||
|
||||
evlist__enable(evlist);
|
||||
evlist__disable(evlist);
|
||||
evlist__munmap(evlist);
|
||||
evlist__do_munmap(evlist);
|
||||
evlist__close(evlist);
|
||||
|
||||
return 0;
|
||||
@@ -145,13 +145,14 @@ static int bench_evlist_open_close__run(char *evstr, const char *uid_str)
|
||||
|
||||
init_stats(&time_stats);
|
||||
|
||||
printf(" Number of cpus:\t%d\n", perf_cpu_map__nr(evlist->core.user_requested_cpus));
|
||||
printf(" Number of threads:\t%d\n", evlist->core.threads->nr);
|
||||
printf(" Number of cpus:\t%d\n",
|
||||
perf_cpu_map__nr(evlist__core(evlist)->user_requested_cpus));
|
||||
printf(" Number of threads:\t%d\n", evlist__core(evlist)->threads->nr);
|
||||
printf(" Number of events:\t%d (%d fds)\n",
|
||||
evlist->core.nr_entries, evlist__count_evsel_fds(evlist));
|
||||
evlist__nr_entries(evlist), evlist__count_evsel_fds(evlist));
|
||||
printf(" Number of iterations:\t%d\n", iterations);
|
||||
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
|
||||
for (i = 0; i < iterations; i++) {
|
||||
pr_debug("Started iteration %d\n", i);
|
||||
@@ -162,7 +163,7 @@ static int bench_evlist_open_close__run(char *evstr, const char *uid_str)
|
||||
gettimeofday(&start, NULL);
|
||||
err = bench__do_evlist_open_close(evlist);
|
||||
if (err) {
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -171,7 +172,7 @@ static int bench_evlist_open_close__run(char *evstr, const char *uid_str)
|
||||
runtime_us = timeval2usec(&diff);
|
||||
update_stats(&time_stats, runtime_us);
|
||||
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
pr_debug("Iteration %d took:\t%" PRIu64 "us\n", i, runtime_us);
|
||||
}
|
||||
|
||||
|
||||
@@ -562,7 +562,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
|
||||
goto out;
|
||||
|
||||
if ((use_browser == 1 || ann->use_stdio2) && ann->has_br_stack)
|
||||
if (session->evlist->nr_br_cntr > 0)
|
||||
if (evlist__nr_br_cntr(session->evlist) > 0)
|
||||
annotate_opts.show_br_cntr = true;
|
||||
|
||||
if (dump_trace) {
|
||||
@@ -928,8 +928,11 @@ int cmd_annotate(int argc, const char **argv)
|
||||
* branch counters, if the corresponding branch info is available
|
||||
* in the perf data in the TUI mode.
|
||||
*/
|
||||
if ((use_browser == 1 || annotate.use_stdio2) && annotate.has_br_stack)
|
||||
if ((use_browser == 1 || annotate.use_stdio2) && annotate.has_br_stack) {
|
||||
sort__mode = SORT_MODE__BRANCH;
|
||||
if (evlist__nr_br_cntr(annotate.session->evlist) > 0)
|
||||
annotate_opts.show_br_cntr = true;
|
||||
}
|
||||
|
||||
if (setup_sorting(/*evlist=*/NULL, perf_session__env(annotate.session)) < 0)
|
||||
usage_with_options(annotate_usage, options);
|
||||
|
||||
@@ -12,11 +12,14 @@
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <asm/bug.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/zalloc.h>
|
||||
#include <sys/param.h>
|
||||
@@ -49,46 +52,10 @@
|
||||
#include "ui/progress.h"
|
||||
#include "ui/ui.h"
|
||||
#include "util/annotate.h"
|
||||
#include "util/c2c.h"
|
||||
#include "util/symbol.h"
|
||||
#include "util/util.h"
|
||||
|
||||
struct c2c_hists {
|
||||
struct hists hists;
|
||||
struct perf_hpp_list list;
|
||||
struct c2c_stats stats;
|
||||
};
|
||||
|
||||
struct compute_stats {
|
||||
struct stats lcl_hitm;
|
||||
struct stats rmt_hitm;
|
||||
struct stats lcl_peer;
|
||||
struct stats rmt_peer;
|
||||
struct stats load;
|
||||
};
|
||||
|
||||
struct c2c_hist_entry {
|
||||
struct c2c_hists *hists;
|
||||
struct evsel *evsel;
|
||||
struct c2c_stats stats;
|
||||
unsigned long *cpuset;
|
||||
unsigned long *nodeset;
|
||||
struct c2c_stats *node_stats;
|
||||
unsigned int cacheline_idx;
|
||||
|
||||
struct compute_stats cstats;
|
||||
|
||||
unsigned long paddr;
|
||||
unsigned long paddr_cnt;
|
||||
bool paddr_zero;
|
||||
char *nodestr;
|
||||
|
||||
/*
|
||||
* must be at the end,
|
||||
* because of its callchain dynamic entry
|
||||
*/
|
||||
struct hist_entry he;
|
||||
};
|
||||
|
||||
static char const *coalesce_default = "iaddr";
|
||||
|
||||
struct perf_c2c {
|
||||
@@ -226,7 +193,6 @@ he__get_c2c_hists(struct hist_entry *he,
|
||||
|
||||
ret = c2c_hists__init(hists, sort, nr_header_lines, env);
|
||||
if (ret) {
|
||||
perf_hpp__reset_output_field(&hists->list);
|
||||
c2c_he->hists = NULL;
|
||||
free(hists);
|
||||
return NULL;
|
||||
@@ -458,36 +424,6 @@ static const char * const __usage_report[] = {
|
||||
|
||||
static const char * const *report_c2c_usage = __usage_report;
|
||||
|
||||
#define C2C_HEADER_MAX 2
|
||||
|
||||
struct c2c_header {
|
||||
struct {
|
||||
const char *text;
|
||||
int span;
|
||||
} line[C2C_HEADER_MAX];
|
||||
};
|
||||
|
||||
struct c2c_dimension {
|
||||
struct c2c_header header;
|
||||
const char *name;
|
||||
int width;
|
||||
struct sort_entry *se;
|
||||
|
||||
int64_t (*cmp)(struct perf_hpp_fmt *fmt,
|
||||
struct hist_entry *, struct hist_entry *);
|
||||
int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hist_entry *he);
|
||||
int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hist_entry *he);
|
||||
};
|
||||
|
||||
struct c2c_fmt {
|
||||
struct perf_hpp_fmt fmt;
|
||||
struct c2c_dimension *dim;
|
||||
};
|
||||
|
||||
#define SYMBOL_WIDTH 30
|
||||
|
||||
static struct c2c_dimension dim_symbol;
|
||||
static struct c2c_dimension dim_srcline;
|
||||
|
||||
@@ -1389,23 +1325,6 @@ cl_idx_empty_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
return scnprintf(hpp->buf, hpp->size, "%*s", width, "");
|
||||
}
|
||||
|
||||
#define HEADER_LOW(__h) \
|
||||
{ \
|
||||
.line[1] = { \
|
||||
.text = __h, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define HEADER_BOTH(__h0, __h1) \
|
||||
{ \
|
||||
.line[0] = { \
|
||||
.text = __h0, \
|
||||
}, \
|
||||
.line[1] = { \
|
||||
.text = __h1, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define HEADER_SPAN(__h0, __h1, __s) \
|
||||
{ \
|
||||
.line[0] = { \
|
||||
@@ -1928,22 +1847,6 @@ static struct c2c_dimension *dimensions[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
static void fmt_free(struct perf_hpp_fmt *fmt)
|
||||
{
|
||||
struct c2c_fmt *c2c_fmt;
|
||||
|
||||
c2c_fmt = container_of(fmt, struct c2c_fmt, fmt);
|
||||
free(c2c_fmt);
|
||||
}
|
||||
|
||||
static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
|
||||
{
|
||||
struct c2c_fmt *c2c_a = container_of(a, struct c2c_fmt, fmt);
|
||||
struct c2c_fmt *c2c_b = container_of(b, struct c2c_fmt, fmt);
|
||||
|
||||
return c2c_a->dim == c2c_b->dim;
|
||||
}
|
||||
|
||||
static struct c2c_dimension *get_dimension(const char *name)
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -2021,8 +1924,8 @@ static struct c2c_fmt *get_format(const char *name)
|
||||
fmt->header = c2c_header;
|
||||
fmt->width = c2c_width;
|
||||
fmt->collapse = dim->se ? c2c_se_collapse : dim->cmp;
|
||||
fmt->equal = fmt_equal;
|
||||
fmt->free = fmt_free;
|
||||
fmt->equal = c2c_fmt_equal;
|
||||
fmt->free = c2c_fmt_free;
|
||||
|
||||
return c2c_fmt;
|
||||
}
|
||||
@@ -2063,26 +1966,38 @@ static int c2c_hists__init_sort(struct perf_hpp_list *hpp_list, char *name, stru
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define PARSE_LIST(_list, _fn) \
|
||||
do { \
|
||||
char *tmp, *tok; \
|
||||
ret = 0; \
|
||||
\
|
||||
if (!_list) \
|
||||
break; \
|
||||
\
|
||||
for (tok = strtok_r((char *)_list, ", ", &tmp); \
|
||||
tok; tok = strtok_r(NULL, ", ", &tmp)) { \
|
||||
ret = _fn(hpp_list, tok, env); \
|
||||
if (ret == -EINVAL) { \
|
||||
pr_err("Invalid --fields key: `%s'", tok); \
|
||||
break; \
|
||||
} else if (ret == -ESRCH) { \
|
||||
pr_err("Unknown --fields key: `%s'", tok); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
static int __hpp_list__parse(struct perf_hpp_list *hpp_list, char *_list, struct perf_env *env,
|
||||
int (*_fn)(struct perf_hpp_list *hpp_list, char *name, struct perf_env *env))
|
||||
{
|
||||
char *tmp, *tok;
|
||||
int ret = 0;
|
||||
|
||||
if (!_list)
|
||||
return 0;
|
||||
|
||||
for (tok = strtok_r(_list, ", ", &tmp); tok; tok = strtok_r(NULL, ", ", &tmp)) {
|
||||
ret = _fn(hpp_list, tok, env);
|
||||
switch (ret) {
|
||||
case 0:
|
||||
continue;
|
||||
case -EINVAL:
|
||||
pr_err("Invalid --fields key: `%s'", tok);
|
||||
goto out;
|
||||
case -ESRCH:
|
||||
pr_err("Unknown --fields key: `%s'", tok);
|
||||
goto out;
|
||||
default: {
|
||||
char buf[STRERR_BUFSIZE];
|
||||
|
||||
pr_err("%s for --fields key: `%s'",
|
||||
str_error_r(-ret, buf, sizeof(buf)), tok);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hpp_list__parse(struct perf_hpp_list *hpp_list,
|
||||
const char *output_,
|
||||
@@ -2093,8 +2008,18 @@ static int hpp_list__parse(struct perf_hpp_list *hpp_list,
|
||||
char *sort = sort_ ? strdup(sort_) : NULL;
|
||||
int ret;
|
||||
|
||||
PARSE_LIST(output, c2c_hists__init_output);
|
||||
PARSE_LIST(sort, c2c_hists__init_sort);
|
||||
/* strdup() returns NULL on OOM, don't silently treat as empty */
|
||||
if ((output_ && !output) || (sort_ && !sort)) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = __hpp_list__parse(hpp_list, output, env, c2c_hists__init_output);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = __hpp_list__parse(hpp_list, sort, env, c2c_hists__init_sort);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* copy sort keys to output fields */
|
||||
perf_hpp__setup_output_field(hpp_list);
|
||||
@@ -2111,6 +2036,7 @@ static int hpp_list__parse(struct perf_hpp_list *hpp_list,
|
||||
perf_hpp__append_sort_keys(&hists->list);
|
||||
#endif
|
||||
|
||||
out:
|
||||
free(output);
|
||||
free(sort);
|
||||
return ret;
|
||||
@@ -2121,6 +2047,8 @@ static int c2c_hists__init(struct c2c_hists *hists,
|
||||
int nr_header_lines,
|
||||
struct perf_env *env)
|
||||
{
|
||||
int ret;
|
||||
|
||||
__hists__init(&hists->hists, &hists->list);
|
||||
|
||||
/*
|
||||
@@ -2133,7 +2061,13 @@ static int c2c_hists__init(struct c2c_hists *hists,
|
||||
/* Overload number of header lines.*/
|
||||
hists->list.nr_header_lines = nr_header_lines;
|
||||
|
||||
return hpp_list__parse(&hists->list, /*output=*/NULL, sort, env);
|
||||
ret = hpp_list__parse(&hists->list, /*output=*/NULL, sort, env);
|
||||
|
||||
/* Unregister any formats added before the failure point */
|
||||
if (ret)
|
||||
perf_hpp__reset_output_field(&hists->list);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int c2c_hists__reinit(struct c2c_hists *c2c_hists,
|
||||
@@ -2141,8 +2075,16 @@ static int c2c_hists__reinit(struct c2c_hists *c2c_hists,
|
||||
const char *sort,
|
||||
struct perf_env *env)
|
||||
{
|
||||
int ret;
|
||||
|
||||
perf_hpp__reset_output_field(&c2c_hists->list);
|
||||
return hpp_list__parse(&c2c_hists->list, output, sort, env);
|
||||
ret = hpp_list__parse(&c2c_hists->list, output, sort, env);
|
||||
|
||||
/* Unregister any formats added before the failure point */
|
||||
if (ret)
|
||||
perf_hpp__reset_output_field(&c2c_hists->list);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define DISPLAY_LINE_LIMIT 0.001
|
||||
@@ -2281,6 +2223,7 @@ static int resort_cl_cb(struct hist_entry *he, void *arg)
|
||||
struct c2c_hist_entry *c2c_he;
|
||||
struct c2c_hists *c2c_hists;
|
||||
bool display = he__display(he, &c2c.shared_clines_stats);
|
||||
int ret;
|
||||
|
||||
c2c_he = container_of(he, struct c2c_hist_entry, he);
|
||||
c2c_hists = c2c_he->hists;
|
||||
@@ -2291,7 +2234,9 @@ static int resort_cl_cb(struct hist_entry *he, void *arg)
|
||||
c2c_he->cacheline_idx = idx++;
|
||||
calc_width(c2c_he);
|
||||
|
||||
c2c_hists__reinit(c2c_hists, c2c.cl_output, c2c.cl_resort, env);
|
||||
ret = c2c_hists__reinit(c2c_hists, c2c.cl_output, c2c.cl_resort, env);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hists__collapse_resort(&c2c_hists->hists, NULL);
|
||||
hists__output_resort_cb(&c2c_hists->hists, NULL, filter_cb);
|
||||
@@ -2800,11 +2745,18 @@ perf_c2c_browser__new(struct hists *hists)
|
||||
|
||||
static int perf_c2c__hists_browse(struct hists *hists)
|
||||
{
|
||||
struct c2c_function_view_args func_args = {
|
||||
.cl_hists = &c2c.hists,
|
||||
.cl_sort = c2c.cl_sort,
|
||||
.symbol_full = c2c.symbol_full,
|
||||
.browse_cacheline = perf_c2c__browse_cacheline,
|
||||
};
|
||||
struct hist_browser *browser;
|
||||
int key = -1;
|
||||
static const char help[] =
|
||||
" d Display cacheline details \n"
|
||||
" ENTER Toggle callchains (if present) \n"
|
||||
" TAB Switch to function view\n"
|
||||
" q Quit \n";
|
||||
|
||||
browser = perf_c2c_browser__new(hists);
|
||||
@@ -2826,6 +2778,9 @@ static int perf_c2c__hists_browse(struct hists *hists)
|
||||
case 'd':
|
||||
perf_c2c__browse_cacheline(browser->he_selection);
|
||||
break;
|
||||
case '\t':
|
||||
perf_c2c__browse_function_view(&func_args);
|
||||
break;
|
||||
case '?':
|
||||
ui_browser__help_window(&browser->b, help);
|
||||
break;
|
||||
@@ -3356,13 +3311,19 @@ static int perf_c2c__report(int argc, const char **argv)
|
||||
else if (c2c.display == DISPLAY_SNP_PEER)
|
||||
sort_str = "tot_peer";
|
||||
|
||||
c2c_hists__reinit(&c2c.hists, output_str, sort_str, perf_session__env(session));
|
||||
err = c2c_hists__reinit(&c2c.hists, output_str, sort_str, perf_session__env(session));
|
||||
if (err) {
|
||||
pr_err("Failed to reinitialize hists\n");
|
||||
goto out_mem2node;
|
||||
}
|
||||
|
||||
ui_progress__init(&prog, c2c.hists.hists.nr_entries, "Sorting...");
|
||||
|
||||
hists__collapse_resort(&c2c.hists.hists, NULL);
|
||||
hists__output_resort_cb(&c2c.hists.hists, &prog, resort_shared_cl_cb);
|
||||
hists__iterate_cb(&c2c.hists.hists, resort_cl_cb, perf_session__env(session));
|
||||
err = hists__iterate_cb(&c2c.hists.hists, resort_cl_cb, perf_session__env(session));
|
||||
if (err)
|
||||
goto out_mem2node;
|
||||
|
||||
ui_progress__finish();
|
||||
|
||||
|
||||
@@ -72,18 +72,11 @@ static void ftrace__workload_exec_failed_signal(int signo __maybe_unused,
|
||||
|
||||
static bool check_ftrace_capable(void)
|
||||
{
|
||||
bool used_root;
|
||||
|
||||
if (perf_cap__capable(CAP_PERFMON, &used_root))
|
||||
if (perf_cap__capable(CAP_PERFMON) ||
|
||||
perf_cap__capable(CAP_SYS_ADMIN))
|
||||
return true;
|
||||
|
||||
if (!used_root && perf_cap__capable(CAP_SYS_ADMIN, &used_root))
|
||||
return true;
|
||||
|
||||
pr_err("ftrace only works for %s!\n",
|
||||
used_root ? "root"
|
||||
: "users with the CAP_PERFMON or CAP_SYS_ADMIN capability"
|
||||
);
|
||||
pr_err("ftrace only works for users with the CAP_PERFMON or CAP_SYS_ADMIN capability!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -377,9 +370,9 @@ static int set_tracing_pid(struct perf_ftrace *ftrace)
|
||||
if (target__has_cpu(&ftrace->target))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < perf_thread_map__nr(ftrace->evlist->core.threads); i++) {
|
||||
for (i = 0; i < perf_thread_map__nr(evlist__core(ftrace->evlist)->threads); i++) {
|
||||
scnprintf(buf, sizeof(buf), "%d",
|
||||
perf_thread_map__pid(ftrace->evlist->core.threads, i));
|
||||
perf_thread_map__pid(evlist__core(ftrace->evlist)->threads, i));
|
||||
if (append_tracing_file("set_ftrace_pid", buf) < 0)
|
||||
return -1;
|
||||
}
|
||||
@@ -413,7 +406,7 @@ static int set_tracing_cpumask(struct perf_cpu_map *cpumap)
|
||||
|
||||
static int set_tracing_cpu(struct perf_ftrace *ftrace)
|
||||
{
|
||||
struct perf_cpu_map *cpumap = ftrace->evlist->core.user_requested_cpus;
|
||||
struct perf_cpu_map *cpumap = evlist__core(ftrace->evlist)->user_requested_cpus;
|
||||
|
||||
if (!target__has_cpu(&ftrace->target))
|
||||
return 0;
|
||||
@@ -1614,14 +1607,15 @@ static int parse_filter_event(const struct option *opt, const char *str,
|
||||
{
|
||||
struct list_head *head = opt->value;
|
||||
struct filter_entry *entry;
|
||||
char *s, *p;
|
||||
char *s, *p, *tmp;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
s = strdup(str);
|
||||
if (s == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
while ((p = strsep(&s, ",")) != NULL) {
|
||||
tmp = s;
|
||||
while ((p = strsep(&tmp, ",")) != NULL) {
|
||||
entry = malloc(sizeof(*entry) + strlen(p) + 1);
|
||||
if (entry == NULL)
|
||||
goto out;
|
||||
@@ -1999,20 +1993,20 @@ int cmd_ftrace(int argc, const char **argv)
|
||||
|
||||
ret = evlist__create_maps(ftrace.evlist, &ftrace.target);
|
||||
if (ret < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
if (argc) {
|
||||
ret = evlist__prepare_workload(ftrace.evlist, &ftrace.target,
|
||||
argv, false,
|
||||
ftrace__workload_exec_failed_signal);
|
||||
if (ret < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
ret = cmd_func(&ftrace);
|
||||
|
||||
out_delete_evlist:
|
||||
evlist__delete(ftrace.evlist);
|
||||
out_put_evlist:
|
||||
evlist__put(ftrace.evlist);
|
||||
|
||||
out_delete_filters:
|
||||
delete_filter_func(&ftrace.filters);
|
||||
|
||||
@@ -726,8 +726,11 @@ static int perf_event__repipe_common_mmap(const struct perf_tool *tool,
|
||||
}
|
||||
|
||||
if (dso && !dso__hit(dso)) {
|
||||
if (!sample->evsel)
|
||||
if (!sample->evsel) {
|
||||
sample->evsel = evlist__event2evsel(inject->session->evlist, event);
|
||||
if (sample->evsel)
|
||||
evsel__get(sample->evsel);
|
||||
}
|
||||
|
||||
if (sample->evsel) {
|
||||
dso__set_hit(dso);
|
||||
@@ -1520,7 +1523,7 @@ static int synthesize_id_index(struct perf_inject *inject, size_t new_cnt)
|
||||
struct perf_session *session = inject->session;
|
||||
struct evlist *evlist = session->evlist;
|
||||
struct machine *machine = &session->machines.host;
|
||||
size_t from = evlist->core.nr_entries - new_cnt;
|
||||
size_t from = evlist__nr_entries(evlist) - new_cnt;
|
||||
|
||||
return __perf_event__synthesize_id_index(&inject->tool, perf_event__repipe,
|
||||
evlist, machine, from);
|
||||
@@ -2055,7 +2058,7 @@ static int host__finished_init(const struct perf_tool *tool, struct perf_session
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = synthesize_id_index(inject, gs->session->evlist->core.nr_entries);
|
||||
ret = synthesize_id_index(inject, evlist__nr_entries(gs->session->evlist));
|
||||
if (ret) {
|
||||
pr_err("Failed to synthesize id_index\n");
|
||||
return ret;
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include <termios.h>
|
||||
#include <semaphore.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <perf/mmap.h>
|
||||
|
||||
@@ -606,11 +607,11 @@ static const char *get_filename_for_perf_kvm(void)
|
||||
const char *filename;
|
||||
|
||||
if (perf_host && !perf_guest)
|
||||
filename = strdup("perf.data.host");
|
||||
filename = "perf.data.host";
|
||||
else if (!perf_host && perf_guest)
|
||||
filename = strdup("perf.data.guest");
|
||||
filename = "perf.data.guest";
|
||||
else
|
||||
filename = strdup("perf.data.kvm");
|
||||
filename = "perf.data.kvm";
|
||||
|
||||
return filename;
|
||||
}
|
||||
@@ -1152,13 +1153,16 @@ static int process_sample_event(const struct perf_tool *tool,
|
||||
pr_debug("problem processing %s (%u) event at offset %#" PRIx64 ", skipping it.\n",
|
||||
perf_event__name(event->header.type), event->header.type,
|
||||
sample->file_offset);
|
||||
return -1;
|
||||
err = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!handle_kvm_event(kvm, thread, sample))
|
||||
err = -1;
|
||||
|
||||
thread__put(thread);
|
||||
out:
|
||||
addr_location__exit(&kvm->al);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1221,7 +1225,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
|
||||
int err;
|
||||
|
||||
*mmap_time = ULLONG_MAX;
|
||||
md = &evlist->mmap[idx];
|
||||
md = &evlist__mmap(evlist)[idx];
|
||||
err = perf_mmap__read_init(&md->core);
|
||||
if (err < 0)
|
||||
return (err == -EAGAIN) ? 0 : -1;
|
||||
@@ -1266,7 +1270,7 @@ static int perf_kvm__mmap_read(struct perf_kvm_stat *kvm)
|
||||
s64 n, ntotal = 0;
|
||||
u64 flush_time = ULLONG_MAX, mmap_time;
|
||||
|
||||
for (i = 0; i < kvm->evlist->core.nr_mmaps; i++) {
|
||||
for (i = 0; i < evlist__core(kvm->evlist)->nr_mmaps; i++) {
|
||||
n = perf_kvm__mmap_read_idx(kvm, i, &mmap_time);
|
||||
if (n < 0)
|
||||
return -1;
|
||||
@@ -1449,7 +1453,7 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm)
|
||||
evlist__enable(kvm->evlist);
|
||||
|
||||
while (!done) {
|
||||
struct fdarray *fda = &kvm->evlist->core.pollfd;
|
||||
struct fdarray *fda = &evlist__core(kvm->evlist)->pollfd;
|
||||
int rc;
|
||||
|
||||
rc = perf_kvm__mmap_read(kvm);
|
||||
@@ -1531,7 +1535,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (evlist__mmap(evlist, kvm->opts.mmap_pages) < 0) {
|
||||
if (evlist__do_mmap(evlist, kvm->opts.mmap_pages) < 0) {
|
||||
ui__error("Failed to mmap the events: %s\n",
|
||||
str_error_r(errno, sbuf, sizeof(sbuf)));
|
||||
evlist__close(evlist);
|
||||
@@ -1681,18 +1685,18 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(record_args); i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]);
|
||||
rec_argv[i] = record_args[i];
|
||||
|
||||
for (j = 0; j < events_tp_size; j++) {
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("-e");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp(e_machine)[j]);
|
||||
rec_argv[i++] = "-e";
|
||||
rec_argv[i++] = kvm_events_tp(e_machine)[j];
|
||||
}
|
||||
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("-o");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name);
|
||||
rec_argv[i++] = "-o";
|
||||
rec_argv[i++] = kvm->file_name;
|
||||
|
||||
for (j = 1; j < (unsigned int)argc; j++, i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
|
||||
rec_argv[i] = argv[j];
|
||||
|
||||
set_option_flag(record_options, 'e', "event", PARSE_OPT_HIDDEN);
|
||||
set_option_flag(record_options, 0, "filter", PARSE_OPT_HIDDEN);
|
||||
@@ -1716,10 +1720,6 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
|
||||
|
||||
record_usage = kvm_stat_record_usage;
|
||||
ret = cmd_record(i, rec_argv);
|
||||
|
||||
EXIT:
|
||||
for (i = 0; i < rec_argc; i++)
|
||||
free((void *)rec_argv[i]);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
@@ -1810,7 +1810,7 @@ static struct evlist *kvm_live_event_list(void)
|
||||
|
||||
out:
|
||||
if (err) {
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
evlist = NULL;
|
||||
}
|
||||
|
||||
@@ -1931,7 +1931,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
|
||||
perf_session__set_id_hdr_size(kvm->session);
|
||||
ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true);
|
||||
machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target,
|
||||
kvm->evlist->core.threads, true, false, 1);
|
||||
evlist__core(kvm->evlist)->threads, true, false, 1);
|
||||
err = kvm_live_open_events(kvm);
|
||||
if (err)
|
||||
goto out;
|
||||
@@ -1941,7 +1941,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
|
||||
out:
|
||||
perf_session__delete(kvm->session);
|
||||
kvm->session = NULL;
|
||||
evlist__delete(kvm->evlist);
|
||||
evlist__put(kvm->evlist);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -1995,34 +1995,35 @@ static int __cmd_record(const char *file_name, int argc, const char **argv)
|
||||
{
|
||||
int rec_argc, i = 0, j, ret;
|
||||
const char **rec_argv;
|
||||
int need_arch_event = !!kvm_need_default_arch_event(EM_HOST, argc, argv);
|
||||
|
||||
/*
|
||||
* Besides the 2 more options "-o" and "filename",
|
||||
* kvm_add_default_arch_event() may add 2 extra options,
|
||||
* so allocate 4 more items.
|
||||
* so allocate more items conditionally.
|
||||
*/
|
||||
rec_argc = argc + 2 + 2;
|
||||
rec_argc = argc + 2 + (2 * need_arch_event);
|
||||
rec_argv = calloc(rec_argc + 1, sizeof(char *));
|
||||
if (!rec_argv)
|
||||
return -ENOMEM;
|
||||
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("record");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("-o");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT(file_name);
|
||||
rec_argv[i++] = "record";
|
||||
rec_argv[i++] = "-o";
|
||||
rec_argv[i++] = file_name;
|
||||
if (need_arch_event) {
|
||||
ret = kvm_add_default_arch_event(EM_HOST, &i, rec_argv);
|
||||
if (ret)
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
for (j = 1; j < argc; j++, i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
|
||||
rec_argv[i] = argv[j];
|
||||
|
||||
BUG_ON(i + 2 != rec_argc);
|
||||
|
||||
ret = kvm_add_default_arch_event(EM_HOST, &i, rec_argv);
|
||||
if (ret)
|
||||
goto EXIT;
|
||||
BUG_ON(i != rec_argc);
|
||||
|
||||
ret = cmd_record(i, rec_argv);
|
||||
|
||||
EXIT:
|
||||
for (i = 0; i < rec_argc; i++)
|
||||
free((void *)rec_argv[i]);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
@@ -2037,19 +2038,15 @@ static int __cmd_report(const char *file_name, int argc, const char **argv)
|
||||
if (!rec_argv)
|
||||
return -ENOMEM;
|
||||
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("report");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("-i");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT(file_name);
|
||||
rec_argv[i++] = "report";
|
||||
rec_argv[i++] = "-i";
|
||||
rec_argv[i++] = file_name;
|
||||
for (j = 1; j < argc; j++, i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
|
||||
rec_argv[i] = argv[j];
|
||||
|
||||
BUG_ON(i != rec_argc);
|
||||
|
||||
ret = cmd_report(i, rec_argv);
|
||||
|
||||
EXIT:
|
||||
for (i = 0; i < rec_argc; i++)
|
||||
free((void *)rec_argv[i]);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
@@ -2065,19 +2062,15 @@ __cmd_buildid_list(const char *file_name, int argc, const char **argv)
|
||||
if (!rec_argv)
|
||||
return -ENOMEM;
|
||||
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("buildid-list");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT("-i");
|
||||
rec_argv[i++] = STRDUP_FAIL_EXIT(file_name);
|
||||
rec_argv[i++] = "buildid-list";
|
||||
rec_argv[i++] = "-i";
|
||||
rec_argv[i++] = file_name;
|
||||
for (j = 1; j < argc; j++, i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
|
||||
rec_argv[i] = argv[j];
|
||||
|
||||
BUG_ON(i != rec_argc);
|
||||
|
||||
ret = cmd_buildid_list(i, rec_argv);
|
||||
|
||||
EXIT:
|
||||
for (i = 0; i < rec_argc; i++)
|
||||
free((void *)rec_argv[i]);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
@@ -2097,19 +2090,19 @@ static int __cmd_top(int argc, const char **argv)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
rec_argv[i] = STRDUP_FAIL_EXIT(argv[i]);
|
||||
rec_argv[i] = argv[i];
|
||||
|
||||
BUG_ON(i != argc);
|
||||
|
||||
ret = kvm_add_default_arch_event(EM_HOST, &i, rec_argv);
|
||||
if (ret)
|
||||
goto EXIT;
|
||||
if (kvm_need_default_arch_event(EM_HOST, argc, argv)) {
|
||||
ret = kvm_add_default_arch_event(EM_HOST, &i, rec_argv);
|
||||
if (ret)
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
ret = cmd_top(i, rec_argv);
|
||||
|
||||
EXIT:
|
||||
for (i = 0; i < rec_argc; i++)
|
||||
free((void *)rec_argv[i]);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
@@ -2145,6 +2138,7 @@ int cmd_kvm(int argc, const char **argv)
|
||||
const char *const kvm_subcommands[] = { "top", "record", "report", "diff",
|
||||
"buildid-list", "stat", NULL };
|
||||
const char *kvm_usage[] = { NULL, NULL };
|
||||
int ret;
|
||||
|
||||
exclude_GH_default = true;
|
||||
perf_host = 0;
|
||||
@@ -2155,31 +2149,27 @@ int cmd_kvm(int argc, const char **argv)
|
||||
if (!argc)
|
||||
usage_with_options(kvm_usage, kvm_options);
|
||||
|
||||
thread__set_priv_destructor(free);
|
||||
|
||||
if (!perf_host)
|
||||
perf_guest = 1;
|
||||
|
||||
if (!file_name) {
|
||||
if (!file_name)
|
||||
file_name = get_filename_for_perf_kvm();
|
||||
|
||||
if (!file_name) {
|
||||
pr_err("Failed to allocate memory for filename\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
if (strlen(argv[0]) > 2 && strstarts("record", argv[0]))
|
||||
return __cmd_record(file_name, argc, argv);
|
||||
ret = __cmd_record(file_name, argc, argv);
|
||||
else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
|
||||
return __cmd_report(file_name, argc, argv);
|
||||
ret = __cmd_report(file_name, argc, argv);
|
||||
else if (strlen(argv[0]) > 2 && strstarts("diff", argv[0]))
|
||||
return cmd_diff(argc, argv);
|
||||
ret = cmd_diff(argc, argv);
|
||||
else if (!strcmp(argv[0], "top"))
|
||||
return __cmd_top(argc, argv);
|
||||
ret = __cmd_top(argc, argv);
|
||||
else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
|
||||
return __cmd_buildid_list(file_name, argc, argv);
|
||||
ret = __cmd_buildid_list(file_name, argc, argv);
|
||||
#if defined(HAVE_LIBTRACEEVENT)
|
||||
else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
|
||||
return kvm_cmd_stat(file_name, argc, argv);
|
||||
ret = kvm_cmd_stat(file_name, argc, argv);
|
||||
#endif
|
||||
else
|
||||
usage_with_options(kvm_usage, kvm_options);
|
||||
@@ -2187,5 +2177,5 @@ int cmd_kvm(int argc, const char **argv)
|
||||
/* free usage string allocated by parse_options_subcommand */
|
||||
free((void *)kvm_usage[0]);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1814,7 +1814,7 @@ static int perf_kwork__check_config(struct perf_kwork *kwork,
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(evsel, &session->evlist->core.entries, core.node) {
|
||||
list_for_each_entry(evsel, &evlist__core(session->evlist)->entries, core.node) {
|
||||
if (kwork->show_callchain && !evsel__has_callchain(evsel)) {
|
||||
pr_debug("Samples do not have callchains\n");
|
||||
kwork->show_callchain = 0;
|
||||
@@ -1864,9 +1864,9 @@ static int perf_kwork__read_events(struct perf_kwork *kwork)
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
kwork->nr_events = session->evlist->stats.nr_events[0];
|
||||
kwork->nr_lost_events = session->evlist->stats.total_lost;
|
||||
kwork->nr_lost_chunks = session->evlist->stats.nr_events[PERF_RECORD_LOST];
|
||||
kwork->nr_events = evlist__stats(session->evlist)->nr_events[0];
|
||||
kwork->nr_lost_events = evlist__stats(session->evlist)->total_lost;
|
||||
kwork->nr_lost_chunks = evlist__stats(session->evlist)->nr_events[PERF_RECORD_LOST];
|
||||
|
||||
out_delete:
|
||||
perf_session__delete(session);
|
||||
|
||||
@@ -2129,7 +2129,7 @@ static int __cmd_contention(int argc, const char **argv)
|
||||
evlist__start_workload(con.evlist);
|
||||
|
||||
while (!done) {
|
||||
if (argc && waitpid(con.evlist->workload.pid, NULL, WNOHANG) > 0)
|
||||
if (argc && waitpid(evlist__workload_pid(con.evlist), NULL, WNOHANG) > 0)
|
||||
break;
|
||||
sleep(1);
|
||||
}
|
||||
@@ -2149,7 +2149,7 @@ static int __cmd_contention(int argc, const char **argv)
|
||||
|
||||
out_delete:
|
||||
lock_filter_finish();
|
||||
evlist__delete(con.evlist);
|
||||
evlist__put(con.evlist);
|
||||
lock_contention_finish(&con);
|
||||
perf_session__delete(session);
|
||||
perf_env__exit(&host_env);
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
#include <poll.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#ifndef HAVE_GETTID
|
||||
#include <syscall.h>
|
||||
#endif
|
||||
@@ -502,12 +503,12 @@ static void record__aio_mmap_read_sync(struct record *rec)
|
||||
{
|
||||
int i;
|
||||
struct evlist *evlist = rec->evlist;
|
||||
struct mmap *maps = evlist->mmap;
|
||||
struct mmap *maps = evlist__mmap(evlist);
|
||||
|
||||
if (!record__aio_enabled(rec))
|
||||
return;
|
||||
|
||||
for (i = 0; i < evlist->core.nr_mmaps; i++) {
|
||||
for (i = 0; i < evlist__core(evlist)->nr_mmaps; i++) {
|
||||
struct mmap *map = &maps[i];
|
||||
|
||||
if (map->core.base)
|
||||
@@ -653,27 +654,14 @@ static int record__pushfn(struct mmap *map, void *to, void *bf, size_t size)
|
||||
struct record *rec = to;
|
||||
|
||||
if (record__comp_enabled(rec)) {
|
||||
struct perf_record_compressed2 *event = map->data;
|
||||
size_t padding = 0;
|
||||
u8 pad[8] = {0};
|
||||
ssize_t compressed = zstd_compress(rec->session, map, map->data,
|
||||
mmap__mmap_len(map), bf, size);
|
||||
|
||||
if (compressed < 0)
|
||||
return (int)compressed;
|
||||
|
||||
bf = event;
|
||||
thread->samples++;
|
||||
|
||||
/*
|
||||
* The record from `zstd_compress` is not 8 bytes aligned, which would cause asan
|
||||
* error. We make it aligned here.
|
||||
*/
|
||||
event->data_size = compressed - sizeof(struct perf_record_compressed2);
|
||||
event->header.size = PERF_ALIGN(compressed, sizeof(u64));
|
||||
padding = event->header.size - compressed;
|
||||
return record__write(rec, map, bf, compressed) ||
|
||||
record__write(rec, map, &pad, padding);
|
||||
return record__write(rec, map, map->data, compressed);
|
||||
}
|
||||
|
||||
thread->samples++;
|
||||
@@ -811,8 +799,8 @@ static int record__auxtrace_read_snapshot_all(struct record *rec)
|
||||
int i;
|
||||
int rc = 0;
|
||||
|
||||
for (i = 0; i < rec->evlist->core.nr_mmaps; i++) {
|
||||
struct mmap *map = &rec->evlist->mmap[i];
|
||||
for (i = 0; i < evlist__core(rec->evlist)->nr_mmaps; i++) {
|
||||
struct mmap *map = &evlist__mmap(rec->evlist)[i];
|
||||
|
||||
if (!map->auxtrace_mmap.base)
|
||||
continue;
|
||||
@@ -1055,15 +1043,15 @@ static void record__thread_data_close_pipes(struct record_thread *thread_data)
|
||||
|
||||
static bool evlist__per_thread(struct evlist *evlist)
|
||||
{
|
||||
return cpu_map__is_dummy(evlist->core.user_requested_cpus);
|
||||
return cpu_map__is_dummy(evlist__core(evlist)->user_requested_cpus);
|
||||
}
|
||||
|
||||
static int record__thread_data_init_maps(struct record_thread *thread_data, struct evlist *evlist)
|
||||
{
|
||||
int m, tm, nr_mmaps = evlist->core.nr_mmaps;
|
||||
struct mmap *mmap = evlist->mmap;
|
||||
struct mmap *overwrite_mmap = evlist->overwrite_mmap;
|
||||
struct perf_cpu_map *cpus = evlist->core.all_cpus;
|
||||
int m, tm, nr_mmaps = evlist__core(evlist)->nr_mmaps;
|
||||
struct mmap *mmap = evlist__mmap(evlist);
|
||||
struct mmap *overwrite_mmap = evlist__overwrite_mmap(evlist);
|
||||
struct perf_cpu_map *cpus = evlist__core(evlist)->all_cpus;
|
||||
bool per_thread = evlist__per_thread(evlist);
|
||||
|
||||
if (per_thread)
|
||||
@@ -1118,16 +1106,17 @@ static int record__thread_data_init_pollfd(struct record_thread *thread_data, st
|
||||
overwrite_map = thread_data->overwrite_maps ?
|
||||
thread_data->overwrite_maps[tm] : NULL;
|
||||
|
||||
for (f = 0; f < evlist->core.pollfd.nr; f++) {
|
||||
void *ptr = evlist->core.pollfd.priv[f].ptr;
|
||||
for (f = 0; f < evlist__core(evlist)->pollfd.nr; f++) {
|
||||
void *ptr = evlist__core(evlist)->pollfd.priv[f].ptr;
|
||||
|
||||
if ((map && ptr == map) || (overwrite_map && ptr == overwrite_map)) {
|
||||
pos = fdarray__dup_entry_from(&thread_data->pollfd, f,
|
||||
&evlist->core.pollfd);
|
||||
&evlist__core(evlist)->pollfd);
|
||||
if (pos < 0)
|
||||
return pos;
|
||||
pr_debug2("thread_data[%p]: pollfd[%d] <- event_fd=%d\n",
|
||||
thread_data, pos, evlist->core.pollfd.entries[f].fd);
|
||||
thread_data, pos,
|
||||
evlist__core(evlist)->pollfd.entries[f].fd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1171,7 +1160,7 @@ static int record__update_evlist_pollfd_from_thread(struct record *rec,
|
||||
struct evlist *evlist,
|
||||
struct record_thread *thread_data)
|
||||
{
|
||||
struct pollfd *e_entries = evlist->core.pollfd.entries;
|
||||
struct pollfd *e_entries = evlist__core(evlist)->pollfd.entries;
|
||||
struct pollfd *t_entries = thread_data->pollfd.entries;
|
||||
int err = 0;
|
||||
size_t i;
|
||||
@@ -1195,7 +1184,7 @@ static int record__dup_non_perf_events(struct record *rec,
|
||||
struct evlist *evlist,
|
||||
struct record_thread *thread_data)
|
||||
{
|
||||
struct fdarray *fda = &evlist->core.pollfd;
|
||||
struct fdarray *fda = &evlist__core(evlist)->pollfd;
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < fda->nr; i++) {
|
||||
@@ -1322,17 +1311,17 @@ static int record__mmap_evlist(struct record *rec,
|
||||
return ret;
|
||||
|
||||
if (record__threads_enabled(rec)) {
|
||||
ret = perf_data__create_dir(&rec->data, evlist->core.nr_mmaps);
|
||||
ret = perf_data__create_dir(&rec->data, evlist__core(evlist)->nr_mmaps);
|
||||
if (ret) {
|
||||
errno = -ret;
|
||||
pr_err("Failed to create data directory: %m\n");
|
||||
return ret;
|
||||
}
|
||||
for (i = 0; i < evlist->core.nr_mmaps; i++) {
|
||||
if (evlist->mmap)
|
||||
evlist->mmap[i].file = &rec->data.dir.files[i];
|
||||
if (evlist->overwrite_mmap)
|
||||
evlist->overwrite_mmap[i].file = &rec->data.dir.files[i];
|
||||
for (i = 0; i < evlist__core(evlist)->nr_mmaps; i++) {
|
||||
if (evlist__mmap(evlist))
|
||||
evlist__mmap(evlist)[i].file = &rec->data.dir.files[i];
|
||||
if (evlist__overwrite_mmap(evlist))
|
||||
evlist__overwrite_mmap(evlist)[i].file = &rec->data.dir.files[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1481,11 +1470,11 @@ static int record__open(struct record *rec)
|
||||
|
||||
static void set_timestamp_boundary(struct record *rec, u64 sample_time)
|
||||
{
|
||||
if (rec->evlist->first_sample_time == 0)
|
||||
rec->evlist->first_sample_time = sample_time;
|
||||
if (evlist__first_sample_time(rec->evlist) == 0)
|
||||
evlist__set_first_sample_time(rec->evlist, sample_time);
|
||||
|
||||
if (sample_time)
|
||||
rec->evlist->last_sample_time = sample_time;
|
||||
evlist__set_last_sample_time(rec->evlist, sample_time);
|
||||
}
|
||||
|
||||
static int process_sample_event(const struct perf_tool *tool,
|
||||
@@ -1591,18 +1580,36 @@ static void record__adjust_affinity(struct record *rec, struct mmap *map)
|
||||
}
|
||||
}
|
||||
|
||||
static size_t process_comp_header(void *record, size_t increment)
|
||||
/*
|
||||
* Called once with data_size == 0 to start a record, then once with
|
||||
* data_size == compressed payload size to finalize and 8-byte-pad it
|
||||
* (unaligned records trip ASan in the reader).
|
||||
* Returns the bytes written, or -1 if it won't fit.
|
||||
*/
|
||||
static ssize_t process_comp_header(void *record, size_t dst_size,
|
||||
size_t data_size)
|
||||
{
|
||||
struct perf_record_compressed2 *event = record;
|
||||
size_t size = sizeof(*event);
|
||||
|
||||
if (increment) {
|
||||
event->header.size += increment;
|
||||
return increment;
|
||||
if (data_size) {
|
||||
size_t padding;
|
||||
|
||||
event->data_size = data_size;
|
||||
event->header.size = PERF_ALIGN(size + data_size, sizeof(u64));
|
||||
padding = event->header.size - size - data_size;
|
||||
if (padding > dst_size)
|
||||
return -1;
|
||||
memset(record + size + data_size, 0, padding);
|
||||
return padding;
|
||||
}
|
||||
|
||||
if (size > dst_size)
|
||||
return -1;
|
||||
|
||||
event->header.type = PERF_RECORD_COMPRESSED2;
|
||||
event->header.size = size;
|
||||
event->data_size = 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
@@ -1611,7 +1618,12 @@ static ssize_t zstd_compress(struct perf_session *session, struct mmap *map,
|
||||
void *dst, size_t dst_size, void *src, size_t src_size)
|
||||
{
|
||||
ssize_t compressed;
|
||||
size_t max_record_size = PERF_SAMPLE_MAX_SIZE - sizeof(struct perf_record_compressed2) - 1;
|
||||
/*
|
||||
* Reserve space so per-record PERF_ALIGN() padding keeps header.size
|
||||
* within u16.
|
||||
*/
|
||||
size_t max_record_size = PERF_SAMPLE_MAX_SIZE
|
||||
- sizeof(struct perf_record_compressed2) - sizeof(u64);
|
||||
struct zstd_data *zstd_data = &session->zstd_data;
|
||||
|
||||
if (map && map->file)
|
||||
@@ -1653,7 +1665,7 @@ static int record__mmap_read_evlist(struct record *rec, struct evlist *evlist,
|
||||
if (!maps)
|
||||
return 0;
|
||||
|
||||
if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING)
|
||||
if (overwrite && evlist__bkw_mmap_state(evlist) != BKW_MMAP_DATA_PENDING)
|
||||
return 0;
|
||||
|
||||
if (record__aio_enabled(rec))
|
||||
@@ -1808,7 +1820,7 @@ static void record__init_features(struct record *rec)
|
||||
if (rec->no_buildid)
|
||||
perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
|
||||
|
||||
if (!have_tracepoints(&rec->evlist->core.entries))
|
||||
if (!have_tracepoints(&evlist__core(rec->evlist)->entries))
|
||||
perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
|
||||
|
||||
if (!rec->opts.branch_stack)
|
||||
@@ -1874,7 +1886,7 @@ static int record__synthesize_workload(struct record *rec, bool tail)
|
||||
if (rec->opts.tail_synthesize != tail)
|
||||
return 0;
|
||||
|
||||
thread_map = thread_map__new_by_tid(rec->evlist->workload.pid);
|
||||
thread_map = thread_map__new_by_tid(evlist__workload_pid(rec->evlist));
|
||||
if (thread_map == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -2067,10 +2079,10 @@ static void alarm_sig_handler(int sig);
|
||||
static const struct perf_event_mmap_page *evlist__pick_pc(struct evlist *evlist)
|
||||
{
|
||||
if (evlist) {
|
||||
if (evlist->mmap && evlist->mmap[0].core.base)
|
||||
return evlist->mmap[0].core.base;
|
||||
if (evlist->overwrite_mmap && evlist->overwrite_mmap[0].core.base)
|
||||
return evlist->overwrite_mmap[0].core.base;
|
||||
if (evlist__mmap(evlist) && evlist__mmap(evlist)[0].core.base)
|
||||
return evlist__mmap(evlist)[0].core.base;
|
||||
if (evlist__overwrite_mmap(evlist) && evlist__overwrite_mmap(evlist)[0].core.base)
|
||||
return evlist__overwrite_mmap(evlist)[0].core.base;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -2150,7 +2162,7 @@ static int record__synthesize(struct record *rec, bool tail)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = perf_event__synthesize_thread_map2(&rec->tool, rec->evlist->core.threads,
|
||||
err = perf_event__synthesize_thread_map2(&rec->tool, evlist__core(rec->evlist)->threads,
|
||||
process_synthesized_event,
|
||||
NULL);
|
||||
if (err < 0) {
|
||||
@@ -2158,7 +2170,7 @@ static int record__synthesize(struct record *rec, bool tail)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = perf_event__synthesize_cpu_map(&rec->tool, rec->evlist->core.all_cpus,
|
||||
err = perf_event__synthesize_cpu_map(&rec->tool, evlist__core(rec->evlist)->all_cpus,
|
||||
process_synthesized_event, NULL);
|
||||
if (err < 0) {
|
||||
pr_err("Couldn't synthesize cpu map.\n");
|
||||
@@ -2191,7 +2203,7 @@ static int record__synthesize(struct record *rec, bool tail)
|
||||
bool needs_mmap = rec->opts.synth & PERF_SYNTH_MMAP;
|
||||
|
||||
err = __machine__synthesize_threads(machine, tool, &opts->target,
|
||||
rec->evlist->core.threads,
|
||||
evlist__core(rec->evlist)->threads,
|
||||
f, needs_mmap, opts->record_data_mmap,
|
||||
rec->opts.nr_threads_synthesize);
|
||||
}
|
||||
@@ -2246,6 +2258,8 @@ static int record__setup_sb_evlist(struct record *rec)
|
||||
|
||||
if (evlist__add_bpf_sb_event(rec->sb_evlist, perf_session__env(rec->session))) {
|
||||
pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
|
||||
evlist__put(rec->sb_evlist);
|
||||
rec->sb_evlist = NULL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -2544,7 +2558,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
* because we synthesize event name through the pipe
|
||||
* and need the id for that.
|
||||
*/
|
||||
if (data->is_pipe && rec->evlist->core.nr_entries == 1)
|
||||
if (data->is_pipe && evlist__nr_entries(rec->evlist) == 1)
|
||||
rec->opts.sample_id = true;
|
||||
|
||||
if (rec->timestamp_filename && perf_data__is_pipe(data)) {
|
||||
@@ -2568,7 +2582,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
}
|
||||
/* Debug message used by test scripts */
|
||||
pr_debug3("perf record done opening and mmapping events\n");
|
||||
env->comp_mmap_len = session->evlist->core.mmap_len;
|
||||
env->comp_mmap_len = evlist__core(session->evlist)->mmap_len;
|
||||
|
||||
if (rec->opts.kcore) {
|
||||
err = record__kcore_copy(&session->machines.host, data);
|
||||
@@ -2669,7 +2683,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
* Synthesize COMM event to prevent it.
|
||||
*/
|
||||
tgid = perf_event__synthesize_comm(tool, event,
|
||||
rec->evlist->workload.pid,
|
||||
evlist__workload_pid(rec->evlist),
|
||||
process_synthesized_event,
|
||||
machine);
|
||||
free(event);
|
||||
@@ -2689,7 +2703,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
* Synthesize NAMESPACES event for the command specified.
|
||||
*/
|
||||
perf_event__synthesize_namespaces(tool, event,
|
||||
rec->evlist->workload.pid,
|
||||
evlist__workload_pid(rec->evlist),
|
||||
tgid, process_synthesized_event,
|
||||
machine);
|
||||
free(event);
|
||||
@@ -2706,7 +2720,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
err = event_enable_timer__start(rec->evlist->eet);
|
||||
err = event_enable_timer__start(evlist__event_enable_timer(rec->evlist));
|
||||
if (err)
|
||||
goto out_child;
|
||||
|
||||
@@ -2768,7 +2782,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
* record__mmap_read_all() didn't collect data from
|
||||
* overwritable ring buffer. Read again.
|
||||
*/
|
||||
if (rec->evlist->bkw_mmap_state == BKW_MMAP_RUNNING)
|
||||
if (evlist__bkw_mmap_state(rec->evlist) == BKW_MMAP_RUNNING)
|
||||
continue;
|
||||
trigger_ready(&switch_output_trigger);
|
||||
|
||||
@@ -2837,7 +2851,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
err = event_enable_timer__process(rec->evlist->eet);
|
||||
err = event_enable_timer__process(evlist__event_enable_timer(rec->evlist));
|
||||
if (err < 0)
|
||||
goto out_child;
|
||||
if (err) {
|
||||
@@ -2889,11 +2903,13 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
record__synthesize_workload(rec, true);
|
||||
|
||||
out_child:
|
||||
evlist__disable(rec->evlist);
|
||||
record__stop_threads(rec);
|
||||
record__mmap_read_all(rec, true);
|
||||
goto out_free_threads;
|
||||
out_child_no_flush:
|
||||
/* mmap read already failed — retrying would just fail again */
|
||||
evlist__disable(rec->evlist);
|
||||
record__stop_threads(rec);
|
||||
out_free_threads:
|
||||
record__free_thread_data(rec);
|
||||
@@ -2909,7 +2925,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
int exit_status;
|
||||
|
||||
if (!child_finished)
|
||||
kill(rec->evlist->workload.pid, SIGTERM);
|
||||
kill(evlist__workload_pid(rec->evlist), SIGTERM);
|
||||
|
||||
wait(&exit_status);
|
||||
|
||||
@@ -4032,7 +4048,7 @@ static int record__init_thread_default_masks(struct record *rec, struct perf_cpu
|
||||
static int record__init_thread_masks(struct record *rec)
|
||||
{
|
||||
int ret = 0;
|
||||
struct perf_cpu_map *cpus = rec->evlist->core.all_cpus;
|
||||
struct perf_cpu_map *cpus = evlist__core(rec->evlist)->all_cpus;
|
||||
|
||||
if (!record__threads_enabled(rec))
|
||||
return record__init_thread_default_masks(rec, cpus);
|
||||
@@ -4283,15 +4299,15 @@ int cmd_record(int argc, const char **argv)
|
||||
if (record.opts.overwrite)
|
||||
record.opts.tail_synthesize = true;
|
||||
|
||||
if (rec->evlist->core.nr_entries == 0) {
|
||||
if (evlist__nr_entries(rec->evlist) == 0) {
|
||||
struct evlist *def_evlist = evlist__new_default(&rec->opts.target,
|
||||
callchain_param.enabled);
|
||||
|
||||
if (!def_evlist)
|
||||
goto out;
|
||||
|
||||
evlist__splice_list_tail(rec->evlist, &def_evlist->core.entries);
|
||||
evlist__delete(def_evlist);
|
||||
evlist__splice_list_tail(rec->evlist, &evlist__core(def_evlist)->entries);
|
||||
evlist__put(def_evlist);
|
||||
}
|
||||
|
||||
if (rec->opts.target.tid && !rec->opts.no_inherit_set)
|
||||
@@ -4401,7 +4417,7 @@ int cmd_record(int argc, const char **argv)
|
||||
auxtrace_record__free(rec->itr);
|
||||
out_opts:
|
||||
evlist__close_control(rec->opts.ctl_fd, rec->opts.ctl_fd_ack, &rec->opts.ctl_fd_close);
|
||||
evlist__delete(rec->evlist);
|
||||
evlist__put(rec->evlist);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -561,7 +561,7 @@ static int evlist__tty_browse_hists(struct evlist *evlist, struct report *rep, c
|
||||
|
||||
if (!quiet) {
|
||||
fprintf(stdout, "#\n# Total Lost Samples: %" PRIu64 "\n#\n",
|
||||
evlist->stats.total_lost_samples);
|
||||
evlist__stats(evlist)->total_lost_samples);
|
||||
}
|
||||
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
@@ -726,8 +726,11 @@ static int report__collapse_hists(struct report *rep)
|
||||
evlist__for_each_entry(rep->session->evlist, pos) {
|
||||
struct hists *hists = evsel__hists(pos);
|
||||
|
||||
if (pos->core.idx == 0)
|
||||
hists->symbol_filter_str = rep->symbol_filter_str;
|
||||
if (pos->core.idx == 0) {
|
||||
hists->symbol_filter_str =
|
||||
rep->symbol_filter_str ?
|
||||
strdup(rep->symbol_filter_str) : NULL;
|
||||
}
|
||||
|
||||
hists->socket_filter = rep->socket_filter;
|
||||
|
||||
@@ -1156,7 +1159,7 @@ static int __cmd_report(struct report *rep)
|
||||
PERF_HPP_REPORT__BLOCK_AVG_CYCLES,
|
||||
};
|
||||
|
||||
if (session->evlist->nr_br_cntr > 0)
|
||||
if (evlist__nr_br_cntr(session->evlist) > 0)
|
||||
block_hpps[nr_hpps++] = PERF_HPP_REPORT__BLOCK_BRANCH_COUNTER;
|
||||
|
||||
block_hpps[nr_hpps++] = PERF_HPP_REPORT__BLOCK_RANGE;
|
||||
@@ -1291,7 +1294,7 @@ static int process_attr(const struct perf_tool *tool __maybe_unused,
|
||||
* on events sample_type.
|
||||
*/
|
||||
sample_type = evlist__combined_sample_type(*pevlist);
|
||||
session = (*pevlist)->session;
|
||||
session = evlist__session(*pevlist);
|
||||
callchain_param_setup(sample_type, perf_session__e_machine(session, /*e_flags=*/NULL));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -59,6 +59,68 @@
|
||||
#define MAX_PRIO 140
|
||||
#define SEP_LEN 100
|
||||
|
||||
#define NUM_LAT_BUCKETS 22
|
||||
|
||||
enum hist_mode {
|
||||
HIST_MODE_LOG = 0,
|
||||
HIST_MODE_LINEAR,
|
||||
};
|
||||
|
||||
static const char *lat_bucket_names[NUM_LAT_BUCKETS] = {
|
||||
"< 1 us",
|
||||
"1 - 2 us",
|
||||
"2 - 4 us",
|
||||
"4 - 8 us",
|
||||
"8 - 16 us",
|
||||
"16 - 32 us",
|
||||
"32 - 64 us",
|
||||
"64 - 128 us",
|
||||
"128 - 256 us",
|
||||
"256 - 512 us",
|
||||
"512 - 1024 us",
|
||||
"1 - 2 ms",
|
||||
"2 - 4 ms",
|
||||
"4 - 8 ms",
|
||||
"8 - 16 ms",
|
||||
"16 - 32 ms",
|
||||
"32 - 64 ms",
|
||||
"64 - 128 ms",
|
||||
"128 - 256 ms",
|
||||
"256 - 512 ms",
|
||||
"512 - 1024 ms",
|
||||
">= 1.05 s"
|
||||
};
|
||||
|
||||
static const char *linear_bucket_names[NUM_LAT_BUCKETS] = {
|
||||
"< 100 us",
|
||||
"100 - 200 us",
|
||||
"200 - 300 us",
|
||||
"300 - 400 us",
|
||||
"400 - 500 us",
|
||||
"500 - 600 us",
|
||||
"600 - 700 us",
|
||||
"700 - 800 us",
|
||||
"800 - 900 us",
|
||||
"900 - 1000 us",
|
||||
"1.0 - 1.1 ms",
|
||||
"1.1 - 1.2 ms",
|
||||
"1.2 - 1.3 ms",
|
||||
"1.3 - 1.4 ms",
|
||||
"1.4 - 1.5 ms",
|
||||
"1.5 - 1.6 ms",
|
||||
"1.6 - 1.7 ms",
|
||||
"1.7 - 1.8 ms",
|
||||
"1.8 - 1.9 ms",
|
||||
"1.9 - 2.0 ms",
|
||||
"2.0 - 2.1 ms",
|
||||
">= 2.1 ms"
|
||||
};
|
||||
|
||||
struct perf_sched;
|
||||
static int latency_bucket(struct perf_sched *sched, u64 delta_ns);
|
||||
static void print_latency_histogram(struct perf_sched *sched, u64 *hist,
|
||||
u64 total_count, const char *title);
|
||||
|
||||
static const char *cpu_list;
|
||||
static struct perf_cpu_map *user_requested_cpus;
|
||||
static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
|
||||
@@ -124,6 +186,7 @@ struct work_atoms {
|
||||
u64 nb_atoms;
|
||||
u64 total_runtime;
|
||||
int num_merged;
|
||||
u64 hist[NUM_LAT_BUCKETS];
|
||||
};
|
||||
|
||||
typedef int (*sort_fn_t)(struct work_atoms *, struct work_atoms *);
|
||||
@@ -219,6 +282,10 @@ struct perf_sched {
|
||||
struct list_head sort_list, cmp_pid;
|
||||
bool force;
|
||||
bool skip_merge;
|
||||
bool show_histogram;
|
||||
enum hist_mode hist_mode;
|
||||
const char *hist_mode_str;
|
||||
u64 global_hist[NUM_LAT_BUCKETS];
|
||||
struct perf_sched_map map;
|
||||
|
||||
/* options for timehist command */
|
||||
@@ -246,6 +313,70 @@ struct perf_sched {
|
||||
struct perf_data *data;
|
||||
};
|
||||
|
||||
static int scnprintf_latency_unit(char *buf, size_t size, u64 nsecs)
|
||||
{
|
||||
if (nsecs < 1000)
|
||||
return scnprintf(buf, size, "%6" PRIu64 " ns", nsecs);
|
||||
if (nsecs < NSEC_PER_MSEC)
|
||||
return scnprintf(buf, size, "%6.3f us", (double)nsecs / NSEC_PER_USEC);
|
||||
if (nsecs < NSEC_PER_SEC)
|
||||
return scnprintf(buf, size, "%6.3f ms", (double)nsecs / NSEC_PER_MSEC);
|
||||
return scnprintf(buf, size, "%6.3f s ", (double)nsecs / NSEC_PER_SEC);
|
||||
}
|
||||
|
||||
static int latency_bucket(struct perf_sched *sched, u64 delta_ns)
|
||||
{
|
||||
u64 delta_us = delta_ns / NSEC_PER_USEC;
|
||||
u64 b;
|
||||
|
||||
if (sched->hist_mode == HIST_MODE_LINEAR) {
|
||||
b = delta_us / 100;
|
||||
} else {
|
||||
if (delta_us == 0)
|
||||
return 0;
|
||||
b = 64 - __builtin_clzll(delta_us);
|
||||
}
|
||||
|
||||
if (b >= NUM_LAT_BUCKETS - 1)
|
||||
return NUM_LAT_BUCKETS - 1;
|
||||
return b;
|
||||
}
|
||||
|
||||
static void print_latency_histogram(struct perf_sched *sched, u64 *hist,
|
||||
u64 total_count, const char *title)
|
||||
{
|
||||
const char **bucket_names = (sched->hist_mode == HIST_MODE_LINEAR) ?
|
||||
linear_bucket_names : lat_bucket_names;
|
||||
int bar_total = 40;
|
||||
char bar[] = "########################################";
|
||||
int i;
|
||||
|
||||
if (total_count == 0)
|
||||
return;
|
||||
|
||||
printf("\n %s (total samples: %" PRIu64 ")\n", title, total_count);
|
||||
printf(" -------------------------------------------------------------------\n");
|
||||
printf(" %-16s | %10s | %6s | %s\n",
|
||||
"Latency Range", "Count", "Pct", "Histogram Graph");
|
||||
printf(" -------------------------------------------------------------------\n");
|
||||
|
||||
for (i = 0; i < NUM_LAT_BUCKETS; i++) {
|
||||
double pct;
|
||||
int bar_len;
|
||||
|
||||
if (hist[i] == 0)
|
||||
continue;
|
||||
pct = (double)hist[i] * 100.0 / total_count;
|
||||
bar_len = (hist[i] * bar_total) / total_count;
|
||||
if (bar_len == 0 && hist[i] > 0)
|
||||
bar_len = 1;
|
||||
printf(" %-16s | %10" PRIu64 " | %5.1f%% | %.*s\n",
|
||||
bucket_names[i], hist[i], pct,
|
||||
bar_len, bar);
|
||||
}
|
||||
printf(" -------------------------------------------------------------------\n");
|
||||
}
|
||||
|
||||
/* per thread run time data */
|
||||
struct thread_runtime {
|
||||
u64 last_time; /* time of previous sched in/out event */
|
||||
@@ -1097,20 +1228,33 @@ add_sched_out_event(struct work_atoms *atoms,
|
||||
char run_state,
|
||||
u64 timestamp)
|
||||
{
|
||||
struct work_atom *atom = zalloc(sizeof(*atom));
|
||||
struct work_atom *atom = NULL;
|
||||
|
||||
if (!list_empty(&atoms->work_list)) {
|
||||
atom = list_entry(atoms->work_list.prev, struct work_atom, list);
|
||||
if (atom->state != THREAD_SCHED_IN)
|
||||
goto reuse;
|
||||
}
|
||||
|
||||
atom = zalloc(sizeof(*atom));
|
||||
if (!atom) {
|
||||
pr_err("Non memory at %s", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
list_add_tail(&atom->list, &atoms->work_list);
|
||||
|
||||
reuse:
|
||||
atom->sched_out_time = timestamp;
|
||||
|
||||
if (run_state == 'R') {
|
||||
atom->state = THREAD_WAIT_CPU;
|
||||
atom->wake_up_time = atom->sched_out_time;
|
||||
} else {
|
||||
atom->state = THREAD_SLEEPING;
|
||||
atom->wake_up_time = 0;
|
||||
}
|
||||
|
||||
list_add_tail(&atom->list, &atoms->work_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1129,10 +1273,12 @@ add_runtime_event(struct work_atoms *atoms, u64 delta,
|
||||
}
|
||||
|
||||
static void
|
||||
add_sched_in_event(struct work_atoms *atoms, u64 timestamp)
|
||||
add_sched_in_event(struct perf_sched *sched, struct work_atoms *atoms,
|
||||
u64 timestamp)
|
||||
{
|
||||
struct work_atom *atom;
|
||||
u64 delta;
|
||||
int b;
|
||||
|
||||
if (list_empty(&atoms->work_list))
|
||||
return;
|
||||
@@ -1147,6 +1293,9 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp)
|
||||
return;
|
||||
}
|
||||
|
||||
if (perf_time__skip_sample(&sched->ptime, timestamp))
|
||||
return;
|
||||
|
||||
atom->state = THREAD_SCHED_IN;
|
||||
atom->sched_in_time = timestamp;
|
||||
|
||||
@@ -1157,7 +1306,13 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp)
|
||||
atoms->max_lat_start = atom->wake_up_time;
|
||||
atoms->max_lat_end = timestamp;
|
||||
}
|
||||
|
||||
atoms->nb_atoms++;
|
||||
|
||||
b = latency_bucket(sched, delta);
|
||||
atoms->hist[b]++;
|
||||
if (thread__tid(atoms->thread) != 0)
|
||||
sched->global_hist[b]++;
|
||||
}
|
||||
|
||||
static void free_work_atoms(struct work_atoms *atoms)
|
||||
@@ -1241,7 +1396,7 @@ static int latency_switch_event(struct perf_sched *sched,
|
||||
if (add_sched_out_event(in_events, 'R', timestamp))
|
||||
goto out_put;
|
||||
}
|
||||
add_sched_in_event(in_events, timestamp);
|
||||
add_sched_in_event(sched, in_events, timestamp);
|
||||
err = 0;
|
||||
out_put:
|
||||
thread__put(sched_out);
|
||||
@@ -1255,11 +1410,15 @@ static int latency_runtime_event(struct perf_sched *sched,
|
||||
{
|
||||
const u32 pid = perf_sample__intval(sample, "pid");
|
||||
const u64 runtime = perf_sample__intval(sample, "runtime");
|
||||
struct thread *thread = machine__findnew_thread(machine, -1, pid);
|
||||
struct thread *thread;
|
||||
struct work_atoms *atoms;
|
||||
u64 timestamp = sample->time;
|
||||
int cpu = sample->cpu, err = -1;
|
||||
|
||||
if (perf_time__skip_sample(&sched->ptime, timestamp))
|
||||
return 0;
|
||||
|
||||
thread = machine__findnew_thread(machine, -1, pid);
|
||||
if (thread == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -1405,6 +1564,8 @@ static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_
|
||||
int i;
|
||||
int ret;
|
||||
u64 avg;
|
||||
char runtime_lat[32];
|
||||
char avg_lat[32], max_lat[32];
|
||||
char max_lat_start[32], max_lat_end[32];
|
||||
|
||||
if (!work_list->nb_atoms)
|
||||
@@ -1412,17 +1573,17 @@ static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_
|
||||
/*
|
||||
* Ignore idle threads:
|
||||
*/
|
||||
if (!strcmp(thread__comm_str(work_list->thread), "swapper"))
|
||||
if (thread__tid(work_list->thread) == 0)
|
||||
return;
|
||||
|
||||
sched->all_runtime += work_list->total_runtime;
|
||||
sched->all_count += work_list->nb_atoms;
|
||||
|
||||
if (work_list->num_merged > 1) {
|
||||
ret = printf(" %s:(%d) ", thread__comm_str(work_list->thread),
|
||||
ret = printf(" %s:(%d)", thread__comm_str(work_list->thread),
|
||||
work_list->num_merged);
|
||||
} else {
|
||||
ret = printf(" %s:%d ", thread__comm_str(work_list->thread),
|
||||
ret = printf(" %s:%d", thread__comm_str(work_list->thread),
|
||||
thread__tid(work_list->thread));
|
||||
}
|
||||
|
||||
@@ -1430,14 +1591,21 @@ static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_
|
||||
printf(" ");
|
||||
|
||||
avg = work_list->total_lat / work_list->nb_atoms;
|
||||
scnprintf_latency_unit(runtime_lat, sizeof(runtime_lat), work_list->total_runtime);
|
||||
scnprintf_latency_unit(avg_lat, sizeof(avg_lat), avg);
|
||||
scnprintf_latency_unit(max_lat, sizeof(max_lat), work_list->max_lat);
|
||||
timestamp__scnprintf_usec(work_list->max_lat_start, max_lat_start, sizeof(max_lat_start));
|
||||
timestamp__scnprintf_usec(work_list->max_lat_end, max_lat_end, sizeof(max_lat_end));
|
||||
|
||||
printf("|%11.3f ms |%9" PRIu64 " | avg:%8.3f ms | max:%8.3f ms | max start: %12s s | max end: %12s s\n",
|
||||
(double)work_list->total_runtime / NSEC_PER_MSEC,
|
||||
work_list->nb_atoms, (double)avg / NSEC_PER_MSEC,
|
||||
(double)work_list->max_lat / NSEC_PER_MSEC,
|
||||
max_lat_start, max_lat_end);
|
||||
printf(" |%15s |%9" PRIu64 " |%16s |%16s |%20s s |%20s s |\n",
|
||||
runtime_lat,
|
||||
work_list->nb_atoms, avg_lat, max_lat,
|
||||
max_lat_start, max_lat_end);
|
||||
|
||||
if (sched->show_histogram && verbose > 0)
|
||||
print_latency_histogram(sched, work_list->hist,
|
||||
work_list->nb_atoms,
|
||||
"Task Latency Histogram");
|
||||
}
|
||||
|
||||
static int pid_cmp(struct work_atoms *l, struct work_atoms *r)
|
||||
@@ -1581,12 +1749,6 @@ static int process_sched_wakeup_event(const struct perf_tool *tool,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int process_sched_wakeup_ignore(const struct perf_tool *tool __maybe_unused,
|
||||
struct perf_sample *sample __maybe_unused,
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool thread__has_color(struct thread *thread)
|
||||
{
|
||||
@@ -1833,7 +1995,7 @@ static int map_switch_event(struct perf_sched *sched, struct perf_sample *sampl
|
||||
sched_out:
|
||||
if (sched->map.task_name) {
|
||||
tr = thread__get_runtime(sched->curr_out_thread[this_cpu.cpu]);
|
||||
if (strcmp(tr->shortname, "") == 0)
|
||||
if (tr == NULL || strcmp(tr->shortname, "") == 0)
|
||||
goto out;
|
||||
|
||||
if (proceed == 1)
|
||||
@@ -1938,6 +2100,22 @@ typedef int (*tracepoint_handler)(const struct perf_tool *tool,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine);
|
||||
|
||||
static struct evsel_str_handler latency_handlers[] = {
|
||||
{ "sched:sched_switch", process_sched_switch_event, },
|
||||
{ "sched:sched_stat_runtime", process_sched_runtime_event, },
|
||||
{ "sched:sched_wakeup", process_sched_wakeup_event, },
|
||||
{ "sched:sched_waking", process_sched_wakeup_event, },
|
||||
{ "sched:sched_wakeup_new", process_sched_wakeup_event, },
|
||||
{ "sched:sched_migrate_task", process_sched_migrate_task_event, },
|
||||
};
|
||||
|
||||
static int process_sched_ignore(const struct perf_tool *tool __maybe_unused,
|
||||
struct perf_sample *sample __maybe_unused,
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int perf_sched__process_tracepoint_sample(const struct perf_tool *tool __maybe_unused,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample,
|
||||
@@ -1946,7 +2124,23 @@ static int perf_sched__process_tracepoint_sample(const struct perf_tool *tool __
|
||||
struct evsel *evsel = sample->evsel;
|
||||
int err = 0;
|
||||
|
||||
if (evsel->handler != NULL) {
|
||||
if (evsel->handler == NULL) {
|
||||
evsel->handler = process_sched_ignore;
|
||||
for (size_t i = 0; i < ARRAY_SIZE(latency_handlers); i++) {
|
||||
if (!evsel__name_is(evsel, latency_handlers[i].name))
|
||||
continue;
|
||||
|
||||
if (!strcmp(latency_handlers[i].name, "sched:sched_wakeup") &&
|
||||
sample->evsel->evlist &&
|
||||
evlist__find_tracepoint_by_name(sample->evsel->evlist, "sched:sched_waking"))
|
||||
break;
|
||||
|
||||
evsel->handler = latency_handlers[i].handler;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (evsel->handler != process_sched_ignore) {
|
||||
tracepoint_handler f = evsel->handler;
|
||||
err = f(tool, sample, machine);
|
||||
}
|
||||
@@ -1987,21 +2181,13 @@ static int perf_sched__process_comm(const struct perf_tool *tool __maybe_unused,
|
||||
|
||||
static int perf_sched__read_events(struct perf_sched *sched)
|
||||
{
|
||||
struct evsel_str_handler handlers[] = {
|
||||
{ "sched:sched_switch", process_sched_switch_event, },
|
||||
{ "sched:sched_stat_runtime", process_sched_runtime_event, },
|
||||
{ "sched:sched_wakeup", process_sched_wakeup_event, },
|
||||
{ "sched:sched_waking", process_sched_wakeup_event, },
|
||||
{ "sched:sched_wakeup_new", process_sched_wakeup_event, },
|
||||
{ "sched:sched_migrate_task", process_sched_migrate_task_event, },
|
||||
};
|
||||
struct perf_session *session;
|
||||
struct perf_data data = {
|
||||
.path = input_name,
|
||||
.mode = PERF_DATA_MODE_READ,
|
||||
.force = sched->force,
|
||||
};
|
||||
int rc = -1;
|
||||
int rc = -1, err;
|
||||
|
||||
session = perf_session__new(&data, &sched->tool);
|
||||
if (IS_ERR(session)) {
|
||||
@@ -2011,25 +2197,34 @@ static int perf_sched__read_events(struct perf_sched *sched)
|
||||
|
||||
symbol__init(perf_session__env(session));
|
||||
|
||||
/* prefer sched_waking if it is captured */
|
||||
if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"))
|
||||
handlers[2].handler = process_sched_wakeup_ignore;
|
||||
if (!perf_data__is_pipe(session->data)) {
|
||||
/* prefer sched_waking if it is captured */
|
||||
if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"))
|
||||
latency_handlers[2].handler = process_sched_ignore;
|
||||
|
||||
if (perf_session__set_tracepoints_handlers(session, handlers))
|
||||
if (perf_session__set_tracepoints_handlers(session, latency_handlers))
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
if (!perf_data__is_pipe(session->data) &&
|
||||
!perf_session__has_traces(session, "record -R"))
|
||||
goto out_delete;
|
||||
|
||||
if (perf_session__has_traces(session, "record -R")) {
|
||||
int err = perf_session__process_events(session);
|
||||
if (err) {
|
||||
pr_err("Failed to process events, error %d", err);
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
sched->nr_events = session->evlist->stats.nr_events[0];
|
||||
sched->nr_lost_events = session->evlist->stats.total_lost;
|
||||
sched->nr_lost_chunks = session->evlist->stats.nr_events[PERF_RECORD_LOST];
|
||||
err = perf_session__process_events(session);
|
||||
if (err) {
|
||||
pr_err("Failed to process events, error %d", err);
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
if (perf_data__is_pipe(session->data) &&
|
||||
!perf_session__has_traces(session, "record -R")) {
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
sched->nr_events = evlist__stats(session->evlist)->nr_events[0];
|
||||
sched->nr_lost_events = evlist__stats(session->evlist)->total_lost;
|
||||
sched->nr_lost_chunks = evlist__stats(session->evlist)->nr_events[PERF_RECORD_LOST];
|
||||
|
||||
rc = 0;
|
||||
out_delete:
|
||||
perf_session__delete(session);
|
||||
@@ -2270,12 +2465,6 @@ static void timehist_print_sample(struct perf_sched *sched,
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
if (!thread__comm_set(thread)) {
|
||||
const char *prev_comm = perf_sample__strval(sample, "prev_comm");
|
||||
|
||||
thread__set_comm(thread, prev_comm, sample->time);
|
||||
}
|
||||
|
||||
printf(" %-*s ", comm_width, timehist_get_commstr(thread));
|
||||
|
||||
if (sched->show_prio)
|
||||
@@ -2981,6 +3170,16 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
|
||||
thread__zput(itr->last_thread);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the process name is not set for the thread, use "prev_comm"
|
||||
* to set it. Otherwise the sched summary will have just pid information
|
||||
*/
|
||||
if (!thread__comm_set(thread)) {
|
||||
const char *prev_comm = perf_sample__strval(sample, "prev_comm");
|
||||
|
||||
thread__set_comm(thread, prev_comm, sample->time);
|
||||
}
|
||||
|
||||
if (!sched->summary_only)
|
||||
timehist_print_sample(sched, sample, &al, thread, t, state);
|
||||
}
|
||||
@@ -3303,7 +3502,7 @@ static int timehist_check_attr(struct perf_sched *sched,
|
||||
struct evsel *evsel;
|
||||
struct evsel_runtime *er;
|
||||
|
||||
list_for_each_entry(evsel, &evlist->core.entries, core.node) {
|
||||
list_for_each_entry(evsel, &evlist__core(evlist)->entries, core.node) {
|
||||
er = evsel__get_runtime(evsel);
|
||||
if (er == NULL) {
|
||||
pr_err("Failed to allocate memory for evsel runtime data\n");
|
||||
@@ -3475,9 +3674,9 @@ static int perf_sched__timehist(struct perf_sched *sched)
|
||||
goto out;
|
||||
}
|
||||
|
||||
sched->nr_events = evlist->stats.nr_events[0];
|
||||
sched->nr_lost_events = evlist->stats.total_lost;
|
||||
sched->nr_lost_chunks = evlist->stats.nr_events[PERF_RECORD_LOST];
|
||||
sched->nr_events = evlist__stats(evlist)->nr_events[0];
|
||||
sched->nr_lost_events = evlist__stats(evlist)->total_lost;
|
||||
sched->nr_lost_chunks = evlist__stats(evlist)->nr_events[PERF_RECORD_LOST];
|
||||
|
||||
if (sched->summary)
|
||||
timehist_print_summary(sched, session);
|
||||
@@ -3543,6 +3742,8 @@ static void __merge_work_atoms(struct rb_root_cached *root, struct work_atoms *d
|
||||
this->max_lat_start = data->max_lat_start;
|
||||
this->max_lat_end = data->max_lat_end;
|
||||
}
|
||||
for (int i = 0; i < NUM_LAT_BUCKETS; i++)
|
||||
this->hist[i] += data->hist[i];
|
||||
free_work_atoms(data);
|
||||
return;
|
||||
}
|
||||
@@ -3598,9 +3799,28 @@ static int perf_sched__lat(struct perf_sched *sched)
|
||||
{
|
||||
int rc = -1;
|
||||
struct rb_node *next;
|
||||
char total_runtime_str[32];
|
||||
|
||||
setup_pager();
|
||||
|
||||
if (sched->hist_mode_str) {
|
||||
sched->show_histogram = true;
|
||||
if (!strcmp(sched->hist_mode_str, "linear"))
|
||||
sched->hist_mode = HIST_MODE_LINEAR;
|
||||
else if (!strcmp(sched->hist_mode_str, "log"))
|
||||
sched->hist_mode = HIST_MODE_LOG;
|
||||
else {
|
||||
pr_err("Invalid --hist-mode '%s', expected 'log' or 'linear'\n",
|
||||
sched->hist_mode_str);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sched->time_str && perf_time__parse_str(&sched->ptime, sched->time_str) != 0) {
|
||||
pr_err("Invalid time string\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (setup_cpus_switch_event(sched))
|
||||
return rc;
|
||||
|
||||
@@ -3610,9 +3830,24 @@ static int perf_sched__lat(struct perf_sched *sched)
|
||||
perf_sched__merge_lat(sched);
|
||||
perf_sched__sort_lat(sched);
|
||||
|
||||
printf("\n -------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
printf(" Task | Runtime ms | Count | Avg delay ms | Max delay ms | Max delay start | Max delay end |\n");
|
||||
printf(" -------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
next = rb_first_cached(&sched->sorted_atom_root);
|
||||
while (next) {
|
||||
struct work_atoms *work_list = rb_entry(next, struct work_atoms, node);
|
||||
|
||||
if (work_list->nb_atoms && thread__tid(work_list->thread) != 0)
|
||||
break;
|
||||
next = rb_next(next);
|
||||
}
|
||||
|
||||
if (!next) {
|
||||
pr_info("No matching trace samples found.\n");
|
||||
rc = 0;
|
||||
goto out_free_atoms;
|
||||
}
|
||||
|
||||
printf("\n ------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
printf(" Task | Runtime | Count | Avg delay | Max delay | Max delay start | Max delay end |\n");
|
||||
printf(" ------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
|
||||
next = rb_first_cached(&sched->sorted_atom_root);
|
||||
|
||||
@@ -3624,17 +3859,23 @@ static int perf_sched__lat(struct perf_sched *sched)
|
||||
next = rb_next(next);
|
||||
}
|
||||
|
||||
printf(" -----------------------------------------------------------------------------------------------------------------\n");
|
||||
printf(" TOTAL: |%11.3f ms |%9" PRIu64 " |\n",
|
||||
(double)sched->all_runtime / NSEC_PER_MSEC, sched->all_count);
|
||||
printf(" ------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
scnprintf_latency_unit(total_runtime_str, sizeof(total_runtime_str), sched->all_runtime);
|
||||
printf(" TOTAL: |%15s |%9" PRIu64 " |\n",
|
||||
total_runtime_str, sched->all_count);
|
||||
|
||||
printf(" ---------------------------------------------------\n");
|
||||
printf(" ------------------------------------------------------\n");
|
||||
|
||||
print_bad_events(sched);
|
||||
printf("\n");
|
||||
|
||||
if (sched->show_histogram)
|
||||
print_latency_histogram(sched, sched->global_hist, sched->all_count,
|
||||
"CPU Wait Latency Distribution Histogram (between snapshots)");
|
||||
|
||||
rc = 0;
|
||||
|
||||
out_free_atoms:
|
||||
while ((next = rb_first_cached(&sched->sorted_atom_root))) {
|
||||
struct work_atoms *data;
|
||||
|
||||
@@ -3924,7 +4165,7 @@ static int perf_sched__schedstat_record(struct perf_sched *sched,
|
||||
session = perf_session__new(&data, &sched->tool);
|
||||
if (IS_ERR(session)) {
|
||||
pr_err("Perf session creation failed.\n");
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
return PTR_ERR(session);
|
||||
}
|
||||
|
||||
@@ -3982,7 +4223,7 @@ static int perf_sched__schedstat_record(struct perf_sched *sched,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
user_requested_cpus = evlist->core.user_requested_cpus;
|
||||
user_requested_cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
|
||||
err = perf_event__synthesize_schedstat(&(sched->tool),
|
||||
process_synthesized_schedstat_event,
|
||||
@@ -3998,7 +4239,7 @@ static int perf_sched__schedstat_record(struct perf_sched *sched,
|
||||
evlist__start_workload(evlist);
|
||||
|
||||
while (!done) {
|
||||
if (argc && waitpid(evlist->workload.pid, NULL, WNOHANG) > 0)
|
||||
if (argc && waitpid(evlist__workload_pid(evlist), NULL, WNOHANG) > 0)
|
||||
break;
|
||||
sleep(1);
|
||||
}
|
||||
@@ -4023,8 +4264,8 @@ static int perf_sched__schedstat_record(struct perf_sched *sched,
|
||||
else
|
||||
fprintf(stderr, "[ perf sched stats: Failed !! ]\n");
|
||||
|
||||
evlist__delete(evlist);
|
||||
close(fd);
|
||||
perf_session__delete(session);
|
||||
evlist__put(evlist);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -4627,6 +4868,8 @@ static int perf_sched__process_schedstat(const struct perf_tool *tool __maybe_un
|
||||
domain_second_pass = list_first_entry(&cpu_second_pass->domain_head,
|
||||
struct schedstat_domain, domain_list);
|
||||
store_schedstat_cpu_diff(temp);
|
||||
free(temp->cpu_data);
|
||||
free(temp);
|
||||
}
|
||||
} else if (event->header.type == PERF_RECORD_SCHEDSTAT_DOMAIN) {
|
||||
struct schedstat_cpu *cpu_tail;
|
||||
@@ -4647,6 +4890,8 @@ static int perf_sched__process_schedstat(const struct perf_tool *tool __maybe_un
|
||||
} else {
|
||||
store_schedstat_domain_diff(temp);
|
||||
domain_second_pass = list_next_entry(domain_second_pass, domain_list);
|
||||
free(temp->domain_data);
|
||||
free(temp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4699,7 +4944,7 @@ static int perf_sched__schedstat_report(struct perf_sched *sched)
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
user_requested_cpus = session->evlist->core.user_requested_cpus;
|
||||
user_requested_cpus = evlist__core(session->evlist)->user_requested_cpus;
|
||||
|
||||
err = perf_session__process_events(session);
|
||||
|
||||
@@ -4875,7 +5120,7 @@ static int perf_sched__schedstat_live(struct perf_sched *sched,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
user_requested_cpus = evlist->core.user_requested_cpus;
|
||||
user_requested_cpus = evlist__core(evlist)->user_requested_cpus;
|
||||
|
||||
err = perf_event__synthesize_schedstat(&(sched->tool),
|
||||
process_synthesized_event_live,
|
||||
@@ -4891,7 +5136,7 @@ static int perf_sched__schedstat_live(struct perf_sched *sched,
|
||||
evlist__start_workload(evlist);
|
||||
|
||||
while (!done) {
|
||||
if (argc && waitpid(evlist->workload.pid, NULL, WNOHANG) > 0)
|
||||
if (argc && waitpid(evlist__workload_pid(evlist), NULL, WNOHANG) > 0)
|
||||
break;
|
||||
sleep(1);
|
||||
}
|
||||
@@ -4927,7 +5172,7 @@ static int perf_sched__schedstat_live(struct perf_sched *sched,
|
||||
free_cpu_domain_info(cd_map, sv, nr);
|
||||
out:
|
||||
free_schedstat(&cpu_head);
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -5051,6 +5296,12 @@ int cmd_sched(int argc, const char **argv)
|
||||
"CPU to profile on"),
|
||||
OPT_BOOLEAN('p', "pids", &sched.skip_merge,
|
||||
"latency stats per pid instead of per comm"),
|
||||
OPT_BOOLEAN('H', "histogram", &sched.show_histogram,
|
||||
"show CPU wait latency distribution histogram"),
|
||||
OPT_STRING(0, "hist-mode", &sched.hist_mode_str, "log|linear",
|
||||
"latency bucket mode (log or linear, default: log)"),
|
||||
OPT_STRING(0, "time", &sched.time_str, "str",
|
||||
"Time span for analysis (start,stop)"),
|
||||
OPT_PARENT(sched_options)
|
||||
};
|
||||
const struct option replay_options[] = {
|
||||
@@ -5167,6 +5418,10 @@ int cmd_sched(int argc, const char **argv)
|
||||
sched.tool.namespaces = perf_event__process_namespaces;
|
||||
sched.tool.lost = perf_event__process_lost;
|
||||
sched.tool.fork = perf_sched__process_fork_event;
|
||||
sched.tool.attr = perf_event__process_attr;
|
||||
sched.tool.tracing_data = perf_event__process_tracing_data;
|
||||
sched.tool.build_id = perf_event__process_build_id;
|
||||
sched.tool.feature = perf_event__process_feature;
|
||||
|
||||
argc = parse_options_subcommand(argc, argv, sched_options, sched_subcommands,
|
||||
sched_usage, PARSE_OPT_STOP_AT_NON_OPTION);
|
||||
@@ -5251,19 +5506,20 @@ int cmd_sched(int argc, const char **argv)
|
||||
if (argc)
|
||||
argc = parse_options(argc, argv, stats_options,
|
||||
stats_usage, 0);
|
||||
return perf_sched__schedstat_record(&sched, argc, argv);
|
||||
ret = perf_sched__schedstat_record(&sched, argc, argv);
|
||||
} else if (argv[0] && !strcmp(argv[0], "report")) {
|
||||
if (argc)
|
||||
argc = parse_options(argc, argv, stats_options,
|
||||
stats_usage, 0);
|
||||
return perf_sched__schedstat_report(&sched);
|
||||
ret = perf_sched__schedstat_report(&sched);
|
||||
} else if (argv[0] && !strcmp(argv[0], "diff")) {
|
||||
if (argc)
|
||||
argc = parse_options(argc, argv, stats_options,
|
||||
stats_usage, 0);
|
||||
return perf_sched__schedstat_diff(&sched, argc, argv);
|
||||
ret = perf_sched__schedstat_diff(&sched, argc, argv);
|
||||
} else {
|
||||
ret = perf_sched__schedstat_live(&sched, argc, argv);
|
||||
}
|
||||
return perf_sched__schedstat_live(&sched, argc, argv);
|
||||
} else {
|
||||
usage_with_options(sched_usage, sched_options);
|
||||
}
|
||||
|
||||
@@ -2174,6 +2174,7 @@ static int script_find_metrics(const struct pmu_metric *pm,
|
||||
struct evsel *metric_evsel;
|
||||
int ret = metricgroup__parse_groups(metric_evlist,
|
||||
/*pmu=*/"all",
|
||||
/*cputype_filter=*/false,
|
||||
pm->metric_name,
|
||||
/*metric_no_group=*/false,
|
||||
/*metric_no_merge=*/false,
|
||||
@@ -2229,9 +2230,10 @@ static int script_find_metrics(const struct pmu_metric *pm,
|
||||
evlist__for_each_entry(metric_evlist, metric_evsel) {
|
||||
struct evsel *script_evsel =
|
||||
map_metric_evsel_to_script_evsel(script_evlist, metric_evsel);
|
||||
struct metric_event *metric_me = metricgroup__lookup(&metric_evlist->metric_events,
|
||||
metric_evsel,
|
||||
/*create=*/false);
|
||||
struct metric_event *metric_me =
|
||||
metricgroup__lookup(evlist__metric_events(metric_evlist),
|
||||
metric_evsel,
|
||||
/*create=*/false);
|
||||
|
||||
if (script_evsel->metric_id == NULL) {
|
||||
script_evsel->metric_id = metric_evsel->metric_id;
|
||||
@@ -2251,7 +2253,7 @@ static int script_find_metrics(const struct pmu_metric *pm,
|
||||
if (metric_me) {
|
||||
struct metric_expr *expr;
|
||||
struct metric_event *script_me =
|
||||
metricgroup__lookup(&script_evlist->metric_events,
|
||||
metricgroup__lookup(evlist__metric_events(script_evlist),
|
||||
script_evsel,
|
||||
/*create=*/true);
|
||||
|
||||
@@ -2274,8 +2276,8 @@ static int script_find_metrics(const struct pmu_metric *pm,
|
||||
}
|
||||
pr_debug("Found metric '%s' whose evsels match those of in the perf data\n",
|
||||
pm->metric_name);
|
||||
evlist__delete(metric_evlist);
|
||||
out:
|
||||
evlist__put(metric_evlist);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2321,7 +2323,7 @@ static void perf_sample__fprint_metric(struct thread *thread,
|
||||
assert(stat_config.aggr_mode == AGGR_GLOBAL);
|
||||
stat_config.aggr_get_id = script_aggr_cpu_id_get;
|
||||
stat_config.aggr_map =
|
||||
cpu_aggr_map__new(evsel->evlist->core.user_requested_cpus,
|
||||
cpu_aggr_map__new(evlist__core(evsel->evlist)->user_requested_cpus,
|
||||
aggr_cpu_id__global, /*data=*/NULL,
|
||||
/*needs_sort=*/false);
|
||||
}
|
||||
@@ -3909,7 +3911,7 @@ static int set_maps(struct perf_script *script)
|
||||
if (WARN_ONCE(script->allocated, "stats double allocation\n"))
|
||||
return -EINVAL;
|
||||
|
||||
perf_evlist__set_maps(&evlist->core, script->cpus, script->threads);
|
||||
perf_evlist__set_maps(evlist__core(evlist), script->cpus, script->threads);
|
||||
|
||||
if (evlist__alloc_stats(&stat_config, evlist, /*alloc_raw=*/true))
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -321,7 +321,7 @@ static int read_single_counter(struct evsel *counter, int cpu_map_idx, int threa
|
||||
*/
|
||||
static int read_counter_cpu(struct evsel *counter, int cpu_map_idx)
|
||||
{
|
||||
int nthreads = perf_thread_map__nr(evsel_list->core.threads);
|
||||
int nthreads = perf_thread_map__nr(evlist__core(evsel_list)->threads);
|
||||
int thread;
|
||||
|
||||
if (!counter->supported)
|
||||
@@ -628,11 +628,12 @@ static int dispatch_events(bool forks, int timeout, int interval, int *times)
|
||||
time_to_sleep = sleep_time;
|
||||
|
||||
while (!done) {
|
||||
if (forks)
|
||||
if (forks) {
|
||||
child_exited = waitpid(child_pid, &status, WNOHANG);
|
||||
else
|
||||
child_exited = !is_target_alive(&target, evsel_list->core.threads) ? 1 : 0;
|
||||
|
||||
} else {
|
||||
child_exited = !is_target_alive(&target,
|
||||
evlist__core(evsel_list)->threads) ? 1 : 0;
|
||||
}
|
||||
if (child_exited)
|
||||
break;
|
||||
|
||||
@@ -681,14 +682,15 @@ static enum counter_recovery stat_handle_error(struct evsel *counter, int err)
|
||||
return COUNTER_RETRY;
|
||||
}
|
||||
if (target__has_per_thread(&target) && err != EOPNOTSUPP &&
|
||||
evsel_list->core.threads && evsel_list->core.threads->err_thread != -1) {
|
||||
evlist__core(evsel_list)->threads &&
|
||||
evlist__core(evsel_list)->threads->err_thread != -1) {
|
||||
/*
|
||||
* For global --per-thread case, skip current
|
||||
* error thread.
|
||||
*/
|
||||
if (!thread_map__remove(evsel_list->core.threads,
|
||||
evsel_list->core.threads->err_thread)) {
|
||||
evsel_list->core.threads->err_thread = -1;
|
||||
if (!thread_map__remove(evlist__core(evsel_list)->threads,
|
||||
evlist__core(evsel_list)->threads->err_thread)) {
|
||||
evlist__core(evsel_list)->threads->err_thread = -1;
|
||||
counter->supported = true;
|
||||
return COUNTER_RETRY;
|
||||
}
|
||||
@@ -787,11 +789,12 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
|
||||
bool second_pass = false, has_supported_counters;
|
||||
|
||||
if (forks) {
|
||||
if (evlist__prepare_workload(evsel_list, &target, argv, is_pipe, workload_exec_failed_signal) < 0) {
|
||||
if (evlist__prepare_workload(evsel_list, &target, argv, is_pipe,
|
||||
workload_exec_failed_signal) < 0) {
|
||||
perror("failed to prepare workload");
|
||||
return -1;
|
||||
}
|
||||
child_pid = evsel_list->workload.pid;
|
||||
child_pid = evlist__workload_pid(evsel_list);
|
||||
}
|
||||
|
||||
evlist__for_each_entry(evsel_list, counter) {
|
||||
@@ -1199,7 +1202,7 @@ static int parse_cputype(const struct option *opt,
|
||||
const struct perf_pmu *pmu;
|
||||
struct evlist *evlist = *(struct evlist **)opt->value;
|
||||
|
||||
if (!list_empty(&evlist->core.entries)) {
|
||||
if (!list_empty(&evlist__core(evlist)->entries)) {
|
||||
fprintf(stderr, "Must define cputype before events/metrics\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -1210,6 +1213,7 @@ static int parse_cputype(const struct option *opt,
|
||||
return -1;
|
||||
}
|
||||
parse_events_option_args.pmu_filter = pmu->name;
|
||||
parse_events_option_args.cputype_filter = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1220,12 +1224,13 @@ static int parse_pmu_filter(const struct option *opt,
|
||||
{
|
||||
struct evlist *evlist = *(struct evlist **)opt->value;
|
||||
|
||||
if (!list_empty(&evlist->core.entries)) {
|
||||
if (!list_empty(&evlist__core(evlist)->entries)) {
|
||||
fprintf(stderr, "Must define pmu-filter before events/metrics\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
parse_events_option_args.pmu_filter = str;
|
||||
parse_events_option_args.cputype_filter = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1586,8 +1591,9 @@ static int perf_stat_init_aggr_mode(void)
|
||||
|
||||
if (get_id) {
|
||||
bool needs_sort = stat_config.aggr_mode != AGGR_NONE;
|
||||
stat_config.aggr_map = cpu_aggr_map__new(evsel_list->core.user_requested_cpus,
|
||||
get_id, /*data=*/NULL, needs_sort);
|
||||
stat_config.aggr_map = cpu_aggr_map__new(
|
||||
evlist__core(evsel_list)->user_requested_cpus,
|
||||
get_id, /*data=*/NULL, needs_sort);
|
||||
if (!stat_config.aggr_map) {
|
||||
pr_err("cannot build %s map\n", aggr_mode__string[stat_config.aggr_mode]);
|
||||
return -1;
|
||||
@@ -1596,7 +1602,7 @@ static int perf_stat_init_aggr_mode(void)
|
||||
}
|
||||
|
||||
if (stat_config.aggr_mode == AGGR_THREAD) {
|
||||
nr = perf_thread_map__nr(evsel_list->core.threads);
|
||||
nr = perf_thread_map__nr(evlist__core(evsel_list)->threads);
|
||||
stat_config.aggr_map = cpu_aggr_map__empty_new(nr);
|
||||
if (stat_config.aggr_map == NULL)
|
||||
return -ENOMEM;
|
||||
@@ -1615,7 +1621,7 @@ static int perf_stat_init_aggr_mode(void)
|
||||
* taking the highest cpu number to be the size of
|
||||
* the aggregation translate cpumap.
|
||||
*/
|
||||
nr = perf_cpu_map__max(evsel_list->core.all_cpus).cpu + 1;
|
||||
nr = perf_cpu_map__max(evlist__core(evsel_list)->all_cpus).cpu + 1;
|
||||
stat_config.cpus_aggr_map = cpu_aggr_map__empty_new(nr);
|
||||
return stat_config.cpus_aggr_map ? 0 : -ENOMEM;
|
||||
}
|
||||
@@ -1902,7 +1908,7 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
|
||||
bool needs_sort = stat_config.aggr_mode != AGGR_NONE;
|
||||
|
||||
if (stat_config.aggr_mode == AGGR_THREAD) {
|
||||
int nr = perf_thread_map__nr(evsel_list->core.threads);
|
||||
int nr = perf_thread_map__nr(evlist__core(evsel_list)->threads);
|
||||
|
||||
stat_config.aggr_map = cpu_aggr_map__empty_new(nr);
|
||||
if (stat_config.aggr_map == NULL)
|
||||
@@ -1920,7 +1926,7 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
|
||||
if (!get_id)
|
||||
return 0;
|
||||
|
||||
stat_config.aggr_map = cpu_aggr_map__new(evsel_list->core.user_requested_cpus,
|
||||
stat_config.aggr_map = cpu_aggr_map__new(evlist__core(evsel_list)->user_requested_cpus,
|
||||
get_id, env, needs_sort);
|
||||
if (!stat_config.aggr_map) {
|
||||
pr_err("cannot build %s map\n", aggr_mode__string[stat_config.aggr_mode]);
|
||||
@@ -1999,7 +2005,9 @@ static int add_default_events(void)
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
ret = metricgroup__parse_groups(evlist, pmu, "transaction",
|
||||
ret = metricgroup__parse_groups(evlist, pmu,
|
||||
parse_events_option_args.cputype_filter,
|
||||
"transaction",
|
||||
stat_config.metric_no_group,
|
||||
stat_config.metric_no_merge,
|
||||
stat_config.metric_no_threshold,
|
||||
@@ -2036,7 +2044,9 @@ static int add_default_events(void)
|
||||
if (!force_metric_only)
|
||||
stat_config.metric_only = true;
|
||||
|
||||
ret = metricgroup__parse_groups(evlist, pmu, "smi",
|
||||
ret = metricgroup__parse_groups(evlist, pmu,
|
||||
parse_events_option_args.cputype_filter,
|
||||
"smi",
|
||||
stat_config.metric_no_group,
|
||||
stat_config.metric_no_merge,
|
||||
stat_config.metric_no_threshold,
|
||||
@@ -2073,7 +2083,7 @@ static int add_default_events(void)
|
||||
}
|
||||
str[8] = stat_config.topdown_level + '0';
|
||||
if (metricgroup__parse_groups(evlist,
|
||||
pmu, str,
|
||||
pmu, parse_events_option_args.cputype_filter, str,
|
||||
/*metric_no_group=*/false,
|
||||
/*metric_no_merge=*/false,
|
||||
/*metric_no_threshold=*/true,
|
||||
@@ -2088,7 +2098,7 @@ static int add_default_events(void)
|
||||
if (!stat_config.topdown_level)
|
||||
stat_config.topdown_level = 1;
|
||||
|
||||
if (!evlist->core.nr_entries && !evsel_list->core.nr_entries) {
|
||||
if (!evlist__nr_entries(evlist) && !evlist__nr_entries(evsel_list)) {
|
||||
/*
|
||||
* Add Default metrics. To minimize multiplexing, don't request
|
||||
* threshold computation, but it will be computed if the events
|
||||
@@ -2112,14 +2122,16 @@ static int add_default_events(void)
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
if (metricgroup__parse_groups(metric_evlist, pmu, default_metricgroup_names[i],
|
||||
if (metricgroup__parse_groups(metric_evlist, pmu,
|
||||
parse_events_option_args.cputype_filter,
|
||||
default_metricgroup_names[i],
|
||||
/*metric_no_group=*/false,
|
||||
/*metric_no_merge=*/false,
|
||||
/*metric_no_threshold=*/true,
|
||||
stat_config.user_requested_cpu_list,
|
||||
stat_config.system_wide,
|
||||
stat_config.hardware_aware_grouping) < 0) {
|
||||
evlist__delete(metric_evlist);
|
||||
evlist__put(metric_evlist);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
@@ -2127,13 +2139,13 @@ static int add_default_events(void)
|
||||
evlist__for_each_entry(metric_evlist, evsel)
|
||||
evsel->default_metricgroup = true;
|
||||
|
||||
evlist__splice_list_tail(evlist, &metric_evlist->core.entries);
|
||||
evlist__splice_list_tail(evlist, &evlist__core(metric_evlist)->entries);
|
||||
metricgroup__copy_metric_events(evlist, /*cgrp=*/NULL,
|
||||
&evlist->metric_events,
|
||||
&metric_evlist->metric_events);
|
||||
evlist__delete(metric_evlist);
|
||||
evlist__metric_events(evlist),
|
||||
evlist__metric_events(metric_evlist));
|
||||
evlist__put(metric_evlist);
|
||||
}
|
||||
list_sort(/*priv=*/NULL, &evlist->core.entries, default_evlist_evsel_cmp);
|
||||
list_sort(/*priv=*/NULL, &evlist__core(evlist)->entries, default_evlist_evsel_cmp);
|
||||
|
||||
}
|
||||
out:
|
||||
@@ -2148,11 +2160,11 @@ static int add_default_events(void)
|
||||
}
|
||||
}
|
||||
parse_events_error__exit(&err);
|
||||
evlist__splice_list_tail(evsel_list, &evlist->core.entries);
|
||||
evlist__splice_list_tail(evsel_list, &evlist__core(evlist)->entries);
|
||||
metricgroup__copy_metric_events(evsel_list, /*cgrp=*/NULL,
|
||||
&evsel_list->metric_events,
|
||||
&evlist->metric_events);
|
||||
evlist__delete(evlist);
|
||||
evlist__metric_events(evsel_list),
|
||||
evlist__metric_events(evlist));
|
||||
evlist__put(evlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2272,7 +2284,7 @@ static int set_maps(struct perf_stat *st)
|
||||
if (WARN_ONCE(st->maps_allocated, "stats double allocation\n"))
|
||||
return -EINVAL;
|
||||
|
||||
perf_evlist__set_maps(&evsel_list->core, st->cpus, st->threads);
|
||||
perf_evlist__set_maps(evlist__core(evsel_list), st->cpus, st->threads);
|
||||
|
||||
if (evlist__alloc_stats(&stat_config, evsel_list, /*alloc_raw=*/true))
|
||||
return -ENOMEM;
|
||||
@@ -2387,7 +2399,7 @@ static int __cmd_report(int argc, const char **argv)
|
||||
|
||||
perf_stat.session = session;
|
||||
stat_config.output = stderr;
|
||||
evlist__delete(evsel_list);
|
||||
evlist__put(evsel_list);
|
||||
evsel_list = session->evlist;
|
||||
|
||||
ret = perf_session__process_events(session);
|
||||
@@ -2424,7 +2436,7 @@ static void setup_system_wide(int forks)
|
||||
}
|
||||
}
|
||||
|
||||
if (evsel_list->core.nr_entries)
|
||||
if (evlist__nr_entries(evsel_list))
|
||||
target.system_wide = true;
|
||||
}
|
||||
}
|
||||
@@ -2493,6 +2505,8 @@ int cmd_stat(int argc, const char **argv)
|
||||
"display details about each run (only with -r option)"),
|
||||
OPT_BOOLEAN('n', "null", &stat_config.null_run,
|
||||
"null run - dont start any counters"),
|
||||
OPT_BOOLEAN(0, "hide-zero-events", &stat_config.hide_zero,
|
||||
"Do not show events with a zero count"),
|
||||
OPT_INCR('d', "detailed", &detailed_run,
|
||||
"detailed run - start a lot of events"),
|
||||
OPT_BOOLEAN('S', "sync", &sync_run,
|
||||
@@ -2643,6 +2657,13 @@ int cmd_stat(int argc, const char **argv)
|
||||
|
||||
stat_config.aggr_mode = opt_aggr_mode_to_aggr_mode(&opt_mode);
|
||||
|
||||
if (stat_config.csv_sep && stat_config.json_output) {
|
||||
fprintf(stderr, "cannot use both --field-separator and --json-output\n");
|
||||
parse_options_usage(stat_usage, stat_options, "x", 1);
|
||||
parse_options_usage(NULL, stat_options, "j", 1);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (stat_config.csv_sep) {
|
||||
stat_config.csv_output = true;
|
||||
if (!strcmp(stat_config.csv_sep, "\\t"))
|
||||
@@ -2651,7 +2672,7 @@ int cmd_stat(int argc, const char **argv)
|
||||
stat_config.csv_sep = DEFAULT_SEPARATOR;
|
||||
|
||||
if (affinity_set)
|
||||
evsel_list->no_affinity = !affinity;
|
||||
evlist__set_no_affinity(evsel_list, !affinity);
|
||||
|
||||
if (argc && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
|
||||
argc = __cmd_record(stat_options, &opt_mode, argc, argv);
|
||||
@@ -2714,7 +2735,8 @@ int cmd_stat(int argc, const char **argv)
|
||||
output = fopen(output_name, mode);
|
||||
if (!output) {
|
||||
perror("failed to create output file");
|
||||
return -1;
|
||||
status = -1;
|
||||
goto out;
|
||||
}
|
||||
if (!stat_config.json_output) {
|
||||
clock_gettime(CLOCK_REALTIME, &tm);
|
||||
@@ -2725,7 +2747,8 @@ int cmd_stat(int argc, const char **argv)
|
||||
output = fdopen(output_fd, mode);
|
||||
if (!output) {
|
||||
perror("Failed opening logfd");
|
||||
return -errno;
|
||||
status = -errno;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2734,7 +2757,8 @@ int cmd_stat(int argc, const char **argv)
|
||||
parse_options_usage(stat_usage, stat_options, "o", 1);
|
||||
parse_options_usage(NULL, stat_options, "log-fd", 0);
|
||||
parse_options_usage(NULL, stat_options, "interval-clear", 0);
|
||||
return -1;
|
||||
status = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
stat_config.output = output;
|
||||
@@ -2818,7 +2842,7 @@ int cmd_stat(int argc, const char **argv)
|
||||
}
|
||||
|
||||
if (stat_config.iostat_run) {
|
||||
status = iostat_prepare(evsel_list, &stat_config);
|
||||
status = iostat_prepare(&evsel_list, &stat_config);
|
||||
if (status)
|
||||
goto out;
|
||||
if (iostat_mode == IOSTAT_LIST) {
|
||||
@@ -2848,7 +2872,9 @@ int cmd_stat(int argc, const char **argv)
|
||||
*/
|
||||
if (metrics) {
|
||||
const char *pmu = parse_events_option_args.pmu_filter ?: "all";
|
||||
int ret = metricgroup__parse_groups(evsel_list, pmu, metrics,
|
||||
int ret = metricgroup__parse_groups(evsel_list, pmu,
|
||||
parse_events_option_args.cputype_filter,
|
||||
metrics,
|
||||
stat_config.metric_no_group,
|
||||
stat_config.metric_no_merge,
|
||||
stat_config.metric_no_threshold,
|
||||
@@ -2874,7 +2900,8 @@ int cmd_stat(int argc, const char **argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (evlist__expand_cgroup(evsel_list, stat_config.cgroup_list, true) < 0) {
|
||||
if (evlist__expand_cgroup(evsel_list, stat_config.cgroup_list,
|
||||
!target.use_bpf) < 0) {
|
||||
parse_options_usage(stat_usage, stat_options,
|
||||
"for-each-cgroup", 0);
|
||||
goto out;
|
||||
@@ -2882,9 +2909,10 @@ int cmd_stat(int argc, const char **argv)
|
||||
}
|
||||
#ifdef HAVE_BPF_SKEL
|
||||
if (target.use_bpf && nr_cgroups &&
|
||||
(evsel_list->core.nr_entries / nr_cgroups) > BPERF_CGROUP__MAX_EVENTS) {
|
||||
(evlist__nr_entries(evsel_list) / nr_cgroups) > BPERF_CGROUP__MAX_EVENTS) {
|
||||
pr_warning("Disabling BPF counters due to more events (%d) than the max (%d)\n",
|
||||
evsel_list->core.nr_entries / nr_cgroups, BPERF_CGROUP__MAX_EVENTS);
|
||||
evlist__nr_entries(evsel_list) / nr_cgroups,
|
||||
BPERF_CGROUP__MAX_EVENTS);
|
||||
target.use_bpf = false;
|
||||
}
|
||||
#endif // HAVE_BPF_SKEL
|
||||
@@ -2922,7 +2950,7 @@ int cmd_stat(int argc, const char **argv)
|
||||
* so we could print it out on output.
|
||||
*/
|
||||
if (stat_config.aggr_mode == AGGR_THREAD) {
|
||||
thread_map__read_comms(evsel_list->core.threads);
|
||||
thread_map__read_comms(evlist__core(evsel_list)->threads);
|
||||
}
|
||||
|
||||
if (stat_config.aggr_mode == AGGR_NODE)
|
||||
@@ -3066,7 +3094,7 @@ int cmd_stat(int argc, const char **argv)
|
||||
if (smi_cost && smi_reset)
|
||||
sysfs__write_int(FREEZE_ON_SMI_PATH, 0);
|
||||
|
||||
evlist__delete(evsel_list);
|
||||
evlist__put(evsel_list);
|
||||
|
||||
evlist__close_control(stat_config.ctl_fd, stat_config.ctl_fd_ack, &stat_config.ctl_fd_close);
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ struct timechart {
|
||||
struct per_pid *all_data;
|
||||
struct power_event *power_events;
|
||||
struct wake_event *wake_events;
|
||||
struct perf_session *session;
|
||||
int proc_num;
|
||||
unsigned int numcpus;
|
||||
u64 min_freq, /* Lowest CPU frequency seen */
|
||||
@@ -299,7 +300,7 @@ static void pid_put_sample(struct timechart *tchart, int pid, int type,
|
||||
sample->type = type;
|
||||
sample->next = c->samples;
|
||||
sample->cpu = cpu;
|
||||
sample->backtrace = backtrace ? strdup(backtrace) : NULL;
|
||||
sample->backtrace = backtrace;
|
||||
c->samples = sample;
|
||||
|
||||
if (sample->type == TYPE_RUNNING && end > start && start > 0) {
|
||||
@@ -428,12 +429,14 @@ static void sched_wakeup(struct timechart *tchart, int cpu, u64 timestamp,
|
||||
struct per_pid *p;
|
||||
struct wake_event *we = zalloc(sizeof(*we));
|
||||
|
||||
if (!we)
|
||||
if (!we) {
|
||||
free((char *)backtrace);
|
||||
return;
|
||||
}
|
||||
|
||||
we->time = timestamp;
|
||||
we->waker = waker;
|
||||
we->backtrace = backtrace ? strdup(backtrace) : NULL;
|
||||
we->backtrace = backtrace;
|
||||
|
||||
if ((flags & TRACE_FLAG_HARDIRQ) || (flags & TRACE_FLAG_SOFTIRQ))
|
||||
we->waker = -1;
|
||||
@@ -460,20 +463,28 @@ static void sched_switch(struct timechart *tchart, int cpu, u64 timestamp,
|
||||
const char *backtrace)
|
||||
{
|
||||
struct per_pid *p = NULL, *prev_p;
|
||||
bool backtrace_used = false;
|
||||
|
||||
prev_p = find_create_pid(tchart, prev_pid);
|
||||
|
||||
p = find_create_pid(tchart, next_pid);
|
||||
|
||||
if (prev_p->current && prev_p->current->state != TYPE_NONE)
|
||||
if (prev_p->current && prev_p->current->state != TYPE_NONE) {
|
||||
pid_put_sample(tchart, prev_pid, TYPE_RUNNING, cpu,
|
||||
prev_p->current->state_since, timestamp,
|
||||
backtrace);
|
||||
backtrace_used = true;
|
||||
}
|
||||
if (p && p->current) {
|
||||
if (p->current->state != TYPE_NONE)
|
||||
if (p->current->state != TYPE_NONE) {
|
||||
if (backtrace && backtrace_used)
|
||||
backtrace = strdup(backtrace);
|
||||
|
||||
pid_put_sample(tchart, next_pid, p->current->state, cpu,
|
||||
p->current->state_since, timestamp,
|
||||
backtrace);
|
||||
backtrace_used = true;
|
||||
}
|
||||
|
||||
p->current->state_since = timestamp;
|
||||
p->current->state = TYPE_RUNNING;
|
||||
@@ -487,14 +498,16 @@ static void sched_switch(struct timechart *tchart, int cpu, u64 timestamp,
|
||||
if (prev_state == 0)
|
||||
prev_p->current->state = TYPE_WAITING;
|
||||
}
|
||||
|
||||
if (!backtrace_used)
|
||||
free((char *)backtrace);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a malloc'd backtrace string built via open_memstream, or NULL
|
||||
* on error. Caller must free() the returned pointer.
|
||||
*/
|
||||
static char *cat_backtrace(union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
static char *cat_backtrace(struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
{
|
||||
struct addr_location al;
|
||||
@@ -516,9 +529,8 @@ static char *cat_backtrace(union perf_event *event,
|
||||
goto exit;
|
||||
|
||||
if (machine__resolve(machine, &al, sample) < 0) {
|
||||
pr_err("problem processing %s (%u) event at offset %#" PRIx64 ", skipping it.\n",
|
||||
perf_event__name(event->header.type), event->header.type,
|
||||
sample->file_offset);
|
||||
pr_err("problem processing SAMPLE (%u) event at offset %#" PRIx64 ", skipping it.\n",
|
||||
PERF_RECORD_SAMPLE, sample->file_offset);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -574,13 +586,12 @@ static char *cat_backtrace(union perf_event *event,
|
||||
}
|
||||
|
||||
typedef int (*tracepoint_handler)(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace);
|
||||
struct perf_sample *sample);
|
||||
|
||||
static int process_sample_event(const struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
struct timechart *tchart = container_of(tool, struct timechart, tool);
|
||||
struct evsel *evsel = sample->evsel;
|
||||
@@ -595,10 +606,8 @@ static int process_sample_event(const struct perf_tool *tool,
|
||||
|
||||
if (evsel->handler != NULL) {
|
||||
tracepoint_handler f = evsel->handler;
|
||||
char *backtrace = cat_backtrace(event, sample, machine);
|
||||
|
||||
ret = f(tchart, sample, backtrace);
|
||||
free(backtrace);
|
||||
ret = f(tchart, sample);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -606,8 +615,7 @@ static int process_sample_event(const struct perf_tool *tool,
|
||||
|
||||
static int
|
||||
process_sample_cpu_idle(struct timechart *tchart __maybe_unused,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
u32 state = perf_sample__intval(sample, "state");
|
||||
u32 cpu_id = perf_sample__intval(sample, "cpu_id");
|
||||
@@ -627,8 +635,7 @@ process_sample_cpu_idle(struct timechart *tchart __maybe_unused,
|
||||
|
||||
static int
|
||||
process_sample_cpu_frequency(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
u32 state = perf_sample__intval(sample, "state");
|
||||
u32 cpu_id = perf_sample__intval(sample, "cpu_id");
|
||||
@@ -645,12 +652,12 @@ process_sample_cpu_frequency(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_sample_sched_wakeup(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
u8 flags = perf_sample__intval(sample, "common_flags");
|
||||
int waker = perf_sample__intval(sample, "common_pid");
|
||||
int wakee = perf_sample__intval(sample, "pid");
|
||||
char *backtrace;
|
||||
|
||||
/* perf.data is untrusted input — CPU may be absent or corrupted */
|
||||
if (sample->cpu >= MAX_CPUS) {
|
||||
@@ -658,18 +665,20 @@ process_sample_sched_wakeup(struct timechart *tchart,
|
||||
sample->file_offset, sample->cpu);
|
||||
return -1;
|
||||
}
|
||||
|
||||
backtrace = cat_backtrace(sample, &tchart->session->machines.host);
|
||||
sched_wakeup(tchart, sample->cpu, sample->time, waker, wakee, flags, backtrace);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
process_sample_sched_switch(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
int prev_pid = perf_sample__intval(sample, "prev_pid");
|
||||
int next_pid = perf_sample__intval(sample, "next_pid");
|
||||
u64 prev_state = perf_sample__intval(sample, "prev_state");
|
||||
char *backtrace;
|
||||
|
||||
/* perf.data is untrusted input — CPU may be absent or corrupted */
|
||||
if (sample->cpu >= MAX_CPUS) {
|
||||
@@ -677,6 +686,8 @@ process_sample_sched_switch(struct timechart *tchart,
|
||||
sample->file_offset, sample->cpu);
|
||||
return -1;
|
||||
}
|
||||
|
||||
backtrace = cat_backtrace(sample, &tchart->session->machines.host);
|
||||
sched_switch(tchart, sample->cpu, sample->time, prev_pid, next_pid,
|
||||
prev_state, backtrace);
|
||||
return 0;
|
||||
@@ -685,8 +696,7 @@ process_sample_sched_switch(struct timechart *tchart,
|
||||
#ifdef SUPPORT_OLD_POWER_EVENTS
|
||||
static int
|
||||
process_sample_power_start(struct timechart *tchart __maybe_unused,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
u64 cpu_id = perf_sample__intval(sample, "cpu_id");
|
||||
u64 value = perf_sample__intval(sample, "value");
|
||||
@@ -703,8 +713,7 @@ process_sample_power_start(struct timechart *tchart __maybe_unused,
|
||||
|
||||
static int
|
||||
process_sample_power_end(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
/* perf.data is untrusted input — CPU may be absent or corrupted */
|
||||
if (sample->cpu >= MAX_CPUS) {
|
||||
@@ -718,8 +727,7 @@ process_sample_power_end(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_sample_power_frequency(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
u64 cpu_id = perf_sample__intval(sample, "cpu_id");
|
||||
u64 value = perf_sample__intval(sample, "value");
|
||||
@@ -892,8 +900,7 @@ static int pid_end_io_sample(struct timechart *tchart, int pid, int type,
|
||||
|
||||
static int
|
||||
process_enter_read(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_READ,
|
||||
@@ -902,8 +909,7 @@ process_enter_read(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_read(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_READ,
|
||||
@@ -912,8 +918,7 @@ process_exit_read(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_enter_write(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_WRITE,
|
||||
@@ -922,8 +927,7 @@ process_enter_write(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_write(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_WRITE,
|
||||
@@ -932,8 +936,7 @@ process_exit_write(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_enter_sync(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_SYNC,
|
||||
@@ -942,8 +945,7 @@ process_enter_sync(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_sync(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_SYNC,
|
||||
@@ -952,8 +954,7 @@ process_exit_sync(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_enter_tx(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_TX,
|
||||
@@ -962,8 +963,7 @@ process_enter_tx(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_tx(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_TX,
|
||||
@@ -972,8 +972,7 @@ process_exit_tx(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_enter_rx(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_RX,
|
||||
@@ -982,8 +981,7 @@ process_enter_rx(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_rx(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_RX,
|
||||
@@ -992,8 +990,7 @@ process_exit_rx(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_enter_poll(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long fd = perf_sample__intval(sample, "fd");
|
||||
return pid_begin_io_sample(tchart, sample->tid, IOTYPE_POLL,
|
||||
@@ -1002,8 +999,7 @@ process_enter_poll(struct timechart *tchart,
|
||||
|
||||
static int
|
||||
process_exit_poll(struct timechart *tchart,
|
||||
struct perf_sample *sample,
|
||||
const char *backtrace __maybe_unused)
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
long ret = perf_sample__intval(sample, "ret");
|
||||
return pid_end_io_sample(tchart, sample->tid, IOTYPE_POLL,
|
||||
@@ -1114,12 +1110,12 @@ static void draw_wakeups(struct timechart *tchart)
|
||||
c = c->next;
|
||||
}
|
||||
c = p->all;
|
||||
while (c) {
|
||||
if (p->pid == we->waker && !from) {
|
||||
while (c && (!from || !to)) {
|
||||
if (c->Y && p->pid == we->waker && !from) {
|
||||
from = c->Y;
|
||||
task_from = strdup(c->comm);
|
||||
}
|
||||
if (p->pid == we->wakee && !to) {
|
||||
if (c->Y && p->pid == we->wakee && !to) {
|
||||
to = c->Y;
|
||||
task_to = strdup(c->comm);
|
||||
}
|
||||
@@ -1552,6 +1548,73 @@ static void write_svg_file(struct timechart *tchart, const char *filename)
|
||||
svg_close();
|
||||
}
|
||||
|
||||
static void timechart__release(struct timechart *tchart)
|
||||
{
|
||||
struct per_pid *p = tchart->all_data;
|
||||
struct power_event *pwr = tchart->power_events;
|
||||
struct wake_event *we = tchart->wake_events;
|
||||
|
||||
while (p) {
|
||||
struct per_pid *next_pid = p->next;
|
||||
struct per_pidcomm *c = p->all;
|
||||
|
||||
while (c) {
|
||||
struct per_pidcomm *next_comm = c->next;
|
||||
struct cpu_sample *cs = c->samples;
|
||||
struct io_sample *ios = c->io_samples;
|
||||
|
||||
while (cs) {
|
||||
struct cpu_sample *next = cs->next;
|
||||
|
||||
zfree(&cs->backtrace);
|
||||
cs->next = NULL;
|
||||
free(cs);
|
||||
|
||||
cs = next;
|
||||
}
|
||||
|
||||
while (ios) {
|
||||
struct io_sample *next = ios->next;
|
||||
|
||||
ios->next = NULL;
|
||||
free(ios);
|
||||
|
||||
ios = next;
|
||||
}
|
||||
|
||||
zfree(&c->comm);
|
||||
c->next = NULL;
|
||||
free(c);
|
||||
|
||||
c = next_comm;
|
||||
}
|
||||
|
||||
p->next = NULL;
|
||||
free(p);
|
||||
|
||||
p = next_pid;
|
||||
}
|
||||
|
||||
while (pwr) {
|
||||
struct power_event *next = pwr->next;
|
||||
|
||||
pwr->next = NULL;
|
||||
free(pwr);
|
||||
|
||||
pwr = next;
|
||||
}
|
||||
|
||||
while (we) {
|
||||
struct wake_event *next = we->next;
|
||||
|
||||
zfree(&we->backtrace);
|
||||
we->next = NULL;
|
||||
free(we);
|
||||
|
||||
we = next;
|
||||
}
|
||||
}
|
||||
|
||||
static int process_header(struct perf_file_section *section __maybe_unused,
|
||||
struct perf_header *ph,
|
||||
int feat,
|
||||
@@ -1663,6 +1726,7 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name)
|
||||
if (IS_ERR(session))
|
||||
return PTR_ERR(session);
|
||||
|
||||
tchart->session = session;
|
||||
symbol__init(perf_session__env(session));
|
||||
|
||||
(void)perf_header__process_sections(&session->header,
|
||||
@@ -1770,6 +1834,7 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
"syscalls:sys_exit_select",
|
||||
};
|
||||
unsigned int poll_events_nr = ARRAY_SIZE(poll_events);
|
||||
int ret;
|
||||
|
||||
rec_argc = common_args_nr +
|
||||
disk_events_nr * 4 +
|
||||
@@ -1788,7 +1853,7 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
|
||||
p = rec_argv;
|
||||
for (i = 0; i < common_args_nr; i++)
|
||||
*p++ = strdup(common_args[i]);
|
||||
*p++ = common_args[i];
|
||||
|
||||
for (i = 0; i < disk_events_nr; i++) {
|
||||
if (!is_valid_tracepoint(disk_events[i])) {
|
||||
@@ -1797,7 +1862,7 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
}
|
||||
|
||||
*p++ = "-e";
|
||||
*p++ = strdup(disk_events[i]);
|
||||
*p++ = disk_events[i];
|
||||
*p++ = "--filter";
|
||||
*p++ = filter;
|
||||
}
|
||||
@@ -1808,7 +1873,7 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
}
|
||||
|
||||
*p++ = "-e";
|
||||
*p++ = strdup(net_events[i]);
|
||||
*p++ = net_events[i];
|
||||
*p++ = "--filter";
|
||||
*p++ = filter;
|
||||
}
|
||||
@@ -1819,7 +1884,7 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
}
|
||||
|
||||
*p++ = "-e";
|
||||
*p++ = strdup(poll_events[i]);
|
||||
*p++ = poll_events[i];
|
||||
*p++ = "--filter";
|
||||
*p++ = filter;
|
||||
}
|
||||
@@ -1827,7 +1892,11 @@ static int timechart__io_record(int argc, const char **argv, const char *output_
|
||||
for (i = 0; i < (unsigned int)argc; i++)
|
||||
*p++ = argv[i];
|
||||
|
||||
return cmd_record(rec_argc, rec_argv);
|
||||
ret = cmd_record(rec_argc, rec_argv);
|
||||
|
||||
free(rec_argv);
|
||||
free(filter);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1838,6 +1907,7 @@ static int timechart__record(struct timechart *tchart, int argc, const char **ar
|
||||
const char **rec_argv;
|
||||
const char **p;
|
||||
unsigned int record_elems;
|
||||
int ret;
|
||||
|
||||
const char * const common_args[] = {
|
||||
"record", "-a", "-R", "-c", "1", "-o", output_data,
|
||||
@@ -1902,24 +1972,27 @@ static int timechart__record(struct timechart *tchart, int argc, const char **ar
|
||||
|
||||
p = rec_argv;
|
||||
for (i = 0; i < common_args_nr; i++)
|
||||
*p++ = strdup(common_args[i]);
|
||||
*p++ = common_args[i];
|
||||
|
||||
for (i = 0; i < backtrace_args_no; i++)
|
||||
*p++ = strdup(backtrace_args[i]);
|
||||
*p++ = backtrace_args[i];
|
||||
|
||||
for (i = 0; i < tasks_args_nr; i++)
|
||||
*p++ = strdup(tasks_args[i]);
|
||||
*p++ = tasks_args[i];
|
||||
|
||||
for (i = 0; i < power_args_nr; i++)
|
||||
*p++ = strdup(power_args[i]);
|
||||
*p++ = power_args[i];
|
||||
|
||||
for (i = 0; i < old_power_args_nr; i++)
|
||||
*p++ = strdup(old_power_args[i]);
|
||||
*p++ = old_power_args[i];
|
||||
|
||||
for (j = 0; j < (unsigned int)argc; j++)
|
||||
*p++ = argv[j];
|
||||
|
||||
return cmd_record(rec_argc, rec_argv);
|
||||
ret = cmd_record(rec_argc, rec_argv);
|
||||
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -2082,6 +2155,7 @@ int cmd_timechart(int argc, const char **argv)
|
||||
|
||||
ret = __cmd_timechart(&tchart, output_name);
|
||||
out:
|
||||
timechart__release(&tchart);
|
||||
zfree(&cpus_cstate_start_times);
|
||||
zfree(&cpus_cstate_state);
|
||||
zfree(&cpus_pstate_start_times);
|
||||
|
||||
@@ -141,7 +141,7 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
|
||||
notes = symbol__annotation(sym);
|
||||
annotation__lock(notes);
|
||||
|
||||
if (!symbol__hists(sym, top->evlist->core.nr_entries)) {
|
||||
if (!symbol__hists(sym, evlist__nr_entries(top->evlist))) {
|
||||
annotation__unlock(notes);
|
||||
pr_err("Not enough memory for annotating '%s' symbol!\n",
|
||||
sym->name);
|
||||
@@ -267,7 +267,7 @@ static void perf_top__show_details(struct perf_top *top)
|
||||
|
||||
more = hist_entry__annotate_printf(he, top->sym_evsel);
|
||||
|
||||
if (top->evlist->enabled) {
|
||||
if (evlist__enabled(top->evlist)) {
|
||||
if (top->zero)
|
||||
symbol__annotate_zero_histogram(symbol, top->sym_evsel);
|
||||
else
|
||||
@@ -293,7 +293,7 @@ static void perf_top__resort_hists(struct perf_top *t)
|
||||
*/
|
||||
hists__unlink(hists);
|
||||
|
||||
if (evlist->enabled) {
|
||||
if (evlist__enabled(evlist)) {
|
||||
if (t->zero) {
|
||||
hists__delete_entries(hists);
|
||||
} else {
|
||||
@@ -334,13 +334,13 @@ static void perf_top__print_sym_table(struct perf_top *top)
|
||||
printf("%-*.*s\n", win_width, win_width, graph_dotted_line);
|
||||
|
||||
if (!top->record_opts.overwrite &&
|
||||
(top->evlist->stats.nr_lost_warned !=
|
||||
top->evlist->stats.nr_events[PERF_RECORD_LOST])) {
|
||||
top->evlist->stats.nr_lost_warned =
|
||||
top->evlist->stats.nr_events[PERF_RECORD_LOST];
|
||||
(evlist__stats(top->evlist)->nr_lost_warned !=
|
||||
evlist__stats(top->evlist)->nr_events[PERF_RECORD_LOST])) {
|
||||
evlist__stats(top->evlist)->nr_lost_warned =
|
||||
evlist__stats(top->evlist)->nr_events[PERF_RECORD_LOST];
|
||||
color_fprintf(stdout, PERF_COLOR_RED,
|
||||
"WARNING: LOST %d chunks, Check IO/CPU overload",
|
||||
top->evlist->stats.nr_lost_warned);
|
||||
evlist__stats(top->evlist)->nr_lost_warned);
|
||||
++printed;
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ static void perf_top__print_mapped_keys(struct perf_top *top)
|
||||
fprintf(stdout, "\t[d] display refresh delay. \t(%d)\n", top->delay_secs);
|
||||
fprintf(stdout, "\t[e] display entries (lines). \t(%d)\n", top->print_entries);
|
||||
|
||||
if (top->evlist->core.nr_entries > 1)
|
||||
if (evlist__nr_entries(top->evlist) > 1)
|
||||
fprintf(stdout, "\t[E] active event counter. \t(%s)\n", evsel__name(top->sym_evsel));
|
||||
|
||||
fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", top->count_filter);
|
||||
@@ -482,7 +482,7 @@ static int perf_top__key_mapped(struct perf_top *top, int c)
|
||||
case 'S':
|
||||
return 1;
|
||||
case 'E':
|
||||
return top->evlist->core.nr_entries > 1 ? 1 : 0;
|
||||
return evlist__nr_entries(top->evlist) > 1 ? 1 : 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -528,7 +528,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
||||
}
|
||||
break;
|
||||
case 'E':
|
||||
if (top->evlist->core.nr_entries > 1) {
|
||||
if (evlist__nr_entries(top->evlist) > 1) {
|
||||
/* Select 0 as the default event: */
|
||||
int counter = 0;
|
||||
|
||||
@@ -539,7 +539,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
||||
|
||||
prompt_integer(&counter, "Enter details event counter");
|
||||
|
||||
if (counter >= top->evlist->core.nr_entries) {
|
||||
if (counter >= evlist__nr_entries(top->evlist)) {
|
||||
top->sym_evsel = evlist__first(top->evlist);
|
||||
fprintf(stderr, "Sorry, no such event, using %s.\n", evsel__name(top->sym_evsel));
|
||||
sleep(1);
|
||||
@@ -598,8 +598,8 @@ static void perf_top__sort_new_samples(void *arg)
|
||||
{
|
||||
struct perf_top *t = arg;
|
||||
|
||||
if (t->evlist->selected != NULL)
|
||||
t->sym_evsel = t->evlist->selected;
|
||||
if (evlist__selected(t->evlist) != NULL)
|
||||
t->sym_evsel = evlist__selected(t->evlist);
|
||||
|
||||
perf_top__resort_hists(t);
|
||||
|
||||
@@ -766,7 +766,7 @@ static void perf_event__process_sample(const struct perf_tool *tool,
|
||||
|
||||
if (!machine) {
|
||||
pr_err("%u unprocessable samples recorded.\r",
|
||||
top->session->evlist->stats.nr_unprocessable_samples++);
|
||||
evlist__stats(top->session->evlist)->nr_unprocessable_samples++);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -859,7 +859,7 @@ perf_top__process_lost(struct perf_top *top, union perf_event *event,
|
||||
{
|
||||
top->lost += event->lost.lost;
|
||||
top->lost_total += event->lost.lost;
|
||||
evsel->evlist->stats.total_lost += event->lost.lost;
|
||||
evlist__stats(evsel->evlist)->total_lost += event->lost.lost;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -869,7 +869,7 @@ perf_top__process_lost_samples(struct perf_top *top,
|
||||
{
|
||||
top->lost += event->lost_samples.lost;
|
||||
top->lost_total += event->lost_samples.lost;
|
||||
evsel->evlist->stats.total_lost_samples += event->lost_samples.lost;
|
||||
evlist__stats(evsel->evlist)->total_lost_samples += event->lost_samples.lost;
|
||||
}
|
||||
|
||||
static u64 last_timestamp;
|
||||
@@ -881,7 +881,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
|
||||
struct mmap *md;
|
||||
union perf_event *event;
|
||||
|
||||
md = opts->overwrite ? &evlist->overwrite_mmap[idx] : &evlist->mmap[idx];
|
||||
md = opts->overwrite ? &evlist__overwrite_mmap(evlist)[idx] : &evlist__mmap(evlist)[idx];
|
||||
if (perf_mmap__read_init(&md->core) < 0)
|
||||
return;
|
||||
|
||||
@@ -918,7 +918,7 @@ static void perf_top__mmap_read(struct perf_top *top)
|
||||
if (overwrite)
|
||||
evlist__toggle_bkw_mmap(evlist, BKW_MMAP_DATA_PENDING);
|
||||
|
||||
for (i = 0; i < top->evlist->core.nr_mmaps; i++)
|
||||
for (i = 0; i < evlist__core(top->evlist)->nr_mmaps; i++)
|
||||
perf_top__mmap_read_idx(top, i);
|
||||
|
||||
if (overwrite) {
|
||||
@@ -1063,7 +1063,7 @@ static int perf_top__start_counters(struct perf_top *top)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (evlist__mmap(evlist, opts->mmap_pages) < 0) {
|
||||
if (evlist__do_mmap(evlist, opts->mmap_pages) < 0) {
|
||||
ui__error("Failed to mmap with %d (%s)\n",
|
||||
errno, str_error_r(errno, msg, sizeof(msg)));
|
||||
goto out_err;
|
||||
@@ -1218,10 +1218,10 @@ static int deliver_event(struct ordered_events *qe,
|
||||
} else if (event->header.type == PERF_RECORD_LOST_SAMPLES) {
|
||||
perf_top__process_lost_samples(top, event, evsel);
|
||||
} else if (event->header.type < PERF_RECORD_MAX) {
|
||||
events_stats__inc(&session->evlist->stats, event->header.type);
|
||||
events_stats__inc(evlist__stats(session->evlist), event->header.type);
|
||||
machine__process_event(machine, event, &sample);
|
||||
} else
|
||||
++session->evlist->stats.nr_unknown_events;
|
||||
++evlist__stats(session->evlist)->nr_unknown_events;
|
||||
|
||||
ret = 0;
|
||||
next_event:
|
||||
@@ -1296,7 +1296,7 @@ static int __cmd_top(struct perf_top *top)
|
||||
pr_debug("Couldn't synthesize cgroup events.\n");
|
||||
|
||||
machine__synthesize_threads(&top->session->machines.host, &opts->target,
|
||||
top->evlist->core.threads, true, false,
|
||||
evlist__core(top->evlist)->threads, true, false,
|
||||
top->nr_threads_synthesize);
|
||||
|
||||
perf_set_multithreaded();
|
||||
@@ -1652,14 +1652,14 @@ int cmd_top(int argc, const char **argv)
|
||||
perf_env__init(&host_env);
|
||||
status = perf_config(perf_top_config, &top);
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
/*
|
||||
* Since the per arch annotation init routine may need the cpuid, read
|
||||
* it here, since we are not getting this from the perf.data header.
|
||||
*/
|
||||
status = perf_env__set_cmdline(&host_env, argc, argv);
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
status = perf_env__read_cpuid(&host_env);
|
||||
if (status) {
|
||||
@@ -1680,30 +1680,30 @@ int cmd_top(int argc, const char **argv)
|
||||
annotate_opts.disassembler_style = strdup(disassembler_style);
|
||||
if (!annotate_opts.disassembler_style) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
if (objdump_path) {
|
||||
annotate_opts.objdump_path = strdup(objdump_path);
|
||||
if (!annotate_opts.objdump_path) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
if (addr2line_path) {
|
||||
symbol_conf.addr2line_path = strdup(addr2line_path);
|
||||
if (!symbol_conf.addr2line_path) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
|
||||
status = symbol__validate_sym_arguments();
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
if (annotate_check_args() < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
status = target__validate(target);
|
||||
if (status) {
|
||||
@@ -1714,19 +1714,19 @@ int cmd_top(int argc, const char **argv)
|
||||
if (target__none(target))
|
||||
target->system_wide = true;
|
||||
|
||||
if (!top.evlist->core.nr_entries) {
|
||||
if (!evlist__nr_entries(top.evlist)) {
|
||||
struct evlist *def_evlist = evlist__new_default(target, callchain_param.enabled);
|
||||
|
||||
if (!def_evlist)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
evlist__splice_list_tail(top.evlist, &def_evlist->core.entries);
|
||||
evlist__delete(def_evlist);
|
||||
evlist__splice_list_tail(top.evlist, &evlist__core(def_evlist)->entries);
|
||||
evlist__put(def_evlist);
|
||||
}
|
||||
|
||||
status = evswitch__init(&top.evswitch, top.evlist, stderr);
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
if (symbol_conf.report_hierarchy) {
|
||||
/* disable incompatible options */
|
||||
@@ -1737,18 +1737,18 @@ int cmd_top(int argc, const char **argv)
|
||||
pr_err("Error: --hierarchy and --fields options cannot be used together\n");
|
||||
parse_options_usage(top_usage, options, "fields", 0);
|
||||
parse_options_usage(NULL, options, "hierarchy", 0);
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
|
||||
if (top.stitch_lbr && !(callchain_param.record_mode == CALLCHAIN_LBR)) {
|
||||
pr_err("Error: --stitch-lbr must be used with --call-graph lbr\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (nr_cgroups > 0 && opts->record_cgroup) {
|
||||
pr_err("--cgroup and --all-cgroups cannot be used together\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (branch_call_mode) {
|
||||
@@ -1772,7 +1772,7 @@ int cmd_top(int argc, const char **argv)
|
||||
status = perf_env__read_core_pmu_caps(&host_env);
|
||||
if (status) {
|
||||
pr_err("PMU capability data is not available\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1795,9 +1795,9 @@ int cmd_top(int argc, const char **argv)
|
||||
if (IS_ERR(top.session)) {
|
||||
status = PTR_ERR(top.session);
|
||||
top.session = NULL;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
top.evlist->session = top.session;
|
||||
evlist__set_session(top.evlist, top.session);
|
||||
|
||||
if (setup_sorting(top.evlist, perf_session__env(top.session)) < 0) {
|
||||
if (sort_order)
|
||||
@@ -1805,7 +1805,7 @@ int cmd_top(int argc, const char **argv)
|
||||
if (field_order)
|
||||
parse_options_usage(sort_order ? NULL : top_usage,
|
||||
options, "fields", 0);
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (top.uid_str) {
|
||||
@@ -1814,18 +1814,18 @@ int cmd_top(int argc, const char **argv)
|
||||
if (uid == UINT_MAX) {
|
||||
ui__error("Invalid User: %s", top.uid_str);
|
||||
status = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
status = parse_uid_filter(top.evlist, uid);
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (evlist__create_maps(top.evlist, target) < 0) {
|
||||
ui__error("Couldn't create thread/CPU maps: %s\n",
|
||||
errno == ENOENT ? "No such process" : str_error_r(errno, errbuf, sizeof(errbuf)));
|
||||
status = -errno;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (top.delay_secs < 1)
|
||||
@@ -1833,7 +1833,7 @@ int cmd_top(int argc, const char **argv)
|
||||
|
||||
if (record_opts__config(opts)) {
|
||||
status = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
top.sym_evsel = evlist__first(top.evlist);
|
||||
@@ -1848,14 +1848,14 @@ int cmd_top(int argc, const char **argv)
|
||||
|
||||
status = symbol__annotation_init();
|
||||
if (status < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
annotation_config__init();
|
||||
|
||||
symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);
|
||||
status = symbol__init(NULL);
|
||||
if (status < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
sort__setup_elide(stdout);
|
||||
|
||||
@@ -1875,13 +1875,15 @@ int cmd_top(int argc, const char **argv)
|
||||
if (top.sb_evlist == NULL) {
|
||||
pr_err("Couldn't create side band evlist.\n.");
|
||||
status = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (evlist__add_bpf_sb_event(top.sb_evlist, &host_env)) {
|
||||
pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
|
||||
status = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
evlist__put(top.sb_evlist);
|
||||
top.sb_evlist = NULL;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1896,8 +1898,8 @@ int cmd_top(int argc, const char **argv)
|
||||
if (!opts->no_bpf_event)
|
||||
evlist__stop_sb_thread(top.sb_evlist);
|
||||
|
||||
out_delete_evlist:
|
||||
evlist__delete(top.evlist);
|
||||
out_put_evlist:
|
||||
evlist__put(top.evlist);
|
||||
perf_session__delete(top.session);
|
||||
annotation_options__exit();
|
||||
perf_env__exit(&host_env);
|
||||
|
||||
@@ -226,6 +226,7 @@ struct trace {
|
||||
bool force;
|
||||
bool vfs_getname;
|
||||
bool force_btf;
|
||||
bool bitmask_list;
|
||||
bool summary_bpf;
|
||||
int trace_pgfaults;
|
||||
char *perfconfig_events;
|
||||
@@ -460,10 +461,10 @@ static int evsel__init_tp_ptr_field(struct evsel *evsel, struct tp_field *field,
|
||||
({ struct syscall_tp *sc = __evsel__syscall_tp(evsel);\
|
||||
evsel__init_tp_ptr_field(evsel, &sc->name, #name); })
|
||||
|
||||
static void evsel__delete_priv(struct evsel *evsel)
|
||||
static void evsel__put_and_free_priv(struct evsel *evsel)
|
||||
{
|
||||
zfree(&evsel->priv);
|
||||
evsel__delete(evsel);
|
||||
evsel__put(evsel);
|
||||
}
|
||||
|
||||
static int evsel__init_syscall_tp(struct evsel *evsel)
|
||||
@@ -543,7 +544,7 @@ static struct evsel *perf_evsel__raw_syscall_newtp(const char *direction, void *
|
||||
return evsel;
|
||||
|
||||
out_delete:
|
||||
evsel__delete_priv(evsel);
|
||||
evsel__put_and_free_priv(evsel);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2023,7 +2024,7 @@ static int trace__symbols_init(struct trace *trace, int argc, const char **argv,
|
||||
goto out;
|
||||
|
||||
err = __machine__synthesize_threads(trace->host, &trace->tool, &trace->opts.target,
|
||||
evlist->core.threads, trace__tool_process,
|
||||
evlist__core(evlist)->threads, trace__tool_process,
|
||||
/*needs_mmap=*/callchain_param.enabled &&
|
||||
!trace->summary_only,
|
||||
/*mmap_data=*/false,
|
||||
@@ -2098,6 +2099,49 @@ static bool is_internal_field(struct tep_format_field *field)
|
||||
return !strcmp(field->type, "__data_loc char[]");
|
||||
}
|
||||
|
||||
static bool field_has_hex_fmt(struct tep_format_field *field, int len)
|
||||
{
|
||||
const char *fmt, *pos, *end = NULL;
|
||||
|
||||
if (!field || !field->event || !field->event->print_fmt.format)
|
||||
return false;
|
||||
|
||||
fmt = field->event->print_fmt.format;
|
||||
|
||||
/* NB: Limit scanning strictly to the quoted printf format string */
|
||||
if (*fmt == '"') {
|
||||
const char *p = ++fmt;
|
||||
|
||||
while (*p) {
|
||||
if (*p == '\\' && p[1] != '\0') {
|
||||
/* NB: Skip escaped character */
|
||||
p += 2;
|
||||
} else if (*p == '"') {
|
||||
end = p;
|
||||
break;
|
||||
} else {
|
||||
p++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
end = strchr(fmt, ',');
|
||||
}
|
||||
|
||||
for (pos = strstr(fmt, field->name); pos && (!end || pos < end);
|
||||
pos = strstr(pos + 1, field->name)) {
|
||||
if (pos == fmt || !(isalnum(pos[-1]) || pos[-1] == '_')) {
|
||||
const char *after = pos + len;
|
||||
|
||||
if (*after == '=' && (strstarts(after + 1, "0x") ||
|
||||
strstarts(after + 1, "%#") ||
|
||||
strstarts(after + 1, "%p")))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct tep_format_field *
|
||||
syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field *field,
|
||||
bool *use_btf)
|
||||
@@ -2125,7 +2169,8 @@ syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field
|
||||
((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
|
||||
strstr(field->name, "path") != NULL)) {
|
||||
arg->scnprintf = SCA_FILENAME;
|
||||
} else if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, "addr"))
|
||||
} else if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, "addr") ||
|
||||
field_has_hex_fmt(field, len))
|
||||
arg->scnprintf = SCA_PTR;
|
||||
else if (strcmp(field->type, "pid_t") == 0)
|
||||
arg->scnprintf = SCA_PID;
|
||||
@@ -3207,6 +3252,29 @@ static void bpf_output__fprintf(struct trace *trace,
|
||||
++trace->nr_events_printed;
|
||||
}
|
||||
|
||||
static unsigned char bitmap_byte(const unsigned long *mask, int byte_idx)
|
||||
{
|
||||
unsigned char b_val = 0;
|
||||
int bit_in_byte;
|
||||
|
||||
for (bit_in_byte = 0; bit_in_byte < 8; bit_in_byte++) {
|
||||
int b_idx = byte_idx * 8 + bit_in_byte;
|
||||
int host_w_idx = b_idx / BITS_PER_LONG;
|
||||
int host_bit_in_word = b_idx % BITS_PER_LONG;
|
||||
|
||||
if (mask[host_w_idx] & (1UL << host_bit_in_word))
|
||||
b_val |= (1 << bit_in_byte);
|
||||
}
|
||||
return b_val;
|
||||
}
|
||||
|
||||
static bool trace__field_is_ip(const char *name)
|
||||
{
|
||||
return !strcmp(name, "__probe_ip") ||
|
||||
!strcmp(name, "caller_ip") ||
|
||||
!strcmp(name, "call_site");
|
||||
}
|
||||
|
||||
static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *sample,
|
||||
struct thread *thread, void *augmented_args, int augmented_args_size)
|
||||
{
|
||||
@@ -3219,6 +3287,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *
|
||||
size_t printed = 0, btf_printed;
|
||||
unsigned long val;
|
||||
u8 bit = 1;
|
||||
bool is_probe_ip;
|
||||
struct syscall_arg syscall_arg = {
|
||||
.augmented = {
|
||||
.size = augmented_args_size,
|
||||
@@ -3238,17 +3307,57 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *
|
||||
syscall_arg.len = 0;
|
||||
syscall_arg.fmt = arg;
|
||||
if (field->flags & TEP_FIELD_IS_ARRAY) {
|
||||
int offset = field->offset;
|
||||
void *ptr = format_field__get_raw_data(field, sample,
|
||||
evsel->needs_swap,
|
||||
&syscall_arg.len);
|
||||
|
||||
if (field->flags & TEP_FIELD_IS_DYNAMIC) {
|
||||
offset = format_field__intval(field, sample, evsel->needs_swap);
|
||||
syscall_arg.len = offset >> 16;
|
||||
offset &= 0xffff;
|
||||
if (tep_field_is_relative(field->flags))
|
||||
offset += field->offset + field->size;
|
||||
if (!ptr) {
|
||||
pr_err("Problem processing %s field, skipping...\n", field->name);
|
||||
continue;
|
||||
}
|
||||
val = (uintptr_t)ptr;
|
||||
} else if ((field->flags & TEP_FIELD_IS_DYNAMIC) &&
|
||||
strstr(field->type, "cpumask")) {
|
||||
unsigned long *mask = format_field__get_cpumask(field, sample,
|
||||
evsel->needs_swap,
|
||||
&syscall_arg.len);
|
||||
|
||||
if (!mask) {
|
||||
pr_err("Problem processing %s field, skipping...\n", field->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
val = (uintptr_t)(sample->raw_data + offset);
|
||||
printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
|
||||
if (trace->show_arg_names)
|
||||
printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
|
||||
|
||||
if (syscall_arg.len == 0) {
|
||||
printed += scnprintf(bf + printed, size - printed, "0");
|
||||
} else if (trace->bitmask_list) {
|
||||
printed += bitmap_scnprintf(mask, syscall_arg.len * 8,
|
||||
bf + printed, size - printed);
|
||||
} else {
|
||||
int i;
|
||||
bool skip_zero = true;
|
||||
|
||||
printed += scnprintf(bf + printed, size - printed, "0x");
|
||||
/* Print bytes from most significant to least significant */
|
||||
for (i = syscall_arg.len - 1; i >= 0; i--) {
|
||||
unsigned char b_val = bitmap_byte(mask, i);
|
||||
|
||||
if (skip_zero && b_val == 0 && i > 0)
|
||||
continue;
|
||||
|
||||
if (skip_zero) {
|
||||
printed += scnprintf(bf + printed, size - printed, "%x", b_val);
|
||||
skip_zero = false;
|
||||
} else {
|
||||
printed += scnprintf(bf + printed, size - printed, "%02x", b_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(mask);
|
||||
continue;
|
||||
} else
|
||||
val = format_field__intval(field, sample, evsel->needs_swap);
|
||||
/*
|
||||
@@ -3266,9 +3375,14 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *
|
||||
* Suppress it by default to avoid cluttering the output.
|
||||
* If verbose mode is enabled, ensure it is formatted as a
|
||||
* hexadecimal memory address rather than a signed integer.
|
||||
*
|
||||
* caller_ip and call_site are also expected to be instruction
|
||||
* pointers and should always be represented in hexadecimal.
|
||||
*/
|
||||
if (evsel__is_probe(evsel) && !strcmp(field->name, "__probe_ip")) {
|
||||
if (!verbose)
|
||||
is_probe_ip = evsel__is_probe(evsel) && !strcmp(field->name, "__probe_ip");
|
||||
|
||||
if (is_probe_ip || trace__field_is_ip(field->name)) {
|
||||
if (is_probe_ip && !verbose)
|
||||
continue;
|
||||
|
||||
printed += scnprintf(bf + printed, size - printed,
|
||||
@@ -3633,7 +3747,7 @@ static bool evlist__add_vfs_getname(struct evlist *evlist)
|
||||
|
||||
list_del_init(&evsel->core.node);
|
||||
evsel->evlist = NULL;
|
||||
evsel__delete(evsel);
|
||||
evsel__put(evsel);
|
||||
}
|
||||
|
||||
return found;
|
||||
@@ -3678,8 +3792,11 @@ static void trace__handle_event(struct trace *trace, union perf_event *event, st
|
||||
return;
|
||||
}
|
||||
|
||||
if (sample->evsel == NULL)
|
||||
if (sample->evsel == NULL) {
|
||||
sample->evsel = evlist__id2evsel(trace->evlist, sample->id);
|
||||
if (sample->evsel)
|
||||
evsel__get(sample->evsel);
|
||||
}
|
||||
|
||||
if (sample->evsel == NULL) {
|
||||
fprintf(trace->output, "Unknown tp ID %" PRIu64 ", skipping...\n", sample->id);
|
||||
@@ -3749,9 +3866,9 @@ static int trace__add_syscall_newtp(struct trace *trace)
|
||||
return ret;
|
||||
|
||||
out_delete_sys_exit:
|
||||
evsel__delete_priv(sys_exit);
|
||||
evsel__put_and_free_priv(sys_exit);
|
||||
out_delete_sys_enter:
|
||||
evsel__delete_priv(sys_enter);
|
||||
evsel__put_and_free_priv(sys_enter);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -4216,7 +4333,7 @@ static int trace__set_filter_pids(struct trace *trace)
|
||||
err = augmented_syscalls__set_filter_pids(trace->filter_pids.nr,
|
||||
trace->filter_pids.entries);
|
||||
}
|
||||
} else if (perf_thread_map__pid(trace->evlist->core.threads, 0) == -1) {
|
||||
} else if (perf_thread_map__pid(evlist__core(trace->evlist)->threads, 0) == -1) {
|
||||
err = trace__set_filter_loop_pids(trace);
|
||||
}
|
||||
|
||||
@@ -4439,7 +4556,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
|
||||
if (trace->summary_bpf) {
|
||||
if (trace_prepare_bpf_summary(trace->summary_mode) < 0)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
if (trace->summary_only)
|
||||
goto create_maps;
|
||||
@@ -4507,19 +4624,19 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
err = evlist__create_maps(evlist, &trace->opts.target);
|
||||
if (err < 0) {
|
||||
fprintf(trace->output, "Problems parsing the target to trace, check your options!\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
err = trace__symbols_init(trace, argc, argv, evlist);
|
||||
if (err < 0) {
|
||||
fprintf(trace->output, "Problems initializing symbol libraries!\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
if (trace->summary_mode == SUMMARY__BY_TOTAL && !trace->summary_bpf) {
|
||||
trace->syscall_stats = alloc_syscall_stats();
|
||||
if (!trace->syscall_stats)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
evlist__config(evlist, &trace->opts, &callchain_param);
|
||||
@@ -4528,9 +4645,9 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
err = evlist__prepare_workload(evlist, &trace->opts.target, argv, false, NULL);
|
||||
if (err < 0) {
|
||||
fprintf(trace->output, "Couldn't run the workload!\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
workload_pid = evlist->workload.pid;
|
||||
workload_pid = evlist__workload_pid(evlist);
|
||||
}
|
||||
|
||||
err = evlist__open(evlist);
|
||||
@@ -4576,13 +4693,13 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
|
||||
err = trace__expand_filters(trace, &evsel);
|
||||
if (err)
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
err = evlist__apply_filters(evlist, &evsel, &trace->opts.target);
|
||||
if (err < 0)
|
||||
goto out_error_apply_filters;
|
||||
|
||||
if (!trace->summary_only || !trace->summary_bpf) {
|
||||
err = evlist__mmap(evlist, trace->opts.mmap_pages);
|
||||
err = evlist__do_mmap(evlist, trace->opts.mmap_pages);
|
||||
if (err < 0)
|
||||
goto out_error_mmap;
|
||||
}
|
||||
@@ -4601,8 +4718,8 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
if (trace->summary_bpf)
|
||||
trace_start_bpf_summary();
|
||||
|
||||
trace->multiple_threads = perf_thread_map__pid(evlist->core.threads, 0) == -1 ||
|
||||
perf_thread_map__nr(evlist->core.threads) > 1 ||
|
||||
trace->multiple_threads = perf_thread_map__pid(evlist__core(evlist)->threads, 0) == -1 ||
|
||||
perf_thread_map__nr(evlist__core(evlist)->threads) > 1 ||
|
||||
evlist__first(evlist)->core.attr.inherit;
|
||||
|
||||
/*
|
||||
@@ -4619,11 +4736,11 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
again:
|
||||
before = trace->nr_events;
|
||||
|
||||
for (i = 0; i < evlist->core.nr_mmaps; i++) {
|
||||
for (i = 0; i < evlist__core(evlist)->nr_mmaps; i++) {
|
||||
union perf_event *event;
|
||||
struct mmap *md;
|
||||
|
||||
md = &evlist->mmap[i];
|
||||
md = &evlist__mmap(evlist)[i];
|
||||
if (perf_mmap__read_init(&md->core) < 0)
|
||||
continue;
|
||||
|
||||
@@ -4693,12 +4810,12 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
out_delete_evlist:
|
||||
out_put_evlist:
|
||||
trace_cleanup_bpf_summary();
|
||||
delete_syscall_stats(trace->syscall_stats);
|
||||
trace__symbols__exit(trace);
|
||||
evlist__free_syscall_tp_fields(evlist);
|
||||
evlist__delete(evlist);
|
||||
evlist__put(evlist);
|
||||
cgroup__put(trace->cgroup);
|
||||
trace->evlist = NULL;
|
||||
trace->live = false;
|
||||
@@ -4723,21 +4840,21 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
||||
|
||||
out_error:
|
||||
fprintf(trace->output, "%s\n", errbuf);
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
out_error_apply_filters:
|
||||
fprintf(trace->output,
|
||||
"Failed to set filter \"%s\" on event %s: %m\n",
|
||||
evsel->filter, evsel__name(evsel));
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
out_error_mem:
|
||||
fprintf(trace->output, "Not enough memory to run!\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
|
||||
out_errno:
|
||||
fprintf(trace->output, "%m\n");
|
||||
goto out_delete_evlist;
|
||||
goto out_put_evlist;
|
||||
}
|
||||
|
||||
static int trace__replay(struct trace *trace)
|
||||
@@ -5325,7 +5442,7 @@ static int trace__parse_cgroups(const struct option *opt, const char *str, int u
|
||||
{
|
||||
struct trace *trace = opt->value;
|
||||
|
||||
if (!list_empty(&trace->evlist->core.entries)) {
|
||||
if (!list_empty(&evlist__core(trace->evlist)->entries)) {
|
||||
struct option o = {
|
||||
.value = &trace->evlist,
|
||||
};
|
||||
@@ -5417,7 +5534,7 @@ static void trace__exit(struct trace *trace)
|
||||
zfree(&trace->syscalls.table);
|
||||
}
|
||||
zfree(&trace->perfconfig_events);
|
||||
evlist__delete(trace->evlist);
|
||||
evlist__put(trace->evlist);
|
||||
trace->evlist = NULL;
|
||||
ordered_events__free(&trace->oe.data);
|
||||
#ifdef HAVE_LIBBPF_SUPPORT
|
||||
@@ -5537,6 +5654,7 @@ int cmd_trace(int argc, const char **argv)
|
||||
"start"),
|
||||
OPT_BOOLEAN(0, "force-btf", &trace.force_btf, "Prefer btf_dump general pretty printer"
|
||||
"to customized ones"),
|
||||
OPT_BOOLEAN(0, "bitmask-list", &trace.bitmask_list, "Show bitmask as a human-readable list"),
|
||||
OPT_BOOLEAN(0, "bpf-summary", &trace.summary_bpf, "Summary syscall stats in BPF"),
|
||||
OPT_INTEGER(0, "max-summary", &trace.max_summary,
|
||||
"Max number of entries in the summary."),
|
||||
@@ -5599,7 +5717,7 @@ int cmd_trace(int argc, const char **argv)
|
||||
* .perfconfig trace.add_events, and filter those out.
|
||||
*/
|
||||
if (!trace.trace_syscalls && !trace.trace_pgfaults &&
|
||||
trace.evlist->core.nr_entries == 0 /* Was --events used? */) {
|
||||
evlist__nr_entries(trace.evlist) == 0 /* Was --events used? */) {
|
||||
trace.trace_syscalls = true;
|
||||
}
|
||||
/*
|
||||
@@ -5685,7 +5803,7 @@ int cmd_trace(int argc, const char **argv)
|
||||
symbol_conf.use_callchain = true;
|
||||
}
|
||||
|
||||
if (trace.evlist->core.nr_entries > 0) {
|
||||
if (evlist__nr_entries(trace.evlist) > 0) {
|
||||
bool use_btf = false;
|
||||
|
||||
evlist__set_default_evsel_handler(trace.evlist, trace__event_handler);
|
||||
|
||||
@@ -346,42 +346,42 @@
|
||||
"MetricExpr": "l1d_demand_misses / l1d_demand_accesses",
|
||||
"BriefDescription": "This metric measures the ratio of L1 D-cache Read accesses missed to the total number of L1 D-cache accesses. This gives an indication of the effectiveness of the L1 D-cache for demand Load or Store traffic.",
|
||||
"ScaleUnit": "1per cache access",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_demand_accesses",
|
||||
"MetricExpr": "L1D_CACHE_RW",
|
||||
"BriefDescription": "This metric measures the count of L1 D-cache accesses incurred on Load or Store by the instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_demand_misses",
|
||||
"MetricExpr": "L1D_CACHE_REFILL_RW",
|
||||
"BriefDescription": "This metric measures the count of L1 D-cache misses incurred on a Load or Store by the instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_prf_accuracy",
|
||||
"MetricExpr": "100 * (l1d_useful_prf / l1d_refilled_prf)",
|
||||
"BriefDescription": "This metric measures the fraction of prefetched memory addresses that are used by the instruction stream.",
|
||||
"ScaleUnit": "1percent of prefetch",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_prf_coverage",
|
||||
"MetricExpr": "100 * (l1d_useful_prf / (l1d_demand_misses + l1d_refilled_prf))",
|
||||
"BriefDescription": "This metric measures the baseline demand cache misses which the prefetcher brings into the cache.",
|
||||
"ScaleUnit": "1percent of cache access",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_refilled_prf",
|
||||
"MetricExpr": "L1D_CACHE_REFILL_HWPRF + L1D_CACHE_REFILL_PRFM + L1D_LFB_HIT_RW_FHWPRF + L1D_LFB_HIT_RW_FPRFM",
|
||||
"BriefDescription": "This metric measures the count of cache lines refilled by L1 data prefetcher (hardware prefetches or software preload) into L1 D-cache.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1d_tlb_miss_ratio",
|
||||
@@ -402,7 +402,7 @@
|
||||
"MetricExpr": "L1D_CACHE_HIT_RW_FPRF + L1D_LFB_HIT_RW_FHWPRF + L1D_LFB_HIT_RW_FPRFM",
|
||||
"BriefDescription": "This metric measures the count of cache lines refilled by L1 data prefetcher (hardware prefetches or software preload) into L1 D-cache which are further used by Load or Store from the instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_cache_miss_ratio",
|
||||
@@ -423,42 +423,42 @@
|
||||
"MetricExpr": "l1i_demand_misses / l1i_demand_accesses",
|
||||
"BriefDescription": "This metric measures the ratio of L1 I-cache Read accesses missed to the total number of L1 I-cache accesses. This gives an indication of the effectiveness of the L1 I-cache for demand instruction fetch traffic. Note that cache accesses in this cache are demand instruction fetch.",
|
||||
"ScaleUnit": "1per cache access",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_demand_accesses",
|
||||
"MetricExpr": "L1I_CACHE_RD",
|
||||
"BriefDescription": "This metric measures the count of L1 I-cache accesses caused by an instruction fetch by the instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_demand_misses",
|
||||
"MetricExpr": "L1I_CACHE_REFILL_RD",
|
||||
"BriefDescription": "This metric measures the count of L1 I-cache misses caused by an instruction fetch by the instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_prf_accuracy",
|
||||
"MetricExpr": "100 * (l1i_useful_prf / l1i_refilled_prf)",
|
||||
"BriefDescription": "This metric measures the fraction of prefetched memory addresses that are used by the instruction stream.",
|
||||
"ScaleUnit": "1percent of prefetch",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_prf_coverage",
|
||||
"MetricExpr": "100 * (l1i_useful_prf / (l1i_demand_misses + l1i_refilled_prf))",
|
||||
"BriefDescription": "This metric measures the baseline demand cache misses which the prefetcher brings into the cache.",
|
||||
"ScaleUnit": "1percent of cache access",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_refilled_prf",
|
||||
"MetricExpr": "L1I_CACHE_REFILL_HWPRF + L1I_CACHE_REFILL_PRFM",
|
||||
"BriefDescription": "This metric measures the count of cache lines refilled by L1 instruction prefetcher (hardware prefetches or software preload) into L1 I-cache.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1i_tlb_miss_ratio",
|
||||
@@ -479,7 +479,7 @@
|
||||
"MetricExpr": "L1I_CACHE_HIT_RD_FPRF",
|
||||
"BriefDescription": "This metric measures the count of cache lines refilled by L1 instruction prefetcher (hardware prefetches or software preload) into L1 I-cache which are further used by instruction stream of the program.",
|
||||
"ScaleUnit": "1count",
|
||||
"MetricGroup": "L1D_Prefetcher_Effectiveness"
|
||||
"MetricGroup": "L1I_Prefetcher_Effectiveness"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_miss_ratio",
|
||||
|
||||
@@ -316,8 +316,8 @@
|
||||
},
|
||||
{
|
||||
"EventCode": "0x0197",
|
||||
"EventName": "TXREQ_LIMIT_1QUARTER_CYCLES",
|
||||
"PublicDescription": "Number of cycles in which the dynamic TXREQ limit is between 1/4 of the L2_TQ_SIZE and 1/2 of the L2_TQ_SIZE."
|
||||
"EventName": "TXREQ_LIMIT_BELOW_HALF_CYCLES",
|
||||
"PublicDescription": "Number of cycles in which the dynamic TXREQ limit is between 0 and 1/2 of the L2_TQ_SIZE."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x019d",
|
||||
@@ -517,7 +517,7 @@
|
||||
{
|
||||
"EventCode": "0x01cc",
|
||||
"EventName": "TXREQ_LIMIT_COUNT_CYCLES",
|
||||
"PublicDescription": "This event increments by the dynamic TXREQ value, in each cycle.\nThis is a companion event of TXREQ_LIMIT_MAX_CYCLES, TXREQ_LIMIT_3QUARTER_CYCLES, TXREQ_LIMIT_HALF_CYCLES, and TXREQ_LIMIT_1QUARTER_CYCLES."
|
||||
"PublicDescription": "This event increments by the dynamic TXREQ value, in each cycle.\nThis is a companion event of TXREQ_LIMIT_MAX_CYCLES, TXREQ_LIMIT_3QUARTER_CYCLES, TXREQ_LIMIT_HALF_CYCLES, and TXREQ_LIMIT_BELOW_HALF_CYCLES."
|
||||
},
|
||||
{
|
||||
"EventCode": "0x01ce",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
},
|
||||
{
|
||||
"EventName": "idle-cycles-frontend",
|
||||
"BriefDescription": "Stalled cycles during issue [This event is an alias of stalled-cycles-fronted].",
|
||||
"BriefDescription": "Stalled cycles during issue [This event is an alias of stalled-cycles-frontend].",
|
||||
"LegacyConfigCode": "7"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -800,16 +800,16 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -835,7 +835,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / max(tma_memory_bound, tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / max(tma_l1_bound, tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / max(tma_memory_bound, tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / max(tma_l1_bound, tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -844,7 +844,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -1012,13 +1012,13 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "24 * tma_info_system_core_frequency * (cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@ + cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@ * (1 - cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM@ / (cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM@ + cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HIT_WITH_FWD@))) * (1 + cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@MEM_LOAD_RETIRED.L1_MISS@ / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1042,16 +1042,6 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_ACTIVITY.STALLS_L3_MISS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_CYCLES_ANY@ - cpu_core@IDQ.DSB_CYCLES_OK@) / tma_info_core_core_clks / 2",
|
||||
@@ -1108,7 +1098,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1426,7 +1416,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 6 > 0.35",
|
||||
@@ -1485,7 +1475,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the LSD (Loop Stream Detector; aka Loop Cache)",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "Fed;LSD",
|
||||
"MetricName": "tma_info_frontend_lsd_coverage",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1629,6 +1619,15 @@
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * cpu_core@ASSISTS.SSE_AVX_MIX@ / cpu_core@INST_RETIRED.ANY@",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L1 data cache [GB / sec]",
|
||||
"MetricExpr": "tma_info_memory_l1d_cache_fill_bw",
|
||||
@@ -1850,7 +1849,7 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Mem;Backend;CacheHits",
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is execution) per physical core",
|
||||
"MetricExpr": "cpu_core@UOPS_EXECUTED.THREAD@ / (cpu_core@UOPS_EXECUTED.CORE_CYCLES_GE_1@ / 2 if #SMT_on else cpu_core@UOPS_EXECUTED.THREAD\\,cmask\\=1@)",
|
||||
"MetricGroup": "Cor;Pipeline;PortsUtil;SMT",
|
||||
"MetricName": "tma_info_pipeline_execute",
|
||||
@@ -1935,7 +1934,7 @@
|
||||
"MetricExpr": "64 * (UNC_ARB_TRK_REQUESTS.ALL + UNC_ARB_COH_TRK_REQUESTS.ALL) / 1e6 / tma_info_system_time / 1e3",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -2029,13 +2028,6 @@
|
||||
"MetricName": "tma_info_system_turbo_utilization",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Per-Logical Processor actual clocks when the Logical Processor is active.",
|
||||
"MetricExpr": "cpu_core@CPU_CLK_UNHALTED.THREAD@",
|
||||
@@ -2204,6 +2196,16 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_ACTIVITY.STALLS_L3_MISS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles CPU was stalled due to Length Changing Prefixes (LCPs)",
|
||||
"MetricExpr": "cpu_core@DECODE.LCP@ / tma_info_thread_clks",
|
||||
@@ -2283,7 +2285,7 @@
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU spent handling cache misses due to lock operations",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(16 * max(0, cpu_core@MEM_INST_RETIRED.LOCK_LOADS@ - cpu_core@L2_RQSTS.ALL_RFO@) + cpu_core@MEM_INST_RETIRED.LOCK_LOADS@ / cpu_core@MEM_INST_RETIRED.ALL_STORES@ * (10 * cpu_core@L2_RQSTS.RFO_HIT@ + min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO@))) / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@LOCK_CYCLES.CACHE_LOCK_DURATION@ / tma_info_thread_clks",
|
||||
"MetricGroup": "LockCont;Offcore;TopdownL4;tma_L4_group;tma_issueRFO;tma_l1_bound_group",
|
||||
"MetricName": "tma_lock_latency",
|
||||
"MetricThreshold": "tma_lock_latency > 0.2 & (tma_l1_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
@@ -2315,19 +2317,19 @@
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD@) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
@@ -2397,7 +2399,7 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2416,7 +2418,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: FRONTEND_RETIRED.MS_FLOWS. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: FRONTEND_RETIRED.MS_FLOWS. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2606,7 +2608,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles handling memory load split accesses - load that cross 64-byte cache line boundary",
|
||||
"MetricExpr": "tma_info_memory_load_miss_real_latency * cpu_core@LD_BLOCKS.NO_SR@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@MEM_INST_RETIRED.SPLIT_LOADS@ * tma_info_memory_load_miss_real_latency / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_split_loads",
|
||||
"MetricThreshold": "tma_split_loads > 0.3",
|
||||
@@ -2630,7 +2632,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of core requests (demand and L1 prefetchers) rejected by the L2 queue (L2Q) due to a full condition.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
"PublicDescription": "Counts the number of (demand and L1 prefetchers) core requests rejected by the L2 queue (L2Q) due to a full or nearly full condition, which likely indicates back pressure from L2Q. It also counts requests that would have gone directly to the External Queue (XQ), but are rejected due to a full or nearly full condition, indicating back pressure from the IDI link. The L2Q may also reject transactions from a core to ensure fairness between cores, or to delay a cores dirty eviction when the address conflicts incoming external snoops. (Note that L2 prefetcher requests that are dropped are not counted by this event). Counts on a per core basis.",
|
||||
"SampleAfterValue": "200003",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L1D.HWPF_MISS",
|
||||
"Counter": "0,1,2,3",
|
||||
@@ -121,6 +130,15 @@
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x30",
|
||||
"EventName": "L2_REJECT_XQ.ANY",
|
||||
"PublicDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition which likely indicates back pressure from the IDI link. The XQ may reject transactions from the L2Q (non-cacheable requests), BBL (L2 misses) and WOB (L2 write-back victims).",
|
||||
"SampleAfterValue": "200003",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number of L2 Cache accesses. Counts on a per core basis.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
@@ -438,6 +456,15 @@
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to an instruction cache or TLB miss which missed in the L2 cache.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "MEM_BOUND_STALLS.IFETCH_L2_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x30",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to an instruction cache or TLB miss which hit in the LLC or other core with HITE/F/M.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
@@ -475,6 +502,15 @@
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to a demand load which missed in the L2 cache.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "MEM_BOUND_STALLS.LOAD_L2_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x6",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to a demand load which hit in the LLC or other core with HITE/F/M.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
|
||||
@@ -93,7 +93,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -129,6 +128,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -550,11 +550,11 @@
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired. Non PEBS",
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc5",
|
||||
"EventName": "BR_MISP_RETIRED.RET",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts mispredicted return instructions retired. Available PDIST counters: 0",
|
||||
"PublicDescription": "This event counts the number of mispredicted ret instructions retired. Available PDIST counters: 0",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -988,7 +988,7 @@
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc0",
|
||||
"EventName": "INST_RETIRED.REP_ITERATION",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note the number of iterations is implementation-dependent.",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note: Since the number of iterations within a REP instruction can be significantly affected by fast strings, this event may vary run to run and not match the architectural number of iterations (specified by RCX)",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
|
||||
@@ -1,4 +1,20 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of core requests (demand and L1 prefetchers) rejected by the L2 queue (L2Q) due to a full condition.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
"PublicDescription": "Counts the number of (demand and L1 prefetchers) core requests rejected by the L2 queue (L2Q) due to a full or nearly full condition, which likely indicates back pressure from L2Q. It also counts requests that would have gone directly to the External Queue (XQ), but are rejected due to a full or nearly full condition, indicating back pressure from the IDI link. The L2Q may also reject transactions from a core to ensure fairness between cores, or to delay a cores dirty eviction when the address conflicts incoming external snoops. (Note that L2 prefetcher requests that are dropped are not counted by this event). Counts on a per core basis.",
|
||||
"SampleAfterValue": "200003"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x30",
|
||||
"EventName": "L2_REJECT_XQ.ANY",
|
||||
"PublicDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition which likely indicates back pressure from the IDI link. The XQ may reject transactions from the L2Q (non-cacheable requests), BBL (L2 misses) and WOB (L2 write-back victims).",
|
||||
"SampleAfterValue": "200003"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number of L2 Cache accesses. Counts on a per core basis.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
@@ -70,6 +86,14 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to an instruction cache or TLB miss which missed in the L2 cache.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "MEM_BOUND_STALLS.IFETCH_L2_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x30"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to an instruction cache or TLB miss which hit in the LLC or other core with HITE/F/M.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
@@ -103,6 +127,14 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to a demand load which missed in the L2 cache.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "MEM_BOUND_STALLS.LOAD_L2_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x6"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles the core is stalled due to a demand load which hit in the LLC or other core with HITE/F/M.",
|
||||
"Counter": "0,1,2,3,4,5",
|
||||
|
||||
@@ -179,6 +179,30 @@
|
||||
"BriefDescription": "Retired scalar floating-point blend ops.",
|
||||
"UMask": "0x09"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.scalar_mov",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired scalar floating-point MOV ops.",
|
||||
"UMask": "0x0a"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.scalar_shuffle",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired scalar floating-point shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0x0b"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.scalar_bfloat",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired scalar floating-point bfloat ops.",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.scalar_logical",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired scalar floating-point logical ops.",
|
||||
"UMask": "0x0d"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.scalar_other",
|
||||
"EventCode": "0x0a",
|
||||
@@ -245,12 +269,24 @@
|
||||
"BriefDescription": "Retired vector floating-point blend ops.",
|
||||
"UMask": "0x90"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.vector_mov",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired vector floating-point MOV ops.",
|
||||
"UMask": "0xa0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.vector_shuffle",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired vector floating-point shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0xb0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.vector_bfloat",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired vector floating-point bfloat ops.",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_ops_retired_by_type.vector_logical",
|
||||
"EventCode": "0x0a",
|
||||
@@ -278,7 +314,7 @@
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_add",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer add.",
|
||||
"BriefDescription": "Retired MMX integer add ops.",
|
||||
"UMask": "0x01"
|
||||
},
|
||||
{
|
||||
@@ -299,16 +335,34 @@
|
||||
"BriefDescription": "Retired MMX integer multiply-accumulate ops.",
|
||||
"UMask": "0x04"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_aes",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer AES ops.",
|
||||
"UMask": "0x05"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_sha",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer SHA ops.",
|
||||
"UMask": "0x06"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_cmp",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer compare ops.",
|
||||
"UMask": "0x07"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_cvt",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer convert or pack ops.",
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_shift",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer shift ops.",
|
||||
"BriefDescription": "Retired MMX integer shift or rotate ops.",
|
||||
"UMask": "0x09"
|
||||
},
|
||||
{
|
||||
@@ -323,10 +377,17 @@
|
||||
"BriefDescription": "Retired MMX integer shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0x0b"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_vnni",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer VNNI ops.",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.mmx_pack",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired MMX integer pack ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event sse_avx_ops_retired.mmx_vnni",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
@@ -389,16 +450,23 @@
|
||||
"BriefDescription": "Retired SSE and AVX integer compare ops.",
|
||||
"UMask": "0x70"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.sse_avx_cvt",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired SSE and AVX integer convert or pack ops.",
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.sse_avx_clm",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired SSE and AVX integer CLM ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event sse_avx_ops_retired.sse_avx_cvt",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.sse_avx_shift",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired SSE and AVX integer shift ops.",
|
||||
"BriefDescription": "Retired SSE and AVX integer shift or rotate ops.",
|
||||
"UMask": "0x90"
|
||||
},
|
||||
{
|
||||
@@ -413,10 +481,17 @@
|
||||
"BriefDescription": "Retired SSE and AVX integer shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0xb0"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.sse_avx_vnni",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired SSE and AVX integer VNNI ops.",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_ops_retired.sse_avx_pack",
|
||||
"EventCode": "0x0b",
|
||||
"BriefDescription": "Retired SSE and AVX integer pack ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event sse_avx_ops_retired.sse_avx_vnni",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
@@ -497,12 +572,24 @@
|
||||
"BriefDescription": "Retired 128-bit packed floating-point blend ops.",
|
||||
"UMask": "0x09"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp128_mov",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 128-bit packed floating-point MOV ops.",
|
||||
"UMask": "0x0a"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp128_shuffle",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 128-bit packed floating-point shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0x0b"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp128_bfloat",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 128-bit packed floating-point bfloat ops.",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp128_logical",
|
||||
"EventCode": "0x0c",
|
||||
@@ -575,12 +662,24 @@
|
||||
"BriefDescription": "Retired 256-bit packed floating-point blend ops.",
|
||||
"UMask": "0x90"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp256_mov",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 256-bit packed floating-point MOV ops.",
|
||||
"UMask": "0xa0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp256_shuffle",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 256-bit packed floating-point shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0xb0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp256_bfloat",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 256-bit packed floating-point bfloat ops.",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_retired.fp256_logical",
|
||||
"EventCode": "0x0c",
|
||||
@@ -647,16 +746,23 @@
|
||||
"BriefDescription": "Retired 128-bit packed integer compare ops.",
|
||||
"UMask": "0x07"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int128_cvt",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer convert or pack ops.",
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int128_clm",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer CLM ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event packed_int_op_type.int128_cvt",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int128_shift",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer shift ops.",
|
||||
"BriefDescription": "Retired 128-bit packed integer shift or rotate ops.",
|
||||
"UMask": "0x09"
|
||||
},
|
||||
{
|
||||
@@ -671,10 +777,17 @@
|
||||
"BriefDescription": "Retired 128-bit packed integer shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0x0b"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int128_vnni",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer VNNI ops.",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int128_pack",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer pack ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event packed_int_op_type.int128_vnni",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
@@ -719,16 +832,34 @@
|
||||
"BriefDescription": "Retired 256-bit packed integer multiply-accumulate ops.",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_aes",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer AES ops.",
|
||||
"UMask": "0x50"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_sha",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer SHA ops.",
|
||||
"UMask": "0x60"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_cmp",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer compare ops.",
|
||||
"UMask": "0x70"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_cvt",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer convert or pack ops.",
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_shift",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer shift ops.",
|
||||
"BriefDescription": "Retired 256-bit packed integer shift or rotate ops.",
|
||||
"UMask": "0x90"
|
||||
},
|
||||
{
|
||||
@@ -743,10 +874,17 @@
|
||||
"BriefDescription": "Retired 256-bit packed integer shuffle ops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0xb0"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_vnni",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer VNNI ops.",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"EventName": "packed_int_op_type.int256_pack",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer pack ops.",
|
||||
"BriefDescription": "This event is deprecated. Refer to new event packed_int_op_type.int256_vnni",
|
||||
"Deprecated": "1",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -8,9 +8,15 @@
|
||||
{
|
||||
"EventName": "ls_locks.bus_lock",
|
||||
"EventCode": "0x25",
|
||||
"BriefDescription": "Retired Lock instructions which caused a bus lock.",
|
||||
"BriefDescription": "Retired lock instructions which caused a bus lock.",
|
||||
"UMask": "0x01"
|
||||
},
|
||||
{
|
||||
"EventName": "ls_locks.all",
|
||||
"EventCode": "0x25",
|
||||
"BriefDescription": "Retired lock instructions of all types.",
|
||||
"UMask": "0x1f"
|
||||
},
|
||||
{
|
||||
"EventName": "ls_ret_cl_flush",
|
||||
"EventCode": "0x26",
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
{
|
||||
"EventName": "fp_ops_ret_by_type.scalar_logical",
|
||||
"EventCode": "0x0a",
|
||||
"BriefDescription": "Retired scalar floating-point move uops.",
|
||||
"BriefDescription": "Retired scalar floating-point logical uops.",
|
||||
"UMask": "0x0d"
|
||||
},
|
||||
{
|
||||
@@ -665,6 +665,12 @@
|
||||
"BriefDescription": "Retired 256-bit packed floating-point shuffle uops (may include instructions not necessarily thought of as including shuffles e.g. horizontal add, dot product, and certain MOV instructions).",
|
||||
"UMask": "0xb0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_ret.fp256_bfloat",
|
||||
"EventCode": "0x0c",
|
||||
"BriefDescription": "Retired 256-bit packed floating-point bfloat uops.",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_ops_ret.fp256_logical",
|
||||
"EventCode": "0x0c",
|
||||
@@ -758,7 +764,7 @@
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int128_vnni",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 128-bit packed integer VNNI ops.",
|
||||
"BriefDescription": "Retired 128-bit packed integer VNNI uops.",
|
||||
"UMask": "0x0c"
|
||||
},
|
||||
{
|
||||
@@ -803,12 +809,30 @@
|
||||
"BriefDescription": "Retired 256-bit packed integer multiply-accumulate uops.",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int256_aes",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer AES uops.",
|
||||
"UMask": "0x50"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int256_sha",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer SHA uops.",
|
||||
"UMask": "0x60"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int256_cmp",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer compare uops.",
|
||||
"UMask": "0x70"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int256_cvt",
|
||||
"EventCode": "0x0d",
|
||||
"BriefDescription": "Retired 256-bit packed integer convert or pack uops.",
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_pack_int_ops_ret.int256_shift",
|
||||
"EventCode": "0x0d",
|
||||
@@ -1083,19 +1107,19 @@
|
||||
"EventName": "fp_nsq_read_stalls.fp_prf",
|
||||
"EventCode": "0x13",
|
||||
"BriefDescription": "Cycles when reads of the NSQ and writes to the floating-point or SIMD schedulers are stalled due to insufficient free physical register file (FP-PRF) entries.",
|
||||
"UMask": "0x0e"
|
||||
"UMask": "0x02"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_nsq_read_stalls.k_prf",
|
||||
"EventCode": "0x13",
|
||||
"BriefDescription": "Cycles when reads of the NSQ and writes to the floating-point or SIMD schedulers are stalled due to insufficient free mask physical register file (K-PRF) entries.",
|
||||
"UMask": "0x0e"
|
||||
"UMask": "0x04"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_nsq_read_stalls.fp_sq",
|
||||
"EventCode": "0x13",
|
||||
"BriefDescription": "Cycles when reads of the NSQ and writes to the floating-point or SIMD schedulers are stalled due to insufficient free scheduler entries.",
|
||||
"UMask": "0x0e"
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"EventName": "fp_nsq_read_stalls.all",
|
||||
|
||||
@@ -823,16 +823,16 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency + tma_uc_bound)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_capacity / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency + tma_uc_bound)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_capacity / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -858,7 +858,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -867,7 +867,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -1015,7 +1015,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by non-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@ * cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_nt_mispredicts",
|
||||
"MetricThreshold": "tma_cond_nt_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1024,7 +1024,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by backward-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD_COST@ * cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_bwd_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_bwd_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1033,7 +1033,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by forward-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD_COST@ * cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_fwd_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_fwd_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1046,7 +1046,7 @@
|
||||
"MetricGroup": "BvMS;DataSharing;LockCont;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_contested_accesses",
|
||||
"MetricThreshold": "tma_contested_accesses > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to contested accesses. Contested accesses occur when data written by one Logical Processor are read by another Logical Processor on a different Physical Core. Examples of contested accesses include synchronizations such as locks; true data sharing such as modified locked variables; and false sharing. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD;MEM_LOAD_L3_HIT_RETIRED.XSNP_MISS. Related metrics: tma_bottleneck_memory_synchronization, tma_data_sharing, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to contested accesses. Contested accesses occur when data written by one Logical Processor are read by another Logical Processor on a different Physical Core. Examples of contested accesses include synchronizations such as locks; true data sharing such as modified locked variables; and false sharing. Sample with: MEM_LOAD_L2_MISS_RETIRED.L3.SAME_CBB.HIT_ESF.SNP_MISS;MEM_LOAD_L2_MISS_RETIRED.OTHER_MODULE_L2.SAME_CBB.HIT_M.SNP_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_data_sharing, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1062,13 +1062,13 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@R, 24 * tma_info_system_core_frequency) + cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@R, 25 * tma_info_system_core_frequency)) * (1 + cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@MEM_LOAD_RETIRED.L1_MISS@ / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L2_MISS_RETIRED.L3.SAME_CBB.HIT_ESF.SNP_HIT_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1082,19 +1082,9 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.MEM@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / 2 + cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_dsb) / 8 + cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricGroup": "DSB;FetchBW;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_dsb",
|
||||
"MetricThreshold": "tma_dsb > 0.15 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -1138,7 +1128,7 @@
|
||||
"MetricGroup": "BvMS;DataSharing;LockCont;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_store_bound_group",
|
||||
"MetricName": "tma_false_sharing",
|
||||
"MetricThreshold": "tma_false_sharing > 0.05 & (tma_store_bound > 0.2 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric roughly estimates how often CPU was handling synchronizations due to False Sharing. False Sharing is a multithreading hiccup; where multiple Logical Processors contend on different data-elements mapped into the same cache line. Sample with: OCR.DEMAND_RFO.L3_HIT.SNOOP_HITM. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_data_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric roughly estimates how often CPU was handling synchronizations due to False Sharing. False Sharing is a multithreading hiccup; where multiple Logical Processors contend on different data-elements mapped into the same cache line. Sample with: L2_REQUEST.RFO_HIT_XSNP_HIT_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_data_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1148,7 +1138,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1245,7 +1235,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric approximates arithmetic FP vector uops fraction the CPU has retired for 256-bit wide vectors",
|
||||
"MetricExpr": "cpu_core@FP_ARITH_OPS_RETIRED.VECTOR\\,umask\\=0x30@ / (tma_retiring * tma_info_thread_slots)",
|
||||
"MetricExpr": "cpu_core@FP_ARITH_OPS_RETIRED.VECTOR_256B@ / (tma_retiring * tma_info_thread_slots)",
|
||||
"MetricGroup": "Compute;Flops;TopdownL5;tma_L5_group;tma_fp_vector_group;tma_issue2P",
|
||||
"MetricName": "tma_fp_vector_256b",
|
||||
"MetricThreshold": "tma_fp_vector_256b > 0.1 & (tma_fp_vector > 0.1 & (tma_fp_arith > 0.2 & tma_light_operations > 0.6))",
|
||||
@@ -1288,7 +1278,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to instruction cache misses",
|
||||
"MetricExpr": "cpu_core@ICACHE_DATA.STALLS@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@ICACHE_DATA.STALLS@ / tma_info_thread_clks + tma_isb_full",
|
||||
"MetricGroup": "BigFootprint;BvBC;FetchLat;IcMiss;TopdownL3;tma_L3_group;tma_fetch_latency_group",
|
||||
"MetricName": "tma_icache_misses",
|
||||
"MetricThreshold": "tma_icache_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
@@ -1298,7 +1288,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect CALL instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_call_mispredicts",
|
||||
"MetricThreshold": "tma_ind_call_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1307,7 +1297,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect JMP instructions.",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_COST@R - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R) / tma_info_thread_clks, 0)",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT@ - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@) / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts, 0)",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_jump_mispredicts",
|
||||
"MetricThreshold": "tma_ind_jump_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1477,7 +1467,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 8 > 0.35",
|
||||
@@ -1544,7 +1534,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the LSD (Loop Stream Detector; aka Loop Cache)",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "Fed;LSD",
|
||||
"MetricName": "tma_info_frontend_lsd_coverage",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1703,6 +1693,15 @@
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * cpu_core@ASSISTS.SSE_AVX_MIX@ / cpu_core@INST_RETIRED.ANY@",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fill Buffer (FB) hits per kilo instructions for retired demand loads (L1D misses that merge into ongoing miss-handling entries)",
|
||||
"MetricExpr": "1e3 * cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@INST_RETIRED.ANY@",
|
||||
@@ -1969,6 +1968,13 @@
|
||||
"MetricName": "tma_info_pipeline_retire",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total percent of cycles without actually retired uops",
|
||||
"MetricExpr": "cpu_core@UOPS_RETIRED.STALLS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "Pipeline;Ret",
|
||||
"MetricName": "tma_info_pipeline_retire_stall",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Estimated fraction of retirement-cycles dealing with repeat instructions",
|
||||
"MetricExpr": "cpu_core@INST_RETIRED.REP_ITERATION@ / cpu_core@UOPS_RETIRED.SLOTS\\,cmask\\=1@",
|
||||
@@ -2011,7 +2017,7 @@
|
||||
"MetricExpr": "32 * UNC_M_TOTAL_DATA / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -2082,13 +2088,6 @@
|
||||
"MetricName": "tma_info_system_turbo_utilization",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Per-Logical Processor actual clocks when the Logical Processor is active.",
|
||||
"MetricExpr": "cpu_core@CPU_CLK_UNHALTED.THREAD@",
|
||||
@@ -2180,9 +2179,18 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles Icache tag lookup was stalled due to Instruction Stream Buffer (ISB) being full",
|
||||
"MetricExpr": "(cpu_core@ICACHE_TAG.STALLS_ISB@ + cpu_core@ICACHE_TAG.STALLS_INUSE@) / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_icache_misses_group",
|
||||
"MetricName": "tma_isb_full",
|
||||
"MetricThreshold": "tma_isb_full > 0.05 & (tma_icache_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15))",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to Instruction TLB (ITLB) misses",
|
||||
"MetricExpr": "cpu_core@ICACHE_TAG.STALLS@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@ICACHE_TAG.STALLS@ / tma_info_thread_clks - tma_isb_full",
|
||||
"MetricGroup": "BigFootprint;BvBC;FetchLat;MemoryTLB;TopdownL3;tma_L3_group;tma_fetch_latency_group",
|
||||
"MetricName": "tma_itlb_misses",
|
||||
"MetricThreshold": "tma_itlb_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
@@ -2209,19 +2217,9 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric ([SKL+] roughly; [LNL]) estimates fraction of cycles with demand load accesses that hit the L1D cache",
|
||||
"MetricExpr": "4 * cpu_core@DEPENDENT_LOADS.ANY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvML;MemoryLat;TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_l1_latency_dependency",
|
||||
"MetricThreshold": "tma_l1_latency_dependency > 0.1 & (tma_l1_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric ([SKL+] roughly; [LNL]) estimates fraction of cycles with demand load accesses that hit the L1D cache. The short latency of the L1D cache may be exposed in pointer-chasing memory access patterns as an example. Sample with: MEM_LOAD_RETIRED.L1_HIT",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled due to L2 cache accesses by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@MEM_LOAD_RETIRED.L2_HIT@ / (cpu_core@MEM_LOAD_RETIRED.L2_HIT@ + cpu_core@MEM_LOAD_MISC_RETIRED.UC@) * cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvML;CacheHits;MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l2_bound",
|
||||
"MetricThreshold": "tma_l2_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
@@ -2245,7 +2243,7 @@
|
||||
"MetricGroup": "CacheHits;MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_bound",
|
||||
"MetricThreshold": "tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled due to loads accesses to L3 cache or contended with a sibling Core. Avoiding cache misses (i.e. L2 misses/L3 hits) can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_HIT_PS",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled due to loads accesses to L3 cache or contended with a sibling Core. Avoiding cache misses (i.e. L2 misses/L3 hits) can improve the latency and increase performance. Sample with: MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2255,7 +2253,17 @@
|
||||
"MetricGroup": "BvML;MemoryLat;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_bound_group",
|
||||
"MetricName": "tma_l3_hit_latency",
|
||||
"MetricThreshold": "tma_l3_hit_latency > 0.1 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles with demand load accesses that hit the L3 cache under unloaded scenarios (possibly L3 latency limited). Avoiding private cache misses (i.e. L2 misses/L3 hits) will improve the latency; reduce contention with sibling physical cores and increase performance. Note the value of this node may overlap with its siblings. Sample with: MEM_LOAD_RETIRED.L3_HIT_PS. Related metrics: tma_bottleneck_data_cache_memory_latency, tma_mem_latency",
|
||||
"PublicDescription": "This metric estimates fraction of cycles with demand load accesses that hit the L3 cache under unloaded scenarios (possibly L3 latency limited). Avoiding private cache misses (i.e. L2 misses/L3 hits) will improve the latency; reduce contention with sibling physical cores and increase performance. Note the value of this node may overlap with its siblings. Sample with: MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB. Related metrics: tma_bottleneck_data_cache_memory_latency, tma_mem_latency",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.MEM@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_L2_MISS_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2348,7 +2356,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to LSD (Loop Stream Detector) unit",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / tma_info_thread_clks / 2",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_lsd) / 8 / tma_info_thread_clks",
|
||||
"MetricGroup": "FetchBW;LSD;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_lsd",
|
||||
"MetricThreshold": "tma_lsd > 0.15 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2370,19 +2378,19 @@
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD@) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
@@ -2438,7 +2446,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to the MITE pipeline (the legacy decode pipeline)",
|
||||
"MetricExpr": "(cpu_core@IDQ.MITE_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / 2 + cpu_core@IDQ.MITE_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricExpr": "(cpu_core@IDQ.MITE_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_mite) / 8 + cpu_core@IDQ.MITE_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricGroup": "DSBmiss;FetchBW;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_mite",
|
||||
"MetricThreshold": "tma_mite > 0.1 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2452,13 +2460,13 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to the Microcode Sequencer (MS) unit - see Microcode_Sequencer node for details.",
|
||||
"MetricExpr": "cpu_core@IDQ.MS_CYCLES_ANY@ / tma_info_thread_clks / 1.8",
|
||||
"MetricExpr": "cpu_core@IDQ.MS_CYCLES_ANY@ * (8 - cpu_core@IDQ.MS_UOPS@ / cpu_core@IDQ.MS_CYCLES_ANY@) / tma_info_thread_slots",
|
||||
"MetricGroup": "MicroSeq;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_ms",
|
||||
"MetricThreshold": "tma_ms > 0.05 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2471,7 +2479,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2589,7 +2597,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by (indirect) RET instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET_COST@ * cpu_core@BR_MISP_RETIRED.RET_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ret_mispredicts",
|
||||
"MetricThreshold": "tma_ret_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -2664,7 +2672,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2679,8 +2687,8 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates clocks wasted due to loads blocked due to unknown store address (did not do memory disambiguation) or due to unknown store data",
|
||||
"MetricExpr": "7 * cpu_core@LD_BLOCKS.STORE_EARLY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"BriefDescription": "This metric roughly estimates clocks wasted due to loads blocked due to unknown store address (did not do memory disambiguation) or due to unknown store data",
|
||||
"MetricExpr": "cpu_core@LD_BLOCKS.STORE_EARLY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_store_early_blk",
|
||||
"MetricThreshold": "tma_store_early_blk > 0.2",
|
||||
@@ -2768,7 +2776,17 @@
|
||||
"MetricGroup": "MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueSmSt;tma_store_bound_group",
|
||||
"MetricName": "tma_streaming_stores",
|
||||
"MetricThreshold": "tma_streaming_stores > 0.2 & (tma_store_bound > 0.2 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates how often CPU was stalled due to Streaming store memory accesses; Streaming store optimize out a read request required by RFO stores. Even though store accesses do not typically stall out-of-order CPUs; there are few cases where stores can lead to actual stalls. This metric will be flagged should Streaming stores be a bottleneck. Sample with: OCR.STREAMING_WR.ANY_RESPONSE. Related metrics: tma_fb_full",
|
||||
"PublicDescription": "This metric estimates how often CPU was stalled due to Streaming store memory accesses; Streaming store optimize out a read request required by RFO stores. Even though store accesses do not typically stall out-of-order CPUs; there are few cases where stores can lead to actual stalls. This metric will be flagged should Streaming stores be a bottleneck. Sample with: OMR.STREAMING_WR.ANY_RESPONSE. Related metrics: tma_fb_full",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric roughly estimates fraction of cycles where the core's performance was likely hurt due to un-chacheable memory",
|
||||
"MetricExpr": "cpu_core@MEM_LOAD_MISC_RETIRED.UC@ / (cpu_core@MEM_LOAD_RETIRED.L2_HIT@ + cpu_core@MEM_LOAD_MISC_RETIRED.UC@) * cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_uc_bound",
|
||||
"MetricThreshold": "tma_uc_bound > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric roughly estimates fraction of cycles where the core's performance was likely hurt due to un-chacheable memory. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of request that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
@@ -8,6 +8,15 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
"PublicDescription": "Counts the number of (demand and L1 prefetchers) core requests rejected by the L2Q due to a full or nearly full w condition which likely indicates back pressure from L2Q. It also counts requests that would have gone directly to the XQ, but are rejected due to a full or nearly full condition, indicating back pressure from the IDI link. The L2Q may also reject transactions from a core to insure fairness between cores, or to delay a cores dirty eviction when the address conflicts incoming external snoops. (Note that L2 prefetcher requests that are dropped are not counted by this event.) Counts on a per core basis.",
|
||||
"SampleAfterValue": "200003",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of L1D cacheline (dirty) evictions caused by load misses, stores, and prefetches.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -310,6 +319,15 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x30",
|
||||
"EventName": "L2_REJECT_XQ.ANY",
|
||||
"PublicDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition which likely indicates back pressure from the IDI link. The XQ may reject transactions from the L2Q (non-cacheable requests), BBL (L2 misses) and WOB (L2 write-back victims).",
|
||||
"SampleAfterValue": "200003",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of L2 Cache Accesses Counts the total number of L2 Cache Accesses - sum of hits, misses, rejects front door requests for CRd/DRd/RFO/ItoM/L2 Prefetches only, per core event",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1382,6 +1400,16 @@
|
||||
"UMask": "0x83",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of memory uops retired. A single uop that performs both a load AND a store will be counted as 1, not 2 (e.g. ADD [mem], CONST)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_UOPS_RETIRED.ALL",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x83",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of load uops retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -510,6 +510,15 @@
|
||||
"UMask": "0x1f",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on all floating point ports.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.ALL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xf",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -519,6 +528,15 @@
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P0",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -528,6 +546,15 @@
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -537,6 +564,15 @@
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P2",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -555,6 +591,15 @@
|
||||
"UMask": "0x1e",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0, 1, 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.PRIMARY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xe",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer store data port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -173,6 +173,15 @@
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -182,6 +191,15 @@
|
||||
"UMask": "0x82",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x82",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of memory ordering machine clears triggered due to a snoop from an external agent. Does not count internally generated machine clears such as those due to disambiguations.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -93,7 +93,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -129,6 +128,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -209,7 +209,6 @@
|
||||
"EventName": "BR_INST_RETIRED.COND_TAKEN_FWD",
|
||||
"PublicDescription": "Counts taken forward conditional branch instructions retired. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x102",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -608,7 +607,7 @@
|
||||
"EventName": "BR_MISP_RETIRED.COND_TAKEN_BWD_COST",
|
||||
"PublicDescription": "number of branch instructions retired that were mispredicted and taken backward. This precise event may be used to get the misprediction cost via the Retire_Latency field of PEBS. It fires on the instruction that immediately follows the mispredicted branch. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x8001",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -637,7 +636,7 @@
|
||||
"EventName": "BR_MISP_RETIRED.COND_TAKEN_FWD_COST",
|
||||
"PublicDescription": "number of branch instructions retired that were mispredicted and taken forward. This precise event may be used to get the misprediction cost via the Retire_Latency field of PEBS. It fires on the instruction that immediately follows the mispredicted branch. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x8002",
|
||||
"UMask": "0x140",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -773,11 +772,11 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired. Non PEBS",
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
"EventCode": "0xc5",
|
||||
"EventName": "BR_MISP_RETIRED.RET",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts mispredicted return instructions retired. Available PDIST counters: 0,1",
|
||||
"PublicDescription": "This event counts the number of mispredicted ret instructions retired. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1239,7 +1238,7 @@
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
"EventCode": "0xc0",
|
||||
"EventName": "INST_RETIRED.REP_ITERATION",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note the number of iterations is implementation-dependent. Available PDIST counters: 0,1",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note: Since the number of iterations within a REP instruction can be significantly affected by fast strings, this event may vary run to run and not match the architectural number of iterations (specified by RCX) Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1326,6 +1325,15 @@
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on all Integer ports.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.ALL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a load port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1336,6 +1344,16 @@
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a load port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.LD",
|
||||
"PublicDescription": "Counts the number of uops executed on a load port. This event counts for integer uops even if the destination is FP/vector",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1345,6 +1363,15 @@
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P0",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1354,6 +1381,15 @@
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1363,6 +1399,15 @@
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P2",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1372,6 +1417,15 @@
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P3",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0,1, 2, 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1381,6 +1435,15 @@
|
||||
"UMask": "0x78",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0,1, 2, 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.PRIMARY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x78",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a Store address port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1391,6 +1454,16 @@
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a Store address port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.STA",
|
||||
"PublicDescription": "Counts the number of uops executed on a Store address port. This event counts integer uops even if the data source is FP/vector",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on an integer store data and jump port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1400,6 +1473,15 @@
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on an integer store data and jump port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.STD_JMP",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of vector integer instructions retired of 128-bit vector-width.",
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
@@ -1691,6 +1773,15 @@
|
||||
"UMask": "0x88",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machine clears that flush the pipeline and restart the machine without the use of microcode.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FAST",
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of virtual trap actually taken (e.g. highest priority event during retirement). It can count virtual trap from FPC port 0 or port 1 (x87/SSE) equally in a single counter.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -1700,6 +1791,15 @@
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of virtual traps taken.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FPC_VIRTUAL_TRAP",
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of nukes due to memory renaming",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -2015,6 +2115,15 @@
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots not consumed due to a color request for an FCW or MXCSR control register when all 4 colors (copies) are already in use.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x75",
|
||||
"EventName": "SERIALIZATION.COLOR_STALLS",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots where no uop could issue due to an IQ scoreboard that stalls allocation until a specified older uop retires or (in the case of jump scoreboard) executes. Commonly executed instructions with IQ scoreboards include LFENCE and MFENCE.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -2034,6 +2143,16 @@
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots not consumed by the backend due to a micro-sequencer (MS) scoreboard, which stalls the front-end from issuing from the UROM until a specified older uop retires.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x75",
|
||||
"EventName": "SERIALIZATION.NON_C01_MS_SCB",
|
||||
"PublicDescription": "Counts the number of issue slots not consumed by the backend due to a micro-sequencer (MS) scoreboard, which stalls the front-end from issuing from the UROM until a specified older uop retires. The most commonly executed instruction with an MS scoreboard is PAUSE.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_lowpower"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event counts a subset of the Topdown Slots event that were not consumed by the back-end pipeline due to lack of back-end resources, as a result of memory subsystem delays, execution units limitations, or other conditions.",
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "0",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 0.",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "2",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 0 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW.",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "1",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "3",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 1.",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "5",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 1 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW.",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "4",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
@@ -117,6 +117,66 @@
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). [This event is alias to UNC_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "0",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 0. [This event is alias to UNC_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "2",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 0 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW. [This event is alias to UNC_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). [This event is alias to UNC_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). [This event is alias to UNC_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "3",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 1. [This event is alias to UNC_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "5",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 1 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW. [This event is alias to UNC_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). [This event is alias to UNC_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "4",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PRE command sent to DRAM due to page table idle timer expiration",
|
||||
"Counter": "0,1,2,3,4",
|
||||
|
||||
@@ -91,6 +91,17 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts demand data reads that were supplied by DRAM.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xB7",
|
||||
"EventName": "OCR.DEMAND_DATA_RD.DRAM",
|
||||
"MSRIndex": "0x1a6,0x1a7",
|
||||
"MSRValue": "0x7BC000001",
|
||||
"PublicDescription": "Counts demand data reads that were supplied by DRAM. Available PDIST counters: 0",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts demand data reads that were not supplied by the L3 cache.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -102,6 +113,28 @@
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts demand data reads that were supplied by DRAM attached to this socket.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xB7",
|
||||
"EventName": "OCR.DEMAND_DATA_RD.LOCAL_DRAM",
|
||||
"MSRIndex": "0x1a6,0x1a7",
|
||||
"MSRValue": "0x784000001",
|
||||
"PublicDescription": "Counts demand data reads that were supplied by DRAM attached to this socket. Available PDIST counters: 0",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts demand data reads that were supplied by DRAM attached to another socket.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xB7",
|
||||
"EventName": "OCR.DEMAND_DATA_RD.REMOTE_DRAM",
|
||||
"MSRIndex": "0x1a6,0x1a7",
|
||||
"MSRValue": "0x730000001",
|
||||
"PublicDescription": "Counts demand data reads that were supplied by DRAM attached to another socket. Available PDIST counters: 0",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts demand read for ownership (RFO) requests and software prefetches for exclusive ownership (PREFETCHW) that were not supplied by the L3 cache.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -291,6 +291,25 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x50"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to BR_MISP_RETIRED.NEAR_RETURN]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xc5",
|
||||
"EventName": "BR_MISP_RETIRED.NEAR_RET",
|
||||
"PublicDescription": "This event is deprecated. [This event is alias to BR_MISP_RETIRED.NEAR_RETURN] Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of mispredicted near RET branch instructions retired. [This event is alias to BR_MISP_RETIRED.NEAR_RET]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc5",
|
||||
"EventName": "BR_MISP_RETIRED.NEAR_RETURN",
|
||||
"PublicDescription": "Counts the number of mispredicted near RET branch instructions retired. [This event is alias to BR_MISP_RETIRED.NEAR_RET] Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fixed Counter: Counts the number of unhalted core clock cycles. [This event is alias to CPU_CLK_UNHALTED.THREAD]",
|
||||
"Counter": "Fixed counter 1",
|
||||
|
||||
@@ -814,6 +814,16 @@
|
||||
"PerPkg": "1",
|
||||
"Unit": "IRP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts Timeouts - Set 0 : Cache Inserts of Write Transactions as Secondary",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x1E",
|
||||
"EventName": "UNC_I_MISC0.2ND_WR_INSERT",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"UMask": "0x8",
|
||||
"Unit": "IRP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts Timeouts - Set 0 : Fastpath Rejects",
|
||||
"Counter": "0,1,2,3",
|
||||
|
||||
@@ -520,7 +520,7 @@
|
||||
"Unit": "IMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to (?) : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to page table : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "UNC_M_PRE_COUNT.PGT",
|
||||
|
||||
@@ -368,6 +368,15 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when L1D is locked",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x42",
|
||||
"EventName": "LOCK_CYCLES.CACHE_LOCK_DURATION",
|
||||
"PublicDescription": "This event counts the number of cycles when the L1D is locked. It is a superset of the 0x1 mask (BUS_LOCK_CLOCKS.BUS_LOCK_DURATION).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core-originated cacheable requests that missed L3 (Except hardware prefetches to the L3)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -84,6 +84,18 @@
|
||||
"PublicDescription": "Ratio of number of completed page walks (for all page sizes) caused by demand data stores to the total number of completed instructions. This implies it missed in the DTLB and further levels of TLB",
|
||||
"ScaleUnit": "1per_instr"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth observed by the integrated I/O traffic controller (IIO) of IO reads that are initiated by end device controllers that are requesting memory from the CPU",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.ALL_PARTS * 4 / 1e6 / duration_time",
|
||||
"MetricName": "iio_bandwidth_read",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth observed by the integrated I/O traffic controller (IIO) of IO writes that are initiated by end device controllers that are writing memory to the CPU",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.ALL_PARTS * 4 / 1e6 / duration_time",
|
||||
"MetricName": "iio_bandwidth_write",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth of IO reads that are initiated by end device controllers that are requesting memory from the CPU",
|
||||
"MetricExpr": "UNC_CHA_TOR_INSERTS.IO_PCIRDCUR * 64 / 1e6 / duration_time",
|
||||
@@ -242,6 +254,30 @@
|
||||
"MetricName": "llc_demand_data_read_miss_to_dram_latency",
|
||||
"ScaleUnit": "1ns"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth (MB/sec) of read requests that miss the last level cache (LLC) and go to local memory",
|
||||
"MetricExpr": "UNC_CHA_REQUESTS.READS_LOCAL * 64 / 1e6 / duration_time",
|
||||
"MetricName": "llc_miss_local_memory_bandwidth_read",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth (MB/sec) of write requests that miss the last level cache (LLC) and go to local memory",
|
||||
"MetricExpr": "UNC_CHA_REQUESTS.WRITES_LOCAL * 64 / 1e6 / duration_time",
|
||||
"MetricName": "llc_miss_local_memory_bandwidth_write",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth (MB/sec) of read requests that miss the last level cache (LLC) and go to remote memory",
|
||||
"MetricExpr": "UNC_CHA_REQUESTS.READS_REMOTE * 64 / 1e6 / duration_time",
|
||||
"MetricName": "llc_miss_remote_memory_bandwidth_read",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Bandwidth (MB/sec) of write requests that miss the last level cache (LLC) and go to remote memory",
|
||||
"MetricExpr": "UNC_CHA_REQUESTS.WRITES_REMOTE * 64 / 1e6 / duration_time",
|
||||
"MetricName": "llc_miss_remote_memory_bandwidth_write",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "The ratio of number of completed memory load instructions to the total number completed instructions",
|
||||
"MetricExpr": "MEM_INST_RETIRED.ALL_LOADS / INST_RETIRED.ANY",
|
||||
@@ -403,15 +439,15 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + 0 / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + 0 / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full"
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + 0 / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + 0 / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -434,7 +470,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / max(tma_memory_bound, tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / max(tma_l1_bound, tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / max(tma_memory_bound, tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / max(tma_l1_bound, tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -442,7 +478,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) * tma_remote_cache / (tma_local_mem + tma_remote_cache + tma_remote_mem) + tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) * tma_remote_cache / (tma_local_mem + tma_remote_cache + tma_remote_mem) + tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -594,13 +630,13 @@
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "74.6 * tma_info_system_core_frequency * (MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD + MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD * (1 - OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM / (OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM + OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HIT_WITH_FWD))) * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -621,15 +657,6 @@
|
||||
"PublicDescription": "This metric represents fraction of cycles where the Divider unit was active. Divide and square root instructions are performed by the Divider unit and can take considerably longer latency than integer or Floating Point addition; subtraction; or multiplication. Sample with: ARITH.DIV_ACTIVE",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(IDQ.DSB_CYCLES_ANY - IDQ.DSB_CYCLES_OK) / tma_info_core_core_clks / 2",
|
||||
@@ -681,7 +708,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -974,7 +1001,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / UOPS_ISSUED.ANY",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 6 > 0.35",
|
||||
@@ -1092,7 +1119,7 @@
|
||||
{
|
||||
"BriefDescription": "Instructions per FP Arithmetic Scalar Half-Precision instruction (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / FP_ARITH_INST_RETIRED2.SCALAR",
|
||||
"MetricGroup": "Flops;FpScalar;InsType;Server",
|
||||
"MetricGroup": "Flops;FpScalar;InsType",
|
||||
"MetricName": "tma_info_inst_mix_iparith_scalar_hp",
|
||||
"MetricThreshold": "tma_info_inst_mix_iparith_scalar_hp < 10",
|
||||
"PublicDescription": "Instructions per FP Arithmetic Scalar Half-Precision instruction (lower number means higher occurrence rate). Values < 1 are possible due to intentional FMA double counting."
|
||||
@@ -1161,6 +1188,14 @@
|
||||
"MetricThreshold": "tma_info_inst_mix_iptb < 13",
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * ASSISTS.SSE_AVX_MIX / INST_RETIRED.ANY",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L1 data cache [GB / sec]",
|
||||
"MetricExpr": "tma_info_memory_l1d_cache_fill_bw",
|
||||
@@ -1402,7 +1437,7 @@
|
||||
"MetricName": "tma_info_memory_tlb_store_stlb_mpki"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Mem;Backend;CacheHits",
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is execution) per physical core",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / (UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 if #SMT_on else cpu@UOPS_EXECUTED.THREAD\\,cmask\\=1@)",
|
||||
"MetricGroup": "Cor;Pipeline;PortsUtil;SMT",
|
||||
"MetricName": "tma_info_pipeline_execute"
|
||||
@@ -1482,7 +1517,7 @@
|
||||
"MetricExpr": "64 * (UNC_M_CAS_COUNT.RD + UNC_M_CAS_COUNT.WR) / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full"
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Giga Floating Point Operations Per Second",
|
||||
@@ -1532,13 +1567,6 @@
|
||||
"MetricName": "tma_info_system_mem_dram_read_latency",
|
||||
"PublicDescription": "Average latency of data read request to external DRAM memory [in nanoseconds]. Accounts for demand loads and L1/L2 data-read prefetches"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uncore cycles where requests got rejected due to duplicate address already in IRQ ingress queue in the cache homing agent",
|
||||
"MetricExpr": "UNC_CHA_RxC_IRQ1_REJECT.PA_MATCH / UNC_CHA_CLOCKTICKS",
|
||||
"MetricGroup": "LockCont;MemOffcore;Server;SoC",
|
||||
"MetricName": "tma_info_system_mem_irq_duplicate_address",
|
||||
"MetricThreshold": "tma_info_system_mem_irq_duplicate_address > 0.1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average number of parallel data read requests to external memory",
|
||||
"MetricExpr": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_DRD / UNC_CHA_TOR_OCCUPANCY.IA_MISS_DRD@thresh\\=1@",
|
||||
@@ -1591,12 +1619,6 @@
|
||||
"MetricGroup": "Power",
|
||||
"MetricName": "tma_info_system_turbo_utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cross-socket Ultra Path Interconnect (UPI) data transmit bandwidth for data only [MB / sec]",
|
||||
"MetricExpr": "UNC_UPI_TxL_FLITS.ALL_DATA * 64 / 9 / 1e6",
|
||||
@@ -1752,6 +1774,15 @@
|
||||
"PublicDescription": "This metric estimates fraction of cycles with demand load accesses that hit the L3 cache under unloaded scenarios (possibly L3 latency limited). Avoiding private cache misses (i.e. L2 misses/L3 hits) will improve the latency; reduce contention with sibling physical cores and increase performance. Note the value of this node may overlap with its siblings. Sample with: MEM_LOAD_RETIRED.L3_HIT_PS. Related metrics: tma_bottleneck_data_cache_memory_latency, tma_mem_latency",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles CPU was stalled due to Length Changing Prefixes (LCPs)",
|
||||
"MetricExpr": "DECODE.LCP / tma_info_thread_clks",
|
||||
@@ -1826,14 +1857,14 @@
|
||||
"MetricExpr": "72 * tma_info_system_core_frequency * MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Server;TopdownL5;tma_L5_group;tma_mem_latency_group",
|
||||
"MetricName": "tma_local_mem",
|
||||
"MetricThreshold": "tma_local_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_local_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from local memory. Caching will improve the latency and increase performance. Sample with: MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU spent handling cache misses due to lock operations",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(16 * max(0, MEM_INST_RETIRED.LOCK_LOADS - L2_RQSTS.ALL_RFO) + MEM_INST_RETIRED.LOCK_LOADS / MEM_INST_RETIRED.ALL_STORES * (10 * L2_RQSTS.RFO_HIT + min(CPU_CLK_UNHALTED.THREAD, OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO))) / tma_info_thread_clks",
|
||||
"MetricExpr": "LOCK_CYCLES.CACHE_LOCK_DURATION / tma_info_thread_clks",
|
||||
"MetricGroup": "LockCont;Offcore;TopdownL4;tma_L4_group;tma_issueRFO;tma_l1_bound_group",
|
||||
"MetricName": "tma_lock_latency",
|
||||
"MetricThreshold": "tma_lock_latency > 0.2 & (tma_l1_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
@@ -1856,24 +1887,24 @@
|
||||
"MetricExpr": "INT_MISC.MBA_STALLS / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBW;Offcore;Server;TopdownL5;tma_L5_group;tma_mem_bandwidth_group",
|
||||
"MetricName": "tma_mba_stalls",
|
||||
"MetricThreshold": "tma_mba_stalls > 0.1 & (tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_mba_stalls > 0.1 & (tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, cpu@OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, cpu@OFFCORE_REQUESTS_OUTSTANDING.ALL_DATA_RD\\,cmask\\=12@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
@@ -1937,7 +1968,7 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -1954,7 +1985,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -2090,7 +2121,7 @@
|
||||
"MetricExpr": "(133 * tma_info_system_core_frequency * MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM + 133 * tma_info_system_core_frequency * MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD) * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Offcore;Server;Snoop;TopdownL5;tma_L5_group;tma_issueSyncxn;tma_mem_latency_group",
|
||||
"MetricName": "tma_remote_cache",
|
||||
"MetricThreshold": "tma_remote_cache > 0.05 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_remote_cache > 0.05 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote cache in other sockets including synchronizations issues. This is caused often due to non-optimal NUMA allocations. #link to NUMA article. Sample with: MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM_PS;MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD_PS. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_data_sharing, tma_false_sharing, tma_machine_clears",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
@@ -2099,7 +2130,7 @@
|
||||
"MetricExpr": "153 * tma_info_system_core_frequency * MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Server;Snoop;TopdownL5;tma_L5_group;tma_mem_latency_group",
|
||||
"MetricName": "tma_remote_mem",
|
||||
"MetricThreshold": "tma_remote_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_remote_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote memory. This is caused often due to non-optimal NUMA allocations. #link to NUMA article. Sample with: MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM_PS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
@@ -2143,7 +2174,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles handling memory load split accesses - load that cross 64-byte cache line boundary",
|
||||
"MetricExpr": "tma_info_memory_load_miss_real_latency * LD_BLOCKS.NO_SR / tma_info_thread_clks",
|
||||
"MetricExpr": "MEM_INST_RETIRED.SPLIT_LOADS * tma_info_memory_load_miss_real_latency / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_split_loads",
|
||||
"MetricThreshold": "tma_split_loads > 0.3",
|
||||
@@ -2165,7 +2196,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -2277,6 +2308,12 @@
|
||||
"MetricName": "uncore_frequency",
|
||||
"ScaleUnit": "1GHz"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Intel(R) Ultra Path Interconnect (UPI) data receive bandwidth (MB/sec)",
|
||||
"MetricExpr": "UNC_UPI_RxL_FLITS.ALL_DATA * 7.111111111111111 / 1e6 / duration_time",
|
||||
"MetricName": "upi_data_receive_bw",
|
||||
"ScaleUnit": "1MB/s"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Intel(R) Ultra Path Interconnect (UPI) data transmit bandwidth (MB/sec)",
|
||||
"MetricExpr": "UNC_UPI_TxL_FLITS.ALL_DATA * 7.111111111111111 / 1e6 / duration_time",
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -124,6 +123,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
"PublicDescription": "Counts the number of (demand and L1 prefetchers) core requests rejected by the L2Q due to a full or nearly full w condition which likely indicates back pressure from L2Q. It also counts requests that would have gone directly to the XQ, but are rejected due to a full or nearly full condition, indicating back pressure from the IDI link. The L2Q may also reject transactions from a core to insure fairness between cores, or to delay a cores dirty eviction when the address conflicts incoming external snoops. (Note that L2 prefetcher requests that are dropped are not counted by this event.) Counts on a per core basis.",
|
||||
"SampleAfterValue": "200003"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of L1D cacheline (dirty) evictions caused by load misses, stores, and prefetches.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -62,6 +70,14 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x30",
|
||||
"EventName": "L2_REJECT_XQ.ANY",
|
||||
"PublicDescription": "Counts the number of demand and prefetch transactions that the External Queue (XQ) rejects due to a full or near full condition which likely indicates back pressure from the IDI link. The XQ may reject transactions from the L2Q (non-cacheable requests), BBL (L2 misses) and WOB (L2 write-back victims).",
|
||||
"SampleAfterValue": "200003"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of L2 Cache Accesses that resulted in a Hit from a front door request only (does not include rejects or recycles), per core event",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -322,6 +338,15 @@
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of memory uops retired. A single uop that performs both a load AND a store will be counted as 1, not 2 (e.g. ADD [mem], CONST)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_UOPS_RETIRED.ALL",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x83"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of load ops retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
[
|
||||
{
|
||||
"Unit": "core",
|
||||
"CountersNumFixed": "3",
|
||||
"CountersNumGeneric": "8"
|
||||
},
|
||||
{
|
||||
"Unit": "B2CMI",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
},
|
||||
{
|
||||
"Unit": "CHA",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
},
|
||||
{
|
||||
"Unit": "IMC",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
},
|
||||
{
|
||||
"Unit": "IIO",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
},
|
||||
{
|
||||
"Unit": "IRP",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
},
|
||||
{
|
||||
"Unit": "PCU",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": 4
|
||||
},
|
||||
{
|
||||
"Unit": "CHACMS",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "4"
|
||||
}
|
||||
]
|
||||
@@ -8,6 +8,22 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of active floating point dividers per cycle in the loop stage.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.FPDIV_OCCUPANCY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of floating point divider uops executed per cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.FPDIV_UOPS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of all types of floating point operations per uop with all default weighting",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -90,6 +106,46 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on all floating point ports.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.ALL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xf"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P0",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P2",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0, 1, 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.PRIMARY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xe"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer store data port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to any number of reasons, including an L1 miss, WCB full, pagewalk, store address block or store data block.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ANY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x7f"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to any number of reasons, including an L1 miss, WCB full, pagewalk, store address block or store data block, on a load that retires.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -15,6 +23,14 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xf4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a DL1 miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.L1_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a DL1 miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -23,6 +39,15 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x81"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to other block cases.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.OTHER",
|
||||
"PublicDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to other block cases such as pipeline conflicts, fences, etc.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to other block cases.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -32,6 +57,14 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xc0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a pagewalk.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.PGWALK",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a pagewalk.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -40,6 +73,14 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xa0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a store address match.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ST_ADDR",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a store address match.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -48,6 +89,22 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x84"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x82"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machine clears due to memory ordering caused by a snoop from an external agent. Does not count internally generated machine clears such as those due to memory disambiguation.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -8,6 +8,31 @@
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x3"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles when any of the integer dividers are active.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.IDIV_ACTIVE",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of active integer dividers per cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.IDIV_OCCUPANCY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of integer divider uops executed per cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.IDIV_UOPS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number of branch instructions retired for all branch types.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -113,6 +138,14 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xdf"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of taken branch instructions retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc4",
|
||||
"EventName": "BR_INST_RETIRED.TAKEN",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number of mispredicted branch instructions retired for all branch types.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -236,6 +269,80 @@
|
||||
"EventName": "INST_RETIRED.ANY_P",
|
||||
"SampleAfterValue": "2000003"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on all Integer ports.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.ALL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a load port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.LD",
|
||||
"PublicDescription": "Counts the number of uops executed on a load port. This event counts for integer uops even if the destination is FP/vector",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P0",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P2",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.P3",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on integer port 0,1, 2, 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.PRIMARY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x78"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on a Store address port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.STA",
|
||||
"PublicDescription": "Counts the number of uops executed on a Store address port. This event counts integer uops even if the data source is FP/vector",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on an integer store data and jump port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "INT_UOPS_EXECUTED.STD_JMP",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of retired loads that are blocked because it initially appears to be store forward blocked, but subsequently is shown not to be blocked based on 4K alias check.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -275,6 +382,22 @@
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machine clears that flush the pipeline and restart the machine without the use of microcode.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FAST",
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of virtual traps taken.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FPC_VIRTUAL_TRAP",
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machines clears due to memory renaming.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -356,6 +479,23 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots not consumed due to a color request for an FCW or MXCSR control register when all 4 colors (copies) are already in use.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x75",
|
||||
"EventName": "SERIALIZATION.COLOR_STALLS",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots not consumed by the backend due to a micro-sequencer (MS) scoreboard, which stalls the front-end from issuing from the UROM until a specified older uop retires.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x75",
|
||||
"EventName": "SERIALIZATION.NON_C01_MS_SCB",
|
||||
"PublicDescription": "Counts the number of issue slots not consumed by the backend due to a micro-sequencer (MS) scoreboard, which stalls the front-end from issuing from the UROM until a specified older uop retires. The most commonly executed instruction with an MS scoreboard is PAUSE.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of issue slots that were not consumed by the backend because allocation is stalled due to a mispredicted jump or a machine clear. [This event is alias to TOPDOWN_BAD_SPECULATION.ALL_P]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -448,7 +448,7 @@
|
||||
"Unit": "IMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to (?) : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to page table : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "UNC_M_PRE_COUNT.PGT",
|
||||
|
||||
@@ -137,6 +137,14 @@
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a DTLB miss",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.DTLB_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a DTLB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -452,15 +452,15 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full"
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + 0 / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency) + tma_memory_bound * (tma_l3_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -483,7 +483,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -491,7 +491,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) * tma_remote_cache / (tma_local_mem + tma_remote_cache + tma_remote_mem) + tma_l3_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_cxl_mem_bound + tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) * tma_remote_cache / (tma_local_mem + tma_remote_cache + tma_remote_mem) + tma_l3_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_cxl_mem_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -624,7 +624,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by non-taken conditional branches.",
|
||||
"MetricExpr": "BR_MISP_RETIRED.COND_NTAKEN_COST * BR_MISP_RETIRED.COND_NTAKEN_COST:R / tma_info_thread_clks",
|
||||
"MetricExpr": "BR_MISP_RETIRED.COND_NTAKEN / BR_MISP_RETIRED.ALL_BRANCHES * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_nt_mispredicts",
|
||||
"MetricThreshold": "tma_cond_nt_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -632,7 +632,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by taken conditional branches.",
|
||||
"MetricExpr": "BR_MISP_RETIRED.COND_TAKEN_COST * BR_MISP_RETIRED.COND_TAKEN_COST:R / tma_info_thread_clks",
|
||||
"MetricExpr": "BR_MISP_RETIRED.COND_TAKEN / BR_MISP_RETIRED.ALL_BRANCHES * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -668,13 +668,13 @@
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD * min(MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD:R, 74.6 * tma_info_system_core_frequency) + MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD * min(MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD:R, 74.6 * tma_info_system_core_frequency) * (1 - OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM / (OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM + OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HIT_WITH_FWD))) * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -695,15 +695,6 @@
|
||||
"PublicDescription": "This metric represents fraction of cycles where the Divider unit was active. Divide and square root instructions are performed by the Divider unit and can take considerably longer latency than integer or Floating Point addition; subtraction; or multiplication. Sample with: ARITH.DIV_ACTIVE",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "(MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks - tma_cxl_mem_bound if #has_pmem > 0 else MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks)",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(IDQ.DSB_CYCLES_ANY - IDQ.DSB_CYCLES_OK) / tma_info_core_core_clks / 2",
|
||||
@@ -755,7 +746,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -902,7 +893,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect CALL instructions.",
|
||||
"MetricExpr": "BR_MISP_RETIRED.INDIRECT_CALL_COST * BR_MISP_RETIRED.INDIRECT_CALL_COST:R / tma_info_thread_clks",
|
||||
"MetricExpr": "BR_MISP_RETIRED.INDIRECT_CALL / BR_MISP_RETIRED.ALL_BRANCHES * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_call_mispredicts",
|
||||
"MetricThreshold": "tma_ind_call_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -910,7 +901,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect JMP instructions.",
|
||||
"MetricExpr": "max((BR_MISP_RETIRED.INDIRECT_COST * BR_MISP_RETIRED.INDIRECT_COST:R - BR_MISP_RETIRED.INDIRECT_CALL_COST * BR_MISP_RETIRED.INDIRECT_CALL_COST:R) / tma_info_thread_clks, 0)",
|
||||
"MetricExpr": "max((BR_MISP_RETIRED.INDIRECT - BR_MISP_RETIRED.INDIRECT_CALL) / BR_MISP_RETIRED.ALL_BRANCHES * tma_branch_mispredicts, 0)",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_jump_mispredicts",
|
||||
"MetricThreshold": "tma_ind_jump_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1045,7 +1036,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Floating Point Operations Per Cycle",
|
||||
"MetricExpr": "(cpu@FP_ARITH_INST_RETIRED.SCALAR_SINGLE\\,umask\\=0x03@ + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * cpu@FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE\\,umask\\=0x18@ + 8 * cpu@FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE\\,umask\\=0x60@ + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE) / tma_info_core_core_clks",
|
||||
"MetricExpr": "(FP_ARITH_INST_RETIRED.SCALAR + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * FP_ARITH_INST_RETIRED.4_FLOPS + 8 * FP_ARITH_INST_RETIRED.8_FLOPS + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE) / tma_info_core_core_clks",
|
||||
"MetricGroup": "Flops;Ret",
|
||||
"MetricName": "tma_info_core_flopc"
|
||||
},
|
||||
@@ -1064,7 +1055,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / UOPS_ISSUED.ANY",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 6 > 0.35",
|
||||
@@ -1202,7 +1193,7 @@
|
||||
{
|
||||
"BriefDescription": "Instructions per FP Arithmetic Scalar Half-Precision instruction (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / FP_ARITH_INST_RETIRED2.SCALAR",
|
||||
"MetricGroup": "Flops;FpScalar;InsType;Server",
|
||||
"MetricGroup": "Flops;FpScalar;InsType",
|
||||
"MetricName": "tma_info_inst_mix_iparith_scalar_hp",
|
||||
"MetricThreshold": "tma_info_inst_mix_iparith_scalar_hp < 10",
|
||||
"PublicDescription": "Instructions per FP Arithmetic Scalar Half-Precision instruction (lower number means higher occurrence rate). Values < 1 are possible due to intentional FMA double counting."
|
||||
@@ -1231,7 +1222,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Floating Point (FP) Operation (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / (cpu@FP_ARITH_INST_RETIRED.SCALAR_SINGLE\\,umask\\=0x03@ + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * cpu@FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE\\,umask\\=0x18@ + 8 * cpu@FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE\\,umask\\=0x60@ + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / (FP_ARITH_INST_RETIRED.SCALAR + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * FP_ARITH_INST_RETIRED.4_FLOPS + 8 * FP_ARITH_INST_RETIRED.8_FLOPS + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE)",
|
||||
"MetricGroup": "Flops;InsType",
|
||||
"MetricName": "tma_info_inst_mix_ipflop",
|
||||
"MetricThreshold": "tma_info_inst_mix_ipflop < 10"
|
||||
@@ -1271,6 +1262,14 @@
|
||||
"MetricThreshold": "tma_info_inst_mix_iptb < 13",
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * ASSISTS.SSE_AVX_MIX / INST_RETIRED.ANY",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L1 data cache [GB / sec]",
|
||||
"MetricExpr": "tma_info_memory_l1d_cache_fill_bw",
|
||||
@@ -1526,7 +1525,7 @@
|
||||
"MetricName": "tma_info_memory_tlb_store_stlb_mpki"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Mem;Backend;CacheHits",
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is execution) per physical core",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / (UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 if #SMT_on else cpu@UOPS_EXECUTED.THREAD\\,cmask\\=1@)",
|
||||
"MetricGroup": "Cor;Pipeline;PortsUtil;SMT",
|
||||
"MetricName": "tma_info_pipeline_execute"
|
||||
@@ -1606,11 +1605,11 @@
|
||||
"MetricExpr": "64 * (UNC_M_CAS_COUNT_SCH0.RD + UNC_M_CAS_COUNT_SCH1.RD + UNC_M_CAS_COUNT_SCH0.WR + UNC_M_CAS_COUNT_SCH1.WR) / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full"
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Giga Floating Point Operations Per Second",
|
||||
"MetricExpr": "(cpu@FP_ARITH_INST_RETIRED.SCALAR_SINGLE\\,umask\\=0x03@ + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * cpu@FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE\\,umask\\=0x18@ + 8 * cpu@FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE\\,umask\\=0x60@ + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE) / 1e9 / tma_info_system_time",
|
||||
"MetricExpr": "(FP_ARITH_INST_RETIRED.SCALAR + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * FP_ARITH_INST_RETIRED.4_FLOPS + 8 * FP_ARITH_INST_RETIRED.8_FLOPS + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE) / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "Cor;Flops;HPC",
|
||||
"MetricName": "tma_info_system_gflops",
|
||||
"PublicDescription": "Giga Floating Point Operations Per Second. Aggregate across all supported options of: FP precisions, scalar and vector instructions, vector-width"
|
||||
@@ -1701,12 +1700,6 @@
|
||||
"MetricGroup": "Power",
|
||||
"MetricName": "tma_info_system_turbo_utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cross-socket Ultra Path Interconnect (UPI) data transmit bandwidth for data only [MB / sec]",
|
||||
"MetricExpr": "UNC_UPI_TxL_FLITS.ALL_DATA * 64 / 9 / 1e6",
|
||||
@@ -1862,6 +1855,15 @@
|
||||
"PublicDescription": "This metric estimates fraction of cycles with demand load accesses that hit the L3 cache under unloaded scenarios (possibly L3 latency limited). Avoiding private cache misses (i.e. L2 misses/L3 hits) will improve the latency; reduce contention with sibling physical cores and increase performance. Note the value of this node may overlap with its siblings. Sample with: MEM_LOAD_RETIRED.L3_HIT_PS. Related metrics: tma_bottleneck_data_cache_memory_latency, tma_mem_latency",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "(MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks - tma_cxl_mem_bound if #has_pmem > 0 else MEMORY_ACTIVITY.STALLS_L3_MISS / tma_info_thread_clks)",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles CPU was stalled due to Length Changing Prefixes (LCPs)",
|
||||
"MetricExpr": "DECODE.LCP / tma_info_thread_clks",
|
||||
@@ -1936,7 +1938,7 @@
|
||||
"MetricExpr": "MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM * MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM:R * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Server;TopdownL5;tma_L5_group;tma_mem_latency_group",
|
||||
"MetricName": "tma_local_mem",
|
||||
"MetricThreshold": "tma_local_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_local_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from local memory. Caching will improve the latency and increase performance. Sample with: MEM_LOAD_L3_MISS_RETIRED.LOCAL_DRAM",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
@@ -1966,24 +1968,24 @@
|
||||
"MetricExpr": "INT_MISC.MBA_STALLS / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBW;Offcore;Server;TopdownL5;tma_L5_group;tma_mem_bandwidth_group",
|
||||
"MetricName": "tma_mba_stalls",
|
||||
"MetricThreshold": "tma_mba_stalls > 0.1 & (tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_mba_stalls > 0.1 & (tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, cpu@OFFCORE_REQUESTS_OUTSTANDING.DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, cpu@OFFCORE_REQUESTS_OUTSTANDING.DATA_RD\\,cmask\\=12@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(CPU_CLK_UNHALTED.THREAD, OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
@@ -2047,7 +2049,7 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -2064,7 +2066,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
@@ -2197,25 +2199,25 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote cache in other sockets including synchronizations issues",
|
||||
"MetricExpr": "(MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM * PEBS + MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD * PEBS) * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricExpr": "(MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM * MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM:R + MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD * MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD:R) * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Offcore;Server;Snoop;TopdownL5;tma_L5_group;tma_issueSyncxn;tma_mem_latency_group",
|
||||
"MetricName": "tma_remote_cache",
|
||||
"MetricThreshold": "tma_remote_cache > 0.05 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_remote_cache > 0.05 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote cache in other sockets including synchronizations issues. This is caused often due to non-optimal NUMA allocations. #link to NUMA article. Sample with: MEM_LOAD_L3_MISS_RETIRED.REMOTE_HITM_PS;MEM_LOAD_L3_MISS_RETIRED.REMOTE_FWD_PS. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_data_sharing, tma_false_sharing, tma_machine_clears",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote memory",
|
||||
"MetricExpr": "MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM * PEBS * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricExpr": "MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM * MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM:R * (1 + MEM_LOAD_RETIRED.FB_HIT / MEM_LOAD_RETIRED.L1_MISS / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "Server;Snoop;TopdownL5;tma_L5_group;tma_mem_latency_group",
|
||||
"MetricName": "tma_remote_mem",
|
||||
"MetricThreshold": "tma_remote_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"MetricThreshold": "tma_remote_mem > 0.1 & (tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling loads from remote memory. This is caused often due to non-optimal NUMA allocations. #link to NUMA article. Sample with: MEM_LOAD_L3_MISS_RETIRED.REMOTE_DRAM_PS",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by (indirect) RET instructions.",
|
||||
"MetricExpr": "BR_MISP_RETIRED.RET_COST * BR_MISP_RETIRED.RET_COST:R / tma_info_thread_clks",
|
||||
"MetricExpr": "BR_MISP_RETIRED.RET / BR_MISP_RETIRED.ALL_BRANCHES * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ret_mispredicts",
|
||||
"MetricThreshold": "tma_ret_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -2283,7 +2285,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -124,6 +123,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -559,7 +559,7 @@
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc0",
|
||||
"EventName": "INST_RETIRED.REP_ITERATION",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note the number of iterations is implementation-dependent.",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note: Since the number of iterations within a REP instruction can be significantly affected by fast strings, this event may vary run to run and not match the architectural number of iterations (specified by RCX)",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
|
||||
@@ -808,6 +808,16 @@
|
||||
"PerPkg": "1",
|
||||
"Unit": "IRP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts Timeouts - Set 0 : Cache Inserts of Write Transactions as Secondary",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x1E",
|
||||
"EventName": "UNC_I_MISC0.2ND_WR_INSERT",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"UMask": "0x8",
|
||||
"Unit": "IRP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts Timeouts - Set 0 : Fastpath Rejects",
|
||||
"Counter": "0,1,2,3",
|
||||
|
||||
@@ -539,7 +539,7 @@
|
||||
"Unit": "IMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to (?) : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"BriefDescription": "DRAM Precharge commands. : Precharge due to page table : Counts the number of DRAM Precharge commands sent on this channel.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "UNC_M_PRE_COUNT.PGT",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of request that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
|
||||
@@ -783,16 +783,16 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency + tma_uc_bound)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_capacity / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency + tma_uc_bound)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_capacity / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -818,7 +818,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_capacity + tma_lock_latency + tma_split_loads + tma_store_early_blk + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -827,7 +827,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -975,7 +975,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by non-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@ * cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_nt_mispredicts",
|
||||
"MetricThreshold": "tma_cond_nt_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -984,7 +984,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by backward-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD_COST@ * cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_BWD@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_bwd_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_bwd_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -993,7 +993,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by forward-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD_COST@ * cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_FWD@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_fwd_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_fwd_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1022,13 +1022,13 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@R, 24 * tma_info_system_core_frequency) + cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@R, 25 * tma_info_system_core_frequency)) * (1 + cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@MEM_LOAD_RETIRED.L1_MISS@ / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1042,19 +1042,9 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.MEM@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / 2 + cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_dsb) / 8 + cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricGroup": "DSB;FetchBW;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_dsb",
|
||||
"MetricThreshold": "tma_dsb > 0.15 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -1108,7 +1098,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1205,7 +1195,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric approximates arithmetic FP vector uops fraction the CPU has retired for 256-bit wide vectors",
|
||||
"MetricExpr": "cpu_core@FP_ARITH_OPS_RETIRED.VECTOR\\,umask\\=0x30@ / (tma_retiring * tma_info_thread_slots)",
|
||||
"MetricExpr": "cpu_core@FP_ARITH_OPS_RETIRED.VECTOR_256B@ / (tma_retiring * tma_info_thread_slots)",
|
||||
"MetricGroup": "Compute;Flops;TopdownL5;tma_L5_group;tma_fp_vector_group;tma_issue2P",
|
||||
"MetricName": "tma_fp_vector_256b",
|
||||
"MetricThreshold": "tma_fp_vector_256b > 0.1 & (tma_fp_vector > 0.1 & (tma_fp_arith > 0.2 & tma_light_operations > 0.6))",
|
||||
@@ -1248,7 +1238,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to instruction cache misses",
|
||||
"MetricExpr": "cpu_core@ICACHE_DATA.STALLS@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@ICACHE_DATA.STALLS@ / tma_info_thread_clks + tma_isb_full",
|
||||
"MetricGroup": "BigFootprint;BvBC;FetchLat;IcMiss;TopdownL3;tma_L3_group;tma_fetch_latency_group",
|
||||
"MetricName": "tma_icache_misses",
|
||||
"MetricThreshold": "tma_icache_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
@@ -1258,7 +1248,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect CALL instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_call_mispredicts",
|
||||
"MetricThreshold": "tma_ind_call_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1267,7 +1257,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect JMP instructions.",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_COST@R - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R) / tma_info_thread_clks, 0)",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT@ - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@) / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts, 0)",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_jump_mispredicts",
|
||||
"MetricThreshold": "tma_ind_jump_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1437,7 +1427,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 8 > 0.35",
|
||||
@@ -1504,7 +1494,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the LSD (Loop Stream Detector; aka Loop Cache)",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "Fed;LSD",
|
||||
"MetricName": "tma_info_frontend_lsd_coverage",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1663,6 +1653,15 @@
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * cpu_core@ASSISTS.SSE_AVX_MIX@ / cpu_core@INST_RETIRED.ANY@",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fill Buffer (FB) hits per kilo instructions for retired demand loads (L1D misses that merge into ongoing miss-handling entries)",
|
||||
"MetricExpr": "1e3 * cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@INST_RETIRED.ANY@",
|
||||
@@ -1929,6 +1928,13 @@
|
||||
"MetricName": "tma_info_pipeline_retire",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total percent of cycles without actually retired uops",
|
||||
"MetricExpr": "cpu_core@UOPS_RETIRED.STALLS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "Pipeline;Ret",
|
||||
"MetricName": "tma_info_pipeline_retire_stall",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Estimated fraction of retirement-cycles dealing with repeat instructions",
|
||||
"MetricExpr": "cpu_core@INST_RETIRED.REP_ITERATION@ / cpu_core@UOPS_RETIRED.SLOTS\\,cmask\\=1@",
|
||||
@@ -1971,7 +1977,7 @@
|
||||
"MetricExpr": "32 * UNC_M_TOTAL_DATA / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -2042,13 +2048,6 @@
|
||||
"MetricName": "tma_info_system_turbo_utilization",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Per-Logical Processor actual clocks when the Logical Processor is active.",
|
||||
"MetricExpr": "cpu_core@CPU_CLK_UNHALTED.THREAD@",
|
||||
@@ -2140,9 +2139,18 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles Icache tag lookup was stalled due to Instruction Stream Buffer (ISB) being full",
|
||||
"MetricExpr": "(cpu_core@ICACHE_TAG.STALLS_ISB@ + cpu_core@ICACHE_TAG.STALLS_INUSE@) / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_icache_misses_group",
|
||||
"MetricName": "tma_isb_full",
|
||||
"MetricThreshold": "tma_isb_full > 0.05 & (tma_icache_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15))",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to Instruction TLB (ITLB) misses",
|
||||
"MetricExpr": "cpu_core@ICACHE_TAG.STALLS@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@ICACHE_TAG.STALLS@ / tma_info_thread_clks - tma_isb_full",
|
||||
"MetricGroup": "BigFootprint;BvBC;FetchLat;MemoryTLB;TopdownL3;tma_L3_group;tma_fetch_latency_group",
|
||||
"MetricName": "tma_itlb_misses",
|
||||
"MetricThreshold": "tma_itlb_misses > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
@@ -2169,19 +2177,9 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric ([SKL+] roughly; [LNL]) estimates fraction of cycles with demand load accesses that hit the L1D cache",
|
||||
"MetricExpr": "4 * cpu_core@DEPENDENT_LOADS.ANY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvML;MemoryLat;TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_l1_latency_dependency",
|
||||
"MetricThreshold": "tma_l1_latency_dependency > 0.1 & (tma_l1_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric ([SKL+] roughly; [LNL]) estimates fraction of cycles with demand load accesses that hit the L1D cache. The short latency of the L1D cache may be exposed in pointer-chasing memory access patterns as an example. Sample with: MEM_LOAD_UOPS_RETIRED.L1_HIT_PS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled due to L2 cache accesses by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@MEM_LOAD_RETIRED.L2_HIT@ / (cpu_core@MEM_LOAD_RETIRED.L2_HIT@ + cpu_core@MEM_LOAD_MISC_RETIRED.UC@) * cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvML;CacheHits;MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l2_bound",
|
||||
"MetricThreshold": "tma_l2_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
@@ -2219,6 +2217,16 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_STALLS.MEM@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles CPU was stalled due to Length Changing Prefixes (LCPs)",
|
||||
"MetricExpr": "cpu_core@DECODE.LCP@ / tma_info_thread_clks",
|
||||
@@ -2308,7 +2316,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to LSD (Loop Stream Detector) unit",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / tma_info_thread_clks / 2",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_lsd) / 8 / tma_info_thread_clks",
|
||||
"MetricGroup": "FetchBW;LSD;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_lsd",
|
||||
"MetricThreshold": "tma_lsd > 0.15 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2330,19 +2338,19 @@
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD@) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
@@ -2398,7 +2406,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to the MITE pipeline (the legacy decode pipeline)",
|
||||
"MetricExpr": "(cpu_core@IDQ.MITE_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ / 2 + cpu_core@IDQ.MITE_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricExpr": "(cpu_core@IDQ.MITE_UOPS\\,cmask\\=0x8\\,inv\\=0x1@ * max(0, 8 - tma_info_pipeline_fetch_mite) / 8 + cpu_core@IDQ.MITE_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@IDQ.MITE_UOPS@) * (cpu_core@IDQ_BUBBLES.STARVATION_CYCLES@ - cpu_core@IDQ_BUBBLES.FETCH_LATENCY@)) / tma_info_thread_clks",
|
||||
"MetricGroup": "DSBmiss;FetchBW;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_mite",
|
||||
"MetricThreshold": "tma_mite > 0.1 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2412,13 +2420,13 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to the Microcode Sequencer (MS) unit - see Microcode_Sequencer node for details.",
|
||||
"MetricExpr": "cpu_core@IDQ.MS_CYCLES_ANY@ / tma_info_thread_clks / 1.8",
|
||||
"MetricExpr": "cpu_core@IDQ.MS_CYCLES_ANY@ * (8 - cpu_core@IDQ.MS_UOPS@ / cpu_core@IDQ.MS_CYCLES_ANY@) / tma_info_thread_slots",
|
||||
"MetricGroup": "MicroSeq;TopdownL3;tma_L3_group;tma_fetch_bandwidth_group",
|
||||
"MetricName": "tma_ms",
|
||||
"MetricThreshold": "tma_ms > 0.05 & tma_fetch_bandwidth > 0.2",
|
||||
@@ -2431,7 +2439,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: IDQ.MS_SWITCHES. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2549,7 +2557,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by (indirect) RET instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET_COST@ * cpu_core@BR_MISP_RETIRED.RET_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ret_mispredicts",
|
||||
"MetricThreshold": "tma_ret_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -2624,7 +2632,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2639,8 +2647,8 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates clocks wasted due to loads blocked due to unknown store address (did not do memory disambiguation) or due to unknown store data",
|
||||
"MetricExpr": "7 * cpu_core@LD_BLOCKS.STORE_EARLY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"BriefDescription": "This metric roughly estimates clocks wasted due to loads blocked due to unknown store address (did not do memory disambiguation) or due to unknown store data",
|
||||
"MetricExpr": "cpu_core@LD_BLOCKS.STORE_EARLY\\,cmask\\=1@ / tma_info_thread_clks",
|
||||
"MetricGroup": "TopdownL4;tma_L4_group;tma_l1_bound_group",
|
||||
"MetricName": "tma_store_early_blk",
|
||||
"MetricThreshold": "tma_store_early_blk > 0.2",
|
||||
@@ -2731,6 +2739,16 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric roughly estimates fraction of cycles where the core's performance was likely hurt due to un-chacheable memory",
|
||||
"MetricExpr": "cpu_core@MEM_LOAD_MISC_RETIRED.UC@ / (cpu_core@MEM_LOAD_RETIRED.L2_HIT@ + cpu_core@MEM_LOAD_MISC_RETIRED.UC@) * cpu_core@MEMORY_STALLS.L2@ / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_uc_bound",
|
||||
"MetricThreshold": "tma_uc_bound > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric roughly estimates fraction of cycles where the core's performance was likely hurt due to un-chacheable memory. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to new branch address clears",
|
||||
"MetricExpr": "cpu_core@INT_MISC.UNKNOWN_BRANCH_CYCLES@ / tma_info_thread_clks",
|
||||
|
||||
@@ -93,7 +93,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -129,6 +128,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -190,7 +190,6 @@
|
||||
"EventName": "BR_INST_RETIRED.COND_TAKEN_FWD",
|
||||
"PublicDescription": "Counts taken forward conditional branch instructions retired. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x102",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -324,6 +323,15 @@
|
||||
"UMask": "0xdf",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of taken branch instructions retired",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc4",
|
||||
"EventName": "BR_INST_RETIRED.TAKEN",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x80",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number of mispredicted branch instructions retired for all branch types.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
@@ -446,7 +454,7 @@
|
||||
"EventName": "BR_MISP_RETIRED.COND_TAKEN_BWD_COST",
|
||||
"PublicDescription": "number of branch instructions retired that were mispredicted and taken backward. This precise event may be used to get the misprediction cost via the Retire_Latency field of PEBS. It fires on the instruction that immediately follows the mispredicted branch. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x8001",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -475,7 +483,7 @@
|
||||
"EventName": "BR_MISP_RETIRED.COND_TAKEN_FWD_COST",
|
||||
"PublicDescription": "number of branch instructions retired that were mispredicted and taken forward. This precise event may be used to get the misprediction cost via the Retire_Latency field of PEBS. It fires on the instruction that immediately follows the mispredicted branch. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "400009",
|
||||
"UMask": "0x8002",
|
||||
"UMask": "0x140",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -575,11 +583,11 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired. Non PEBS",
|
||||
"BriefDescription": "This event counts the number of mispredicted ret instructions retired.",
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
"EventCode": "0xc5",
|
||||
"EventName": "BR_MISP_RETIRED.RET",
|
||||
"PublicDescription": "This is a non-precise version (that is, does not use PEBS) of the event that counts mispredicted return instructions retired. Available PDIST counters: 0,1",
|
||||
"PublicDescription": "This event counts the number of mispredicted ret instructions retired. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -965,7 +973,7 @@
|
||||
"Counter": "0,1,2,3,4,5,6,7,8,9",
|
||||
"EventCode": "0xc0",
|
||||
"EventName": "INST_RETIRED.REP_ITERATION",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note the number of iterations is implementation-dependent. Available PDIST counters: 0,1",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note: Since the number of iterations within a REP instruction can be significantly affected by fast strings, this event may vary run to run and not match the architectural number of iterations (specified by RCX) Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1373,6 +1381,15 @@
|
||||
"UMask": "0x88",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of virtual trap actually taken (e.g. highest priority event during retirement). It can count virtual trap from FPC port 0 or port 1 (x87/SSE) equally in a single counter.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FPC_VIRTUAL_TRAP",
|
||||
"SampleAfterValue": "20003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of nukes due to memory renaming",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -1,6 +1,30 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Read CAS command sent to DRAM",
|
||||
"BriefDescription": "ACT command for a read request sent to DRAM.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "UNC_M_ACT_COUNT_RD",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "ACT command sent to DRAM.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "UNC_M_ACT_COUNT_TOTAL",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "ACT command for a write request sent to DRAM.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x25",
|
||||
"EventName": "UNC_M_ACT_COUNT_WR",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read CAS command sent to DRAM.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x22",
|
||||
"EventName": "UNC_M_CAS_COUNT_RD",
|
||||
@@ -8,7 +32,7 @@
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Write CAS command sent to DRAM",
|
||||
"BriefDescription": "Write CAS command sent to DRAM.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x23",
|
||||
"EventName": "UNC_M_CAS_COUNT_WR",
|
||||
@@ -16,7 +40,94 @@
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Any Rank at Hot state",
|
||||
"BriefDescription": "Counting the number of clocks.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x01",
|
||||
"EventName": "UNC_M_CLOCKTICKS",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "CKE in DRAM is low.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x29",
|
||||
"EventName": "UNC_M_DRAM_CKE_OFF_CYCLES",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming read request page status is Page Empty.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x1D",
|
||||
"EventName": "UNC_M_DRAM_PAGE_EMPTY_RD",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming read request page status is Page Empty",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming write request page status is Page Empty.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x20",
|
||||
"EventName": "UNC_M_DRAM_PAGE_EMPTY_WR",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming write request page status is Page Empty",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming read request page status is Page Hit.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x1C",
|
||||
"EventName": "UNC_M_DRAM_PAGE_HIT_RD",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming read request page status is Page Hit",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming write request page status is Page Hit.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x1F",
|
||||
"EventName": "UNC_M_DRAM_PAGE_HIT_WR",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming write request page status is Page Hit",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming read request page status is Page Miss.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x1E",
|
||||
"EventName": "UNC_M_DRAM_PAGE_MISS_RD",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming read request page status is Page Miss",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming write request page status is Page Miss.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x21",
|
||||
"EventName": "UNC_M_DRAM_PAGE_MISS_WR",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "incoming write request page status is Page Miss",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "DRAM in Self-refresh (all channels).",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "UNC_M_DRAM_SELF_REFRESH",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Any Rank at Hot state.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x19",
|
||||
"EventName": "UNC_M_DRAM_THERMAL_HOT",
|
||||
@@ -25,7 +136,7 @@
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Any Rank at Warm state",
|
||||
"BriefDescription": "Any Rank at Warm state.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x1A",
|
||||
"EventName": "UNC_M_DRAM_THERMAL_WARM",
|
||||
@@ -33,6 +144,42 @@
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PRE command sent to DRAM for a read/write request.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x27",
|
||||
"EventName": "UNC_M_PRE_COUNT_PAGE_MISS",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of bytes read, in 32B chunk, per DDR channel. Counter increments by 1 after receiving 32B chunk data.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x3A",
|
||||
"EventName": "UNC_M_RD_DATA",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "This counter counts number of bytes read, in 32B chunk, per DDR channel. Counter increments by 1 after receiving 32B chunk data.",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of VC0 read in channel0 - this event can increment by more than 1 (per channel/sub-ch).",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "UNC_M_RD_OCCUPANCY_CH0",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Number of VC0 read in channel0 - this event can increment by more than 1 (per channel/sub-ch)",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of VC0 read in channel1 - this event can increment by more than 1 (per channel/sub-ch).",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x14",
|
||||
"EventName": "UNC_M_RD_OCCUPANCY_CH1",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total number of read and write byte transfers to/from DRAM, in 32B chunk, per DDR channel. Counter increments by 1 after sending or receiving 32B chunk data.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
@@ -40,5 +187,58 @@
|
||||
"EventName": "UNC_M_TOTAL_DATA",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total number of requests entering MC, this is the sum of all RD + WR requests for all VCs.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x39",
|
||||
"EventName": "UNC_M_TOTAL_REQUESTS",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming VC0 read request.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x02",
|
||||
"EventName": "UNC_M_VC0_REQUESTS_RD",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming VC0 write request.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "UNC_M_VC0_REQUESTS_WR",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming VC1 read request.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x04",
|
||||
"EventName": "UNC_M_VC1_REQUESTS_RD",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Incoming VC1 write request.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "UNC_M_VC1_REQUESTS_WR",
|
||||
"Experimental": "1",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of bytes written, in 32B chunk, per DDR channel. Counter increments by 1 after sending 32B chunk data.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x3B",
|
||||
"EventName": "UNC_M_WR_DATA",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
Family-model,Version,Filename,EventType
|
||||
GenuineIntel-6-(97|9A|B7|BA|BF),v1.39,alderlake,core
|
||||
GenuineIntel-6-BE,v1.39,alderlaken,core
|
||||
GenuineIntel-6-C[56],v1.17,arrowlake,core
|
||||
GenuineIntel-6-(97|9A|B7|BA|BF),v1.40,alderlake,core
|
||||
GenuineIntel-6-BE,v1.40,alderlaken,core
|
||||
GenuineIntel-6-C[56],v1.20,arrowlake,core
|
||||
GenuineIntel-6-(1C|26|27|35|36),v5,bonnell,core
|
||||
GenuineIntel-6-(3D|47),v30,broadwell,core
|
||||
GenuineIntel-6-56,v12,broadwellde,core
|
||||
GenuineIntel-6-4F,v23,broadwellx,core
|
||||
GenuineIntel-6-55-[56789ABCDEF],v1.25,cascadelakex,core
|
||||
GenuineIntel-6-DD,v1.02,clearwaterforest,core
|
||||
GenuineIntel-6-DD,v1.04,clearwaterforest,core
|
||||
GenuineIntel-6-9[6C],v1.05,elkhartlake,core
|
||||
GenuineIntel-6-CF,v1.23,emeraldrapids,core
|
||||
GenuineIntel-6-CF,v1.24,emeraldrapids,core
|
||||
GenuineIntel-6-5[CF],v13,goldmont,core
|
||||
GenuineIntel-6-7A,v1.01,goldmontplus,core
|
||||
GenuineIntel-6-B6,v1.12,grandridge,core
|
||||
GenuineIntel-6-A[DE],v1.18,graniterapids,core
|
||||
GenuineIntel-6-B6,v1.13,grandridge,core
|
||||
GenuineIntel-6-A[DE],v1.20,graniterapids,core
|
||||
GenuineIntel-6-(3C|45|46),v36,haswell,core
|
||||
GenuineIntel-6-3F,v29,haswellx,core
|
||||
GenuineIntel-6-7[DE],v1.24,icelake,core
|
||||
@@ -22,23 +22,24 @@ GenuineIntel-6-3A,v24,ivybridge,core
|
||||
GenuineIntel-6-3E,v24,ivytown,core
|
||||
GenuineIntel-6-2D,v24,jaketown,core
|
||||
GenuineIntel-6-(57|85),v16,knightslanding,core
|
||||
GenuineIntel-6-BD,v1.22,lunarlake,core
|
||||
GenuineIntel-6-(AA|AC|B5),v1.21,meteorlake,core
|
||||
GenuineIntel-6-BD,v1.26,lunarlake,core
|
||||
GenuineIntel-6-(AA|AC|B5),v1.22,meteorlake,core
|
||||
GenuineIntel-6-1[AEF],v4,nehalemep,core
|
||||
GenuineIntel-6-2E,v4,nehalemex,core
|
||||
GenuineIntel-6-(CC|D5),v1.05,pantherlake,core
|
||||
GenuineIntel-6-(CC|D5|E5),v1.07,pantherlake,core
|
||||
GenuineIntel-6-A7,v1.04,rocketlake,core
|
||||
GenuineIntel-6-2A,v19,sandybridge,core
|
||||
GenuineIntel-6-8F,v1.39,sapphirerapids,core
|
||||
GenuineIntel-6-AF,v1.17,sierraforest,core
|
||||
GenuineIntel-6-AF,v1.18,sierraforest,core
|
||||
GenuineIntel-6-(37|4A|4C|4D|5A),v15,silvermont,core
|
||||
GenuineIntel-6-(4E|5E|8E|9E|A5|A6),v59,skylake,core
|
||||
GenuineIntel-6-55-[01234],v1.37,skylakex,core
|
||||
GenuineIntel-6-86,v1.23,snowridgex,core
|
||||
GenuineIntel-6-8[CD],v1.18,tigerlake,core
|
||||
GenuineIntel-6-8[CD],v1.19,tigerlake,core
|
||||
GenuineIntel-6-2C,v5,westmereep-dp,core
|
||||
GenuineIntel-6-25,v4,westmereep-sp,core
|
||||
GenuineIntel-6-2F,v4,westmereex,core
|
||||
GenuineIntel-18-[13],v1.00,novalake,core
|
||||
AuthenticAMD-23-([12][0-9A-F]|[0-9A-F]),v2,amdzen1,core
|
||||
AuthenticAMD-23-[[:xdigit:]]+,v1,amdzen2,core
|
||||
AuthenticAMD-25-([245][[:xdigit:]]|[[:xdigit:]]),v1,amdzen3,core
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of request that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
@@ -631,6 +631,15 @@
|
||||
"UMask": "0x50",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of unhalted cycles when the core is stalled due to a demand load miss which missed all the caches, a snoop was required, and hits in other core or module on the same die. Another core provides the data with a FWD, NO_FWD, or HITM. If the core has access to an L3 cache, an LLC miss refers to an L3 cache miss, otherwise it is an L2 cache miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x34",
|
||||
"EventName": "MEM_BOUND_STALLS_LOAD.LLC_MISS_OTHERMOD",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of unhalted cycles when the core is stalled to a store buffer full condition",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
|
||||
@@ -93,7 +93,6 @@
|
||||
"tma_code_stlb_miss_group": "Metrics contributing to tma_code_stlb_miss category",
|
||||
"tma_core_bound_group": "Metrics contributing to tma_core_bound category",
|
||||
"tma_divider_group": "Metrics contributing to tma_divider category",
|
||||
"tma_dram_bound_group": "Metrics contributing to tma_dram_bound category",
|
||||
"tma_dtlb_load_group": "Metrics contributing to tma_dtlb_load category",
|
||||
"tma_dtlb_store_group": "Metrics contributing to tma_dtlb_store category",
|
||||
"tma_fetch_bandwidth_group": "Metrics contributing to tma_fetch_bandwidth category",
|
||||
@@ -129,6 +128,7 @@
|
||||
"tma_l1_bound_group": "Metrics contributing to tma_l1_bound category",
|
||||
"tma_l2_bound_group": "Metrics contributing to tma_l2_bound category",
|
||||
"tma_l3_bound_group": "Metrics contributing to tma_l3_bound category",
|
||||
"tma_l3_miss_bound_group": "Metrics contributing to tma_l3_miss_bound category",
|
||||
"tma_light_operations_group": "Metrics contributing to tma_light_operations category",
|
||||
"tma_load_op_utilization_group": "Metrics contributing to tma_load_op_utilization category",
|
||||
"tma_load_stlb_miss_group": "Metrics contributing to tma_load_stlb_miss category",
|
||||
|
||||
@@ -797,16 +797,16 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_bandwidth / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_sq_full / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_fb_full / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)))",
|
||||
"MetricGroup": "BvMB;Mem;MemoryBW;Offcore;tma_issueBW",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_bandwidth",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_bandwidth > 20",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Total pipeline cost of external Memory- or Cache-Bandwidth related bottlenecks. Related metrics: tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of external Memory- or Cache-Latency related bottlenecks",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_dram_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_miss_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_mem_latency / (tma_mem_bandwidth + tma_mem_latency)) + tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l3_hit_latency / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full)) + tma_memory_bound * tma_l2_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_l1_latency_dependency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_lock_latency / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_loads / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_split_stores / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_store_latency / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvML;Mem;MemoryLat;Offcore;tma_issueLat",
|
||||
"MetricName": "tma_bottleneck_data_cache_memory_latency",
|
||||
"MetricThreshold": "tma_bottleneck_data_cache_memory_latency > 20",
|
||||
@@ -832,7 +832,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Address Translation related bottlenecks (data-side TLBs)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l1_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_load / (tma_dtlb_load + tma_fb_full + tma_l1_latency_dependency + tma_lock_latency + tma_split_loads + tma_store_fwd_blk)) + tma_memory_bound * (tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound)) * (tma_dtlb_store / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores)))",
|
||||
"MetricGroup": "BvMT;Mem;MemoryTLB;Offcore;tma_issueTLB",
|
||||
"MetricName": "tma_bottleneck_memory_data_tlbs",
|
||||
"MetricThreshold": "tma_bottleneck_memory_data_tlbs > 20",
|
||||
@@ -841,7 +841,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total pipeline cost of Memory Synchronization related bottlenecks (data transfers and coherency updates across processors)",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_dram_bound + tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricExpr": "100 * (tma_memory_bound * (tma_l3_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * (tma_contested_accesses + tma_data_sharing) / (tma_contested_accesses + tma_data_sharing + tma_l3_hit_latency + tma_sq_full) + tma_store_bound / (tma_l1_bound + tma_l2_bound + tma_l3_bound + tma_l3_miss_bound + tma_store_bound) * tma_false_sharing / (tma_dtlb_store + tma_false_sharing + tma_split_stores + tma_store_latency + tma_streaming_stores - tma_store_latency)) + tma_machine_clears * (1 - tma_other_nukes / tma_other_nukes))",
|
||||
"MetricGroup": "BvMS;LockCont;Mem;Offcore;tma_issueSyncxn",
|
||||
"MetricName": "tma_bottleneck_memory_synchronization",
|
||||
"MetricThreshold": "tma_bottleneck_memory_synchronization > 10",
|
||||
@@ -989,7 +989,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by non-taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@ * cpu_core@BR_MISP_RETIRED.COND_NTAKEN_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_NTAKEN@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_nt_mispredicts",
|
||||
"MetricThreshold": "tma_cond_nt_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -998,7 +998,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to misprediction by taken conditional branches.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN_COST@ * cpu_core@BR_MISP_RETIRED.COND_TAKEN_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.COND_TAKEN@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_cond_tk_mispredicts",
|
||||
"MetricThreshold": "tma_cond_tk_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1027,13 +1027,13 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses",
|
||||
"BriefDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricExpr": "(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD@R, 24 * tma_info_system_core_frequency) + cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@ * min(cpu_core@MEM_LOAD_L3_HIT_RETIRED.XSNP_FWD@R, 24 * tma_info_system_core_frequency) * (1 - cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM@ / (cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HITM@ + cpu_core@OCR.DEMAND_DATA_RD.L3_HIT.SNOOP_HIT_WITH_FWD@))) * (1 + cpu_core@MEM_LOAD_RETIRED.FB_HIT@ / cpu_core@MEM_LOAD_RETIRED.L1_MISS@ / 2) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMS;Offcore;Snoop;TopdownL4;tma_L4_group;tma_issueSyncxn;tma_l3_bound_group",
|
||||
"MetricName": "tma_data_sharing",
|
||||
"MetricThreshold": "tma_data_sharing > 0.05 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"PublicDescription": "This metric estimates fraction of cycles while the memory subsystem was handling synchronizations due to L3 data-sharing accesses. Data shared by multiple Logical Processors (even just read shared) may cause increased access latency due to cache coherency. Excessive data sharing can drastically harm multithreaded performance. Sample with: MEM_LOAD_L3_HIT_RETIRED.XSNP_NO_FWD. Related metrics: tma_bottleneck_memory_synchronization, tma_contested_accesses, tma_false_sharing, tma_machine_clears, tma_remote_cache",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1057,16 +1057,6 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_ACTIVITY.STALLS_L3_MISS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_dram_bound",
|
||||
"MetricThreshold": "tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents Core fraction of cycles in which CPU was likely limited due to DSB (decoded uop cache) fetch pipeline",
|
||||
"MetricExpr": "(cpu_core@IDQ.DSB_CYCLES_ANY@ - cpu_core@IDQ.DSB_CYCLES_OK@) / tma_info_core_core_clks / 2",
|
||||
@@ -1123,7 +1113,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;TopdownL4;tma_L4_group;tma_issueBW;tma_issueSL;tma_issueSmSt;tma_l1_bound_group",
|
||||
"MetricName": "tma_fb_full",
|
||||
"MetricThreshold": "tma_fb_full > 0.3",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores",
|
||||
"PublicDescription": "This metric does a *rough estimation* of how often L1D Fill Buffer unavailability limited additional L1D miss memory access requests to proceed. The higher the metric value; the deeper the memory hierarchy level the misses are satisfied from (metric values >1 are valid). Often it hints on approaching bandwidth limits (to L2 cache; L3 cache or external memory). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_sq_full, tma_store_latency, tma_streaming_stores, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -1273,7 +1263,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect CALL instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_call_mispredicts",
|
||||
"MetricThreshold": "tma_ind_call_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1282,7 +1272,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by indirect JMP instructions.",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_COST@R - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@ * cpu_core@BR_MISP_RETIRED.INDIRECT_CALL_COST@R) / tma_info_thread_clks, 0)",
|
||||
"MetricExpr": "max((cpu_core@BR_MISP_RETIRED.INDIRECT@ - cpu_core@BR_MISP_RETIRED.INDIRECT_CALL@) / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts, 0)",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ind_jump_mispredicts",
|
||||
"MetricThreshold": "tma_ind_jump_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -1459,7 +1449,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@IDQ.DSB_UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "DSB;Fed;FetchBW;tma_issueFB",
|
||||
"MetricName": "tma_info_frontend_dsb_coverage",
|
||||
"MetricThreshold": "tma_info_frontend_dsb_coverage < 0.7 & tma_info_thread_ipc / 6 > 0.35",
|
||||
@@ -1526,7 +1516,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the LSD (Loop Stream Detector; aka Loop Cache)",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / cpu_core@UOPS_ISSUED.ANY@",
|
||||
"MetricExpr": "cpu_core@LSD.UOPS@ / (cpu_core@IDQ.DSB_UOPS@ + cpu_core@LSD.UOPS@ + cpu_core@IDQ.MITE_UOPS@ + cpu_core@IDQ.MS_UOPS@)",
|
||||
"MetricGroup": "Fed;LSD",
|
||||
"MetricName": "tma_info_frontend_lsd_coverage",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1685,6 +1675,15 @@
|
||||
"PublicDescription": "Instructions per taken branch. Related metrics: tma_dsb_switches, tma_fetch_bandwidth, tma_info_botlnk_l2_dsb_bandwidth, tma_info_botlnk_l2_dsb_misses, tma_info_frontend_dsb_coverage, tma_lcp",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AVX preserve/restore assists per kilo instruction",
|
||||
"MetricExpr": "1e3 * cpu_core@ASSISTS.SSE_AVX_MIX@ / cpu_core@INST_RETIRED.ANY@",
|
||||
"MetricGroup": "tma_issueMV",
|
||||
"MetricName": "tma_info_inst_mix_vectormixpki",
|
||||
"MetricThreshold": "tma_info_inst_mix_vectormixpki > 0.05",
|
||||
"PublicDescription": "AVX preserve/restore assists per kilo instruction. Related metrics: tma_mixing_vectors, tma_ms_switches",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L1 data cache [GB / sec]",
|
||||
"MetricExpr": "tma_info_memory_l1d_cache_fill_bw",
|
||||
@@ -1922,7 +1921,7 @@
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Mem;Backend;CacheHits",
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is execution) per physical core",
|
||||
"MetricExpr": "cpu_core@UOPS_EXECUTED.THREAD@ / (cpu_core@UOPS_EXECUTED.CORE_CYCLES_GE_1@ / 2 if #SMT_on else cpu_core@UOPS_EXECUTED.THREAD\\,cmask\\=1@)",
|
||||
"MetricGroup": "Cor;Pipeline;PortsUtil;SMT",
|
||||
"MetricName": "tma_info_pipeline_execute",
|
||||
@@ -2004,10 +2003,10 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]",
|
||||
"MetricExpr": "64 * (UNC_HAC_ARB_TRK_REQUESTS.ALL + UNC_HAC_ARB_COH_TRK_REQUESTS.ALL) / 1e9 / tma_info_system_time",
|
||||
"MetricExpr": "32 * UNC_M_TOTAL_DATA / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "HPC;MemOffcore;MemoryBW;SoC;tma_issueBW",
|
||||
"MetricName": "tma_info_system_dram_bw_use",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full",
|
||||
"PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_mem_bandwidth, tma_sq_full, tma_uc_bound",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
@@ -2093,13 +2092,6 @@
|
||||
"MetricName": "tma_info_system_turbo_utilization",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Measured Average Uncore Frequency for the SoC [GHz]",
|
||||
"MetricExpr": "tma_info_system_socket_clks / 1e9 / tma_info_system_time",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "tma_info_system_uncore_frequency",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Per-Logical Processor actual clocks when the Logical Processor is active.",
|
||||
"MetricExpr": "cpu_core@CPU_CLK_UNHALTED.THREAD@",
|
||||
@@ -2268,6 +2260,16 @@
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads",
|
||||
"MetricExpr": "cpu_core@MEMORY_ACTIVITY.STALLS_L3_MISS@ / tma_info_thread_clks",
|
||||
"MetricGroup": "MemoryBound;Offcore;TmaL3mem;TopdownL3;tma_L3_group;tma_memory_bound_group",
|
||||
"MetricName": "tma_l3_miss_bound",
|
||||
"MetricThreshold": "tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2)",
|
||||
"PublicDescription": "This metric estimates how often the CPU was stalled on accesses to external memory (DRAM) by loads. Better caching can improve the latency and increase performance. Sample with: MEM_LOAD_RETIRED.L3_MISS",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles CPU was stalled due to Length Changing Prefixes (LCPs)",
|
||||
"MetricExpr": "cpu_core@DECODE.LCP@ / tma_info_thread_clks",
|
||||
@@ -2379,19 +2381,19 @@
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.DATA_RD\\,cmask\\=4@) / tma_info_thread_clks",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueBW",
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_bandwidth",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full",
|
||||
"MetricThreshold": "tma_mem_bandwidth > 0.2 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the core's performance was likely hurt due to approaching bandwidth limits of external memory - DRAM ([SPR-HBM] and/or HBM). The underlying heuristic assumes that a similar off-core traffic is generated by all IA cores. This metric does not aggregate non-data-read requests by this logical processor; requests from other IA Logical Processors/Physical Cores/sockets; or other non-IA devices like GPU; hence the maximum external memory bandwidth limits may or may not be approached when this metric is flagged (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_sq_full, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM)",
|
||||
"MetricExpr": "min(cpu_core@CPU_CLK_UNHALTED.THREAD@, cpu_core@OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DATA_RD@) / tma_info_thread_clks - tma_mem_bandwidth",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_dram_bound_group;tma_issueLat",
|
||||
"MetricGroup": "BvML;MemoryLat;Offcore;TopdownL4;tma_L4_group;tma_issueLat;tma_l3_miss_bound_group",
|
||||
"MetricName": "tma_mem_latency",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_dram_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"MetricThreshold": "tma_mem_latency > 0.1 & (tma_l3_miss_bound > 0.1 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric estimates fraction of cycles where the performance was likely hurt due to latency from external memory - DRAM ([SPR-HBM] and/or HBM). This metric does not aggregate requests from other Logical Processors/Physical Cores/sockets (see Uncore counters for that). Related metrics: tma_bottleneck_data_cache_memory_latency, tma_l3_hit_latency",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
@@ -2461,7 +2463,7 @@
|
||||
"MetricGroup": "TopdownL5;tma_L5_group;tma_issueMV;tma_ports_utilized_0_group",
|
||||
"MetricName": "tma_mixing_vectors",
|
||||
"MetricThreshold": "tma_mixing_vectors > 0.05",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_ms_switches",
|
||||
"PublicDescription": "This metric estimates penalty in terms of percentage of([SKL+] injected blend uops out of all Uops Issued -- the Count Domain; [ADL+] cycles). Usually a Mixing_Vectors over 5% is worth investigating. Read more in Appendix B1 of the Optimizations Guide for this topic. Related metrics: tma_info_inst_mix_vectormixpki, tma_ms_switches",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2480,7 +2482,7 @@
|
||||
"MetricGroup": "FetchLat;MicroSeq;TopdownL3;tma_L3_group;tma_fetch_latency_group;tma_issueMC;tma_issueMS;tma_issueMV;tma_issueSO",
|
||||
"MetricName": "tma_ms_switches",
|
||||
"MetricThreshold": "tma_ms_switches > 0.05 & (tma_fetch_latency > 0.1 & tma_frontend_bound > 0.15)",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: FRONTEND_RETIRED.MS_FLOWS. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"PublicDescription": "This metric estimates the fraction of cycles when the CPU was stalled due to switches of uop delivery to the Microcode Sequencer (MS). Commonly used instructions are optimized for delivery by the DSB (decoded i-cache) or MITE (legacy instruction decode) pipelines. Certain operations cannot be handled natively by the execution pipeline; and must be performed by microcode (small programs injected into the execution stream). Switching to the MS too often can negatively impact performance. The MS is designated to deliver long uop flows required by CISC instructions like CPUID; or uncommon conditions like Floating Point Assists when dealing with Denormals. Sample with: FRONTEND_RETIRED.MS_FLOWS. Related metrics: tma_bottleneck_irregular_overhead, tma_clears_resteers, tma_info_inst_mix_vectormixpki, tma_l1_bound, tma_machine_clears, tma_microcode_sequencer, tma_mixing_vectors, tma_serializing_operation",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
@@ -2628,7 +2630,7 @@
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This metric represents fraction of cycles the CPU was stalled due to retired misprediction by (indirect) RET instructions.",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET_COST@ * cpu_core@BR_MISP_RETIRED.RET_COST@R / tma_info_thread_clks",
|
||||
"MetricExpr": "cpu_core@BR_MISP_RETIRED.RET@ / cpu_core@BR_MISP_RETIRED.ALL_BRANCHES@ * tma_branch_mispredicts",
|
||||
"MetricGroup": "BrMispredicts;TopdownL3;tma_L3_group;tma_branch_mispredicts_group",
|
||||
"MetricName": "tma_ret_mispredicts",
|
||||
"MetricThreshold": "tma_ret_mispredicts > 0.05 & (tma_branch_mispredicts > 0.1 & tma_bad_speculation > 0.15)",
|
||||
@@ -2703,7 +2705,7 @@
|
||||
"MetricGroup": "BvMB;MemoryBW;Offcore;TopdownL4;tma_L4_group;tma_issueBW;tma_l3_bound_group",
|
||||
"MetricName": "tma_sq_full",
|
||||
"MetricThreshold": "tma_sq_full > 0.3 & (tma_l3_bound > 0.05 & (tma_memory_bound > 0.2 & tma_backend_bound > 0.2))",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth",
|
||||
"PublicDescription": "This metric measures fraction of cycles where the Super Queue (SQ) was full taking into account all request-types and both hardware SMT threads (Logical Processors). Related metrics: tma_bottleneck_data_cache_memory_bandwidth, tma_fb_full, tma_info_system_dram_bw_use, tma_mem_bandwidth, tma_uc_bound",
|
||||
"ScaleUnit": "100%",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
|
||||
@@ -909,7 +909,7 @@
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc0",
|
||||
"EventName": "INST_RETIRED.REP_ITERATION",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note the number of iterations is implementation-dependent.",
|
||||
"PublicDescription": "Number of iterations of Repeat (REP) string retired instructions such as MOVS, CMPS, and SCAS. Each has a byte, word, and doubleword version and string instructions can be repeated using a repetition prefix, REP, that allows their architectural execution to be repeated a number of times as specified by the RCX register. Note: Since the number of iterations within a REP instruction can be significantly affected by fast strings, this event may vary run to run and not match the architectural number of iterations (specified by RCX)",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
@@ -1443,7 +1443,7 @@
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number issue slots not consumed due to a color request for an FCW or MXCSR control register when all 4 colors (copies) are already in use.",
|
||||
"BriefDescription": "Counts the number of issue slots not consumed due to a color request for an FCW or MXCSR control register when all 4 colors (copies) are already in use.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x75",
|
||||
"EventName": "SERIALIZATION.COLOR_STALLS",
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "0",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 0.",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "2",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 0 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW.",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "1",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC0_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "3",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 1.",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "5",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 1 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW.",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels).",
|
||||
"BriefDescription": "This event is deprecated. [This event is alias to UNC_M_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "4",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_MC1_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data.",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
@@ -117,6 +117,66 @@
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). [This event is alias to UNC_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "0",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC0_RDCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 0. [This event is alias to UNC_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "2",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 0 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW. [This event is alias to UNC_MC0_TOTAL_REQCOUNT_FREERUN]",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). [This event is alias to UNC_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "1",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC0_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 0 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC0_WRCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_0"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). [This event is alias to UNC_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"Counter": "3",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_RDCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS read command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC1_RDCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x20",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every read and write request entering the Memory Controller 1. [This event is alias to UNC_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"Counter": "5",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_TOTAL_REQCOUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every read and write request entering the Memory Controller 1 (sum of all channels). All requests are counted as one, whether they are 32B or 64B Read/Write or partial/full line writes. Some write requests to the same address may merge to a single write command to DRAM. Therefore, the total request count may be higher than total DRAM BW. [This event is alias to UNC_MC1_TOTAL_REQCOUNT_FREERUN]",
|
||||
"UMask": "0x10",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). [This event is alias to UNC_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"Counter": "4",
|
||||
"EventCode": "0xff",
|
||||
"EventName": "UNC_M_MC1_WRCAS_COUNT_FREERUN",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts every CAS write command sent from the Memory Controller 1 to DRAM (sum of all channels). Each CAS commands can be for 32B or 64B of data. [This event is alias to UNC_MC1_WRCAS_COUNT_FREERUN]",
|
||||
"UMask": "0x30",
|
||||
"Unit": "imc_free_running_1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PRE command sent to DRAM due to page table idle timer expiration",
|
||||
"Counter": "0,1,2,3,4",
|
||||
|
||||
749
tools/perf/pmu-events/arch/x86/novalake/cache.json
Normal file
749
tools/perf/pmu-events/arch/x86/novalake/cache.json
Normal file
@@ -0,0 +1,749 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of requests that were not accepted into the L2Q because the L2Q is FULL.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x31",
|
||||
"EventName": "CORE_REJECT_L2Q.ANY",
|
||||
"PublicDescription": "Counts the number of (demand and L1 prefetchers) core requests rejected by the L2Q due to a full or nearly full w condition which likely indicates back pressure from L2Q. It also counts requests that would have gone directly to the XQ, but are rejected due to a full or nearly full condition, indicating back pressure from the IDI link. The L2Q may also reject transactions from a core to insure fairness between cores, or to delay a core?s dirty eviction when the address conflicts incoming external snoops. (Note that L2 prefetcher requests that are dropped are not counted by this event.) Counts on a per core basis.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cache lines replaced in L0 data cache.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x51",
|
||||
"EventName": "L1D.L0_REPLACEMENT",
|
||||
"PublicDescription": "Counts L0 data line replacements including opportunistic replacements, and replacements that require stall-for-replace or block-for-replace.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cachelines replaced into the L1 d-cache. Successful replacements only (not blocked) and exclude WB-miss case",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x51",
|
||||
"EventName": "L1D.L1_REPLACEMENT",
|
||||
"PublicDescription": "Counts cachelines replaced into the L1 d-cache.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cachelines replaced into the L0 and L1 d-cache. Successful replacements only (not blocked) and exclude WB-miss case",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x51",
|
||||
"EventName": "L1D.REPLACEMENT",
|
||||
"PublicDescription": "Counts cachelines replaced into the L0 and L1 d-cache.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x5",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of cycles a demand request has waited due to L1D Fill Buffer (FB) unavailability.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "L1D_MISS.FB_FULL",
|
||||
"PublicDescription": "Counts number of cycles a demand request has waited due to L1D Fill Buffer (FB) unavailability. Demand requests include cacheable/uncacheable demand load, store, lock or SW prefetch accesses.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of cycles a demand request has waited due to L1D due to lack of L2 resources.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "L1D_MISS.L2_STALLS",
|
||||
"PublicDescription": "Counts number of cycles a demand request has waited due to L1D due to lack of L2 resources. Demand requests include cacheable/uncacheable demand load, store, lock or SW prefetch accesses.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of demand requests that missed L1D cache",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "L1D_MISS.LOAD",
|
||||
"PublicDescription": "Count occurrences (rising-edge) of DCACHE_PENDING sub-event0. Impl. sends per-port binary inc-bit the occupancy increases* (at FB alloc or promotion).",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of L1D misses that are outstanding",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x48",
|
||||
"EventName": "L1D_PENDING.LOAD",
|
||||
"PublicDescription": "Counts number of L1D misses that are outstanding in each cycle, that is each cycle the number of Fill Buffers (FB) outstanding required by Demand Reads. FB either is held by demand loads, or it is held by non-demand loads and gets hit at least once by demand. The valid outstanding interval is defined until the FB deallocation by one of the following ways: from FB allocation, if FB is allocated by demand from the demand Hit FB, if it is allocated by hardware or software prefetch. Note: In the L1D, a Demand Read contains cacheable or noncacheable demand loads, including ones causing cache-line splits and reads due to page walks resulted from any request type.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles with L1D load Misses outstanding.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x48",
|
||||
"EventName": "L1D_PENDING.LOAD_CYCLES",
|
||||
"PublicDescription": "Counts duration of L1D miss outstanding in cycles.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 cache lines filling L2",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x25",
|
||||
"EventName": "L2_LINES_IN.ALL",
|
||||
"PublicDescription": "Counts the number of L2 cache lines filling the L2. Counting does not cover rejects.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x3f",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Modified cache lines that are evicted by L2 cache when triggered by an L2 cache fill.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "L2_LINES_OUT.NON_SILENT",
|
||||
"PublicDescription": "Counts the number of lines that are evicted by L2 cache when triggered by an L2 cache fill. Those lines are in Modified state. Modified lines are written back to L3",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Non-modified cache lines that are silently dropped by L2 cache.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "L2_LINES_OUT.SILENT",
|
||||
"PublicDescription": "Counts the number of lines that are silently dropped by L2 cache. These lines are typically in Shared or Exclusive state. A non-threaded event.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of L2 cache lines that have been L2 hardware prefetched but not used by demand accesses.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "L2_LINES_OUT.USELESS_HWPF",
|
||||
"PublicDescription": "Counts the number of L2 cache lines that have been L2 hardware prefetched but not used by demand accesses. Increments on the core that brought the line in originally.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cache lines that have been L2 hardware prefetched but not used by demand accesses",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x26",
|
||||
"EventName": "L2_LINES_OUT.USELESS_HWPF",
|
||||
"PublicDescription": "Counts the number of cache lines that have been prefetched by the L2 hardware prefetcher but not used by demand access when evicted from the L2 cache",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All accesses to L2 cache [This event is alias to L2_RQSTS.REFERENCES, L2_RQSTS.ANY]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.ALL",
|
||||
"PublicDescription": "Counts all requests that were hit or true misses in L2 cache. True-miss excludes misses that were merged with ongoing L2 misses. [This event is alias to L2_RQSTS.REFERENCES, L2_RQSTS.ANY]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 code requests [This event is alias to L2_RQSTS.ALL_CODE_RD]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.ALL_CODE_RD",
|
||||
"PublicDescription": "Counts the total number of L2 code requests. [This event is alias to L2_RQSTS.ALL_CODE_RD]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xe4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read access L2 cache [This event is alias to L2_RQSTS.ALL_DEMAND_DATA_RD]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.ALL_DEMAND_DATA_RD",
|
||||
"PublicDescription": "Counts Demand Data Read requests accessing the L2 cache. These requests may hit or miss L2 cache. True-miss exclude misses that were merged with ongoing L2 misses. An access is counted once. [This event is alias to L2_RQSTS.ALL_DEMAND_DATA_RD]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xe1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 cache hits when fetching instructions, code reads. [This event is alias to L2_RQSTS.CODE_RD_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.CODE_RD_HIT",
|
||||
"PublicDescription": "Counts L2 cache hits when fetching instructions, code reads. [This event is alias to L2_RQSTS.CODE_RD_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x44",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 cache misses when fetching instructions [This event is alias to L2_RQSTS.CODE_RD_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.CODE_RD_MISS",
|
||||
"PublicDescription": "Counts L2 cache misses when fetching instructions. [This event is alias to L2_RQSTS.CODE_RD_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x24",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read requests that hit L2 cache [This event is alias to L2_RQSTS.DEMAND_DATA_RD_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.DEMAND_DATA_RD_HIT",
|
||||
"PublicDescription": "Counts the number of demand Data Read requests initiated by load instructions that hit L2 cache. [This event is alias to L2_RQSTS.DEMAND_DATA_RD_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read miss L2 cache [This event is alias to L2_RQSTS.DEMAND_DATA_RD_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.DEMAND_DATA_RD_MISS",
|
||||
"PublicDescription": "Counts demand Data Read requests with true-miss in the L2 cache. True-miss excludes misses that were merged with ongoing L2 misses. An access is counted once. [This event is alias to L2_RQSTS.DEMAND_DATA_RD_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x21",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All requests that hit L2 cache. [This event is alias to L2_RQSTS.HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.HIT",
|
||||
"PublicDescription": "Counts all requests that hit L2 cache. [This event is alias to L2_RQSTS.HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x5f",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read requests with true-miss in L2 cache [This event is alias to L2_RQSTS.MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.MISS",
|
||||
"PublicDescription": "Counts read requests of any type with true-miss in the L2 cache. True-miss excludes L2 misses that were merged with ongoing L2 misses. [This event is alias to L2_RQSTS.MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x3f",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "RFO requests that hit L2 cache [This event is alias to L2_RQSTS.RFO_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.RFO_HIT",
|
||||
"PublicDescription": "Counts the RFO (Read-for-Ownership) requests that hit L2 cache. [This event is alias to L2_RQSTS.RFO_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x42",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "RFO requests that miss L2 cache [This event is alias to L2_RQSTS.RFO_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_REQUEST.RFO_MISS",
|
||||
"PublicDescription": "Counts the RFO (Read-for-Ownership) requests that miss L2 cache. [This event is alias to L2_RQSTS.RFO_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x22",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 code requests [This event is alias to L2_REQUEST.ALL_CODE_RD]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.ALL_CODE_RD",
|
||||
"PublicDescription": "Counts the total number of L2 code requests. [This event is alias to L2_REQUEST.ALL_CODE_RD]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xe4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read access L2 cache [This event is alias to L2_REQUEST.ALL_DEMAND_DATA_RD]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.ALL_DEMAND_DATA_RD",
|
||||
"PublicDescription": "Counts Demand Data Read requests accessing the L2 cache. These requests may hit or miss L2 cache. True-miss exclude misses that were merged with ongoing L2 misses. An access is counted once. [This event is alias to L2_REQUEST.ALL_DEMAND_DATA_RD]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xe1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All accesses to L2 cache [This event is alias to L2_RQSTS.REFERENCES, L2_REQUEST.ALL]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.ANY",
|
||||
"PublicDescription": "Counts all requests that were hit or true misses in L2 cache. True-miss excludes misses that were merged with ongoing L2 misses. [This event is alias to L2_RQSTS.REFERENCES, L2_REQUEST.ALL]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 cache hits when fetching instructions, code reads. [This event is alias to L2_REQUEST.CODE_RD_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.CODE_RD_HIT",
|
||||
"PublicDescription": "Counts L2 cache hits when fetching instructions, code reads. [This event is alias to L2_REQUEST.CODE_RD_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x44",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L2 cache misses when fetching instructions [This event is alias to L2_REQUEST.CODE_RD_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.CODE_RD_MISS",
|
||||
"PublicDescription": "Counts L2 cache misses when fetching instructions. [This event is alias to L2_REQUEST.CODE_RD_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x24",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read requests that hit L2 cache [This event is alias to L2_REQUEST.DEMAND_DATA_RD_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.DEMAND_DATA_RD_HIT",
|
||||
"PublicDescription": "Counts the number of demand Data Read requests initiated by load instructions that hit L2 cache. [This event is alias to L2_REQUEST.DEMAND_DATA_RD_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Demand Data Read miss L2 cache [This event is alias to L2_REQUEST.DEMAND_DATA_RD_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.DEMAND_DATA_RD_MISS",
|
||||
"PublicDescription": "Counts demand Data Read requests with true-miss in the L2 cache. True-miss excludes misses that were merged with ongoing L2 misses. An access is counted once. [This event is alias to L2_REQUEST.DEMAND_DATA_RD_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x21",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All requests that hit L2 cache. [This event is alias to L2_REQUEST.HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.HIT",
|
||||
"PublicDescription": "Counts all requests that hit L2 cache. [This event is alias to L2_REQUEST.HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x5f",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read requests with true-miss in L2 cache [This event is alias to L2_REQUEST.MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.MISS",
|
||||
"PublicDescription": "Counts read requests of any type with true-miss in the L2 cache. True-miss excludes L2 misses that were merged with ongoing L2 misses. [This event is alias to L2_REQUEST.MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x3f",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All accesses to L2 cache [This event is alias to L2_REQUEST.ALL,L2_RQSTS.ANY]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.REFERENCES",
|
||||
"PublicDescription": "Counts all requests that were hit or true misses in L2 cache. True-miss excludes misses that were merged with ongoing L2 misses. [This event is alias to L2_REQUEST.ALL,L2_RQSTS.ANY]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "RFO requests that hit L2 cache [This event is alias to L2_REQUEST.RFO_HIT]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.RFO_HIT",
|
||||
"PublicDescription": "Counts the RFO (Read-for-Ownership) requests that hit L2 cache. [This event is alias to L2_REQUEST.RFO_HIT]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x42",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "RFO requests that miss L2 cache [This event is alias to L2_REQUEST.RFO_MISS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x24",
|
||||
"EventName": "L2_RQSTS.RFO_MISS",
|
||||
"PublicDescription": "Counts the RFO (Read-for-Ownership) requests that miss L2 cache. [This event is alias to L2_REQUEST.RFO_MISS]",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x22",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "L1D writebacks that access L2 cache",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x23",
|
||||
"EventName": "L2_TRANS.L1D_WB",
|
||||
"PublicDescription": "This event counts L1D writebacks that access L2 cache.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cacheable memory requests that miss in the LLC. Counts on a per core basis.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x2e",
|
||||
"EventName": "LONGEST_LAT_CACHE.MISS",
|
||||
"PublicDescription": "Counts the number of cacheable memory requests that miss in the Last Level Cache (LLC). Requests include demand loads, reads for ownership (RFO), instruction fetches and L1 HW prefetches. If the core has access to an L3 cache, the LLC is the L3 cache, otherwise it is the L2 cache. Counts on a per core basis.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core-originated cacheable requests that missed L3 (Except hardware prefetches to the L3)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x2e",
|
||||
"EventName": "LONGEST_LAT_CACHE.MISS",
|
||||
"PublicDescription": "Counts core-originated cacheable requests that miss the L3 cache (Longest Latency cache). Requests include data and code reads, Reads-for-Ownership (RFOs), speculative accesses and hardware prefetches to the L1 and L2. It does not include hardware prefetches to the L3, and may not count other types of requests to the L3.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cacheable memory requests that access the LLC. Counts on a per core basis.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x2e",
|
||||
"EventName": "LONGEST_LAT_CACHE.REFERENCE",
|
||||
"PublicDescription": "Counts the number of cacheable memory requests that access the Last Level Cache (LLC). Requests include demand loads, reads for ownership (RFO), instruction fetches and L1 HW prefetches. If the core has access to an L3 cache, the LLC is the L3 cache, otherwise it is the L2 cache. Counts on a per core basis.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4f",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts all retired load instructions.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.ALL_LOADS",
|
||||
"PublicDescription": "Counts Instructions with at least one architecturally visible load retired. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x81",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired store instructions.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.ALL_STORES",
|
||||
"PublicDescription": "Counts all retired store instructions. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x82",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired software prefetch instructions.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.ALL_SWPF",
|
||||
"PublicDescription": "Counts all retired software prefetch instructions. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x84",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All retired memory instructions.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.ANY",
|
||||
"PublicDescription": "Counts all retired memory instructions - loads and stores. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x87",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions with locked access.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.LOCK_LOADS",
|
||||
"PublicDescription": "Counts retired load instructions with locked access. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x21",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions that split across a cacheline boundary.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.SPLIT_LOADS",
|
||||
"PublicDescription": "Counts retired load instructions that split across a cacheline boundary. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x41",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired store instructions that split across a cacheline boundary.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.SPLIT_STORES",
|
||||
"PublicDescription": "Counts retired store instructions that split across a cacheline boundary. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x42",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions that hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.STLB_HIT_LOADS",
|
||||
"PublicDescription": "Number of retired load instructions with a clean hit in the 2nd-level TLB (STLB). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x9",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired store instructions that hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.STLB_HIT_STORES",
|
||||
"PublicDescription": "Number of retired store instructions that hit in the 2nd-level TLB (STLB). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xa",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions that miss the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.STLB_MISS_LOADS",
|
||||
"PublicDescription": "Number of retired load instructions that (start a) miss in the 2nd-level TLB (STLB). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x11",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired store instructions that miss the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd0",
|
||||
"EventName": "MEM_INST_RETIRED.STLB_MISS_STORES",
|
||||
"PublicDescription": "Number of retired store instructions that (start a) miss in the 2nd-level TLB (STLB). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x12",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xD6",
|
||||
"EventName": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB",
|
||||
"MSRIndex": "0x3E0,0x3E1,0x3E2,0x3E3",
|
||||
"MSRValue": "0xED000400000001",
|
||||
"PublicDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100021",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB_SNP_HIT_NO_FWD",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xD6",
|
||||
"EventName": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB_SNP_HIT_NO_FWD",
|
||||
"MSRIndex": "0x3E0,0x3E1,0x3E2,0x3E3",
|
||||
"MSRValue": "0x4D000400000001",
|
||||
"PublicDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_HIT_SAME_CBB_SNP_HIT_NO_FWD Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100021",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_MISS",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xD6",
|
||||
"EventName": "MEM_LOAD_L2_MISS_RETIRED.L3_MISS",
|
||||
"MSRIndex": "0x3E0,0x3E1,0x3E2,0x3E3",
|
||||
"MSRValue": "0xFF03F000000001",
|
||||
"PublicDescription": "MEM_LOAD_L2_MISS_RETIRED.L3_MISS Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100021",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "MEM_LOAD_L2_MISS_RETIRED.MEM_REGION_1",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xD6",
|
||||
"EventName": "MEM_LOAD_L2_MISS_RETIRED.MEM_REGION_1",
|
||||
"MSRIndex": "0x3E0,0x3E1,0x3E2,0x3E3",
|
||||
"MSRValue": "0xF5020000000001",
|
||||
"PublicDescription": "MEM_LOAD_L2_MISS_RETIRED.MEM_REGION_1 Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100021",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions with at least 1 uncacheable load or lock.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd4",
|
||||
"EventName": "MEM_LOAD_MISC_RETIRED.UC",
|
||||
"PublicDescription": "Retired instructions with at least one load to uncacheable memory-type, or at least one cache-line split locked access (Bus Lock). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of completed demand load requests that missed the L1, but hit the FB(fill buffer), because a preceding miss to the same cacheline initiated the line to be brought into L1, but data is not yet ready in L1.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.FB_HIT",
|
||||
"PublicDescription": "Counts retired load instructions with at least one uop was load missed in L1 but hit FB (Fill Buffers) due to preceding miss to the same cache line with data not ready. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions with L1 cache hits as data sources",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L1_HIT",
|
||||
"PublicDescription": "Counts retired load instructions with at least one uop that hit in the L1 data cache. This event includes all SW prefetches and lock instructions regardless of the data source. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x6",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts retired load instructions with at least one uop that hit in the Level 0 of the L1 data cache. This event includes all SW prefetches and lock instructions regardless of the data source.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L1_HIT_L0",
|
||||
"PublicDescription": "Counts retired load instructions with at least one uop that hit in the Level 0 of the L1 data cache. This event includes all SW prefetches and lock instructions regardless of the data source. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts retired load instructions with at least one uop that hit in the Level 1 of the L1 data cache.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L1_HIT_L1",
|
||||
"PublicDescription": "Counts retired load instructions with at least one uop that hit in the Level 1 of the L1 data cache. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions missed L1 cache as data sources",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L1_MISS",
|
||||
"PublicDescription": "Counts retired load instructions with at least one uop that missed in the L1 cache. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instruction with at least 1 load uop whose Data Source was: Hit in L2 cache in a local slice of MLC of DCM.",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L2_HIT_LOCAL",
|
||||
"PublicDescription": "Retired instruction with at least 1 load uop whose Data Source was: Hit in L2 cache in a local slice of MLC of DCM. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "50021",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired load instructions missed L2 cache as data sources",
|
||||
"Counter": "0,1,2,3",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xd1",
|
||||
"EventName": "MEM_LOAD_RETIRED.L2_MISS",
|
||||
"PublicDescription": "Counts retired load instructions missed L2 cache as data sources. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100021",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "MEM_STORE_RETIRED.L2_HIT_LOCAL",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x44",
|
||||
"EventName": "MEM_STORE_RETIRED.L2_HIT_LOCAL",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired memory uops for any access",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe5",
|
||||
"EventName": "MEM_UOP_RETIRED.ANY",
|
||||
"PublicDescription": "Number of retired micro-operations (uops) for load or store memory accesses",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xf",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts bus locks, accounts for cache line split locks and UC locks.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x2c",
|
||||
"EventName": "SQ_MISC.BUS_LOCK",
|
||||
"PublicDescription": "Counts the more expensive bus lock needed to enforce cache coherency for certain memory accesses that need to be done atomically. Can be created by issuing an atomic instruction (via the LOCK prefix) which causes a cache line split or accesses uncacheable memory.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of PREFETCHNTA, PREFETCHW, PREFETCHT0, PREFETCHT1 or PREFETCHT2 instructions executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "SW_PREFETCH_ACCESS.ANY",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xf",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHNTA instructions executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "SW_PREFETCH_ACCESS.NTA",
|
||||
"PublicDescription": "Counts the number of PREFETCHNTA instructions executed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHW instructions executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "SW_PREFETCH_ACCESS.PREFETCHW",
|
||||
"PublicDescription": "Counts the number of PREFETCHW instructions executed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHT0 instructions executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T0",
|
||||
"PublicDescription": "Counts the number of PREFETCHT0 instructions executed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHT1 or PREFETCHT2 instructions executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x40",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T1_T2",
|
||||
"PublicDescription": "Counts the number of PREFETCHT1 or PREFETCHT2 instructions executed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
}
|
||||
]
|
||||
17
tools/perf/pmu-events/arch/x86/novalake/counter.json
Normal file
17
tools/perf/pmu-events/arch/x86/novalake/counter.json
Normal file
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"Unit": "cpu_atom",
|
||||
"CountersNumFixed": "7",
|
||||
"CountersNumGeneric": "8"
|
||||
},
|
||||
{
|
||||
"Unit": "cpu_core",
|
||||
"CountersNumFixed": "4",
|
||||
"CountersNumGeneric": "8"
|
||||
},
|
||||
{
|
||||
"Unit": "iMC",
|
||||
"CountersNumFixed": "0",
|
||||
"CountersNumGeneric": "5"
|
||||
}
|
||||
]
|
||||
452
tools/perf/pmu-events/arch/x86/novalake/floating-point.json
Normal file
452
tools/perf/pmu-events/arch/x86/novalake/floating-point.json
Normal file
@@ -0,0 +1,452 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles when any of the floating point dividers are active.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.FPDIV_ACTIVE",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when floating-point divide unit is busy executing divide or square root operations.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0xb0",
|
||||
"EventName": "ARITH.FPDIV_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when divide unit is busy executing divide or square root operations. Accounts for floating-point operations only.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of active floating point dividers per cycle in the loop stage.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.FPDIV_OCCUPANCY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of floating point divider uops executed per cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "ARITH.FPDIV_UOPS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts all microcode FP assists.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc1",
|
||||
"EventName": "ASSISTS.FP",
|
||||
"PublicDescription": "Counts all microcode Floating Point assists.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "ASSISTS.SSE_AVX_MIX",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc1",
|
||||
"EventName": "ASSISTS.SSE_AVX_MIX",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V0",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V0",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V1",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V2",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V3",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V3",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V4",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V4",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_DISPATCHED.V5",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb3",
|
||||
"EventName": "FP_ARITH_DISPATCHED.V5",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 512-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 16 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 512-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 16 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x80",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational scalar double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational scalar single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_INST_RETIRED.VECTOR_128B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.VECTOR_128B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x40c",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_INST_RETIRED.VECTOR_256B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.VECTOR_256B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x830",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_INST_RETIRED.VECTOR_512B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc8",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.VECTOR_512B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10c0",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.128B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.128B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.256B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.256B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RCP DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single and 256-bit packed double precision FP instructions retired; some instructions will count twice as noted below. Each count represents 2 or/and 4 computation operations, 1 for each element. Applies to SSE* and AVX* packed single precision and packed double precision FP instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.4_FLOPS",
|
||||
"PublicDescription": "Number of SSE/AVX computational 128-bit packed single precision and 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 or/and 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point and packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x18",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.512B_PACKED_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational 512-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 16 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.512B_PACKED_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational 512-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 16 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT14 RCP14 FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x80",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision and 512-bit packed double precision FP instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, 1 for each element. Applies to SSE* and AVX* packed single precision and double precision FP instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RSQRT14 RCP RCP14 DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.8_FLOPS",
|
||||
"PublicDescription": "Number of SSE/AVX computational 256-bit packed single precision and 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision and double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT RSQRT14 RCP RCP14 DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x460",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar floating-point instructions retired; some instructions will count twice as noted below. Applies to SSE* and AVX* scalar, double and single precision floating-point: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 RANGE SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.SCALAR",
|
||||
"PublicDescription": "Number of SSE/AVX computational scalar single precision and double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational scalar double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.SCALAR_DOUBLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of SSE/AVX computational scalar single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.SCALAR_SINGLE",
|
||||
"PublicDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computational operation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT RSQRT RCP FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of any Vector retired FP arithmetic instructions",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.VECTOR",
|
||||
"PublicDescription": "Number of any Vector retired FP arithmetic instructions. The DAZ and FTZ flags in the MXCSR register need to be set when using these events.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x3c",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_OPS_RETIRED.VECTOR_128B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.VECTOR_128B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x40c",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_OPS_RETIRED.VECTOR_256B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.VECTOR_256B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x830",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FP_ARITH_OPS_RETIRED.VECTOR_512B",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc7",
|
||||
"EventName": "FP_ARITH_OPS_RETIRED.VECTOR_512B",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10c0",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on all floating point ports.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.ALL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1f",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P0",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 1.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 2.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P2",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.P3",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer port 0, 1, 2, 3.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.PRIMARY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1e",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of uops executed on floating point and vector integer store data port.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xb2",
|
||||
"EventName": "FP_VINT_UOPS_EXECUTED.STD",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of floating point operations retired that required microcode assist.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.FP_ASSIST",
|
||||
"PublicDescription": "Counts the number of floating point operations retired that required microcode assist, which is not a reflection of the number of FP operations, instructions or uops.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of floating point divide uops retired (x87 and sse, including x87 sqrt).",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xc2",
|
||||
"EventName": "UOPS_RETIRED.FPDIV",
|
||||
"PublicDescription": "Counts the number of floating point divide uops retired (x87 and sse, including x87 sqrt). Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_atom"
|
||||
}
|
||||
]
|
||||
600
tools/perf/pmu-events/arch/x86/novalake/frontend.json
Normal file
600
tools/perf/pmu-events/arch/x86/novalake/frontend.json
Normal file
@@ -0,0 +1,600 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the total number of BACLEARS due to all branch types including conditional and unconditional jumps, returns, and indirect branches.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe6",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"PublicDescription": "Counts the total number of BACLEARS, which occur when the Branch Target Buffer (BTB) prediction or lack thereof, was corrected by a later branch predictor in the frontend. Includes BACLEARS due to all branch types including conditional and unconditional jumps, returns, and indirect branches.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Clears due to Unknown Branches.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x60",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"PublicDescription": "Number of times the front-end is resteered when it finds a branch instruction in a fetch line. This is called Unknown Branch which occurs for the first time a branch instruction is fetched or when the branch is not tracked by the BPU (Branch Prediction Unit) anymore.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of BACLEARS due to a conditional jump.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe6",
|
||||
"EventName": "BACLEARS.COND",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of BACLEARS due to an indirect branch.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe6",
|
||||
"EventName": "BACLEARS.INDIRECT",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of BACLEARS due to a return branch.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe6",
|
||||
"EventName": "BACLEARS.RETURN",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of BACLEARS due to a direct, unconditional jump.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe6",
|
||||
"EventName": "BACLEARS.UNCOND",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Stalls caused by changing prefix length of the instruction.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x87",
|
||||
"EventName": "DECODE.LCP",
|
||||
"PublicDescription": "Counts cycles that the Instruction Length decoder (ILD) stalls occurred due to dynamically changing prefix length of the decoded instruction (by operand size prefix instruction 0x66, address size prefix instruction 0x67 or REX.W for Intel64). Count is proportional to the number of prefixes in a 16B-line. This may result in a three-cycle penalty for each LCP (Length changing prefix) in a 16-byte chunk.",
|
||||
"SampleAfterValue": "500009",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles the Microcode Sequencer is busy.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x87",
|
||||
"EventName": "DECODE.MS_BUSY",
|
||||
"SampleAfterValue": "500009",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "DSB-to-MITE switch true penalty cycles.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x61",
|
||||
"EventName": "DSB2MITE_SWITCHES.PENALTY_CYCLES",
|
||||
"PublicDescription": "Decode Stream Buffer (DSB) is a Uop-cache that holds translations of previously fetched instructions that were decoded by the legacy x86 decode pipeline (MITE). This event counts fetch penalty cycles when a transition occurs from DSB to MITE.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired ANT branches",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.ANY_ANT",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x9",
|
||||
"PublicDescription": "Always Not Taken (ANT) conditional retired branches (no BTB entry and not mispredicted) Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced DSB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.ANY_DSB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x1",
|
||||
"PublicDescription": "Counts retired Instructions that experienced DSB (Decode stream buffer i.e. the decoded instruction-cache) miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced a critical DSB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.DSB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x11",
|
||||
"PublicDescription": "Number of retired Instructions that experienced a critical DSB (Decode stream buffer i.e. the decoded instruction-cache) miss. Critical means stalls were exposed to the back-end as a result of the DSB miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of instructions retired that were tagged because empty issue slots were seen before the uop due to icache miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.ICACHE",
|
||||
"PublicDescription": "Counts the number of instructions retired that were tagged because empty issue slots were seen before the uop due to icache miss Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of instructions retired that were tagged because empty issue slots were seen before the uop due to ITLB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.ITLB_MISS",
|
||||
"PublicDescription": "Counts the number of instructions retired that were tagged because empty issue slots were seen before the uop due to ITLB miss Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced iTLB true miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.ITLB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x14",
|
||||
"PublicDescription": "Counts retired Instructions that experienced iTLB (Instruction TLB) true miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L1 Cache true miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.L1I_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x12",
|
||||
"PublicDescription": "Counts retired Instructions who experienced Instruction L1 Cache true miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L2 Cache true miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.L2_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x13",
|
||||
"PublicDescription": "Counts retired Instructions who experienced Instruction L2 Cache true miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 128 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_128",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x608006",
|
||||
"PublicDescription": "Counts retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 128 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 16 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_16",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x601006",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 16 cycles. During this period the front-end delivered no uops. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions after front-end starvation of at least 2 cycles",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x600206",
|
||||
"PublicDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of at least 2 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 256 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_256",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x610006",
|
||||
"PublicDescription": "Counts retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 256 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 1 bubble-slot for a period of 2 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_1",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x100206",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after the front-end had at least 1 bubble-slot for a period of 2 cycles. A bubble-slot is an empty issue-pipeline slot while there was no RAT stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 32 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_32",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x602006",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 32 cycles. During this period the front-end delivered no uops. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 4 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_4",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x600406",
|
||||
"PublicDescription": "Counts retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 4 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 512 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_512",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x620006",
|
||||
"PublicDescription": "Counts retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 512 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 64 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_64",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x604006",
|
||||
"PublicDescription": "Counts retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 64 cycles which was not interrupted by a back-end stall. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 8 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_8",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x600806",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 8 cycles. During this period the front-end delivered no uops. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Mispredicted Retired ANT branches",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.MISP_ANT",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x9",
|
||||
"PublicDescription": "ANT retired branches that got just mispredicted Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts flows delivered by the Microcode Sequencer",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.MS_FLOWS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x8",
|
||||
"PublicDescription": "Counts flows delivered by the Microcode Sequencer Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced STLB (2nd level TLB) true miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.STLB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x15",
|
||||
"PublicDescription": "Counts retired Instructions that experienced STLB (2nd level TLB) true miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that caused clears due to being Unknown Branches.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.UNKNOWN_BRANCH",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x17",
|
||||
"PublicDescription": "Number retired branch instructions that caused the front-end to be resteered when it finds the instruction in a fetch line. This is called Unknown Branch which occurs for the first time a branch instruction is fetched or when the branch is not tracked by the BPU (Branch Prediction Unit) anymore. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every time the code stream enters into a new cache line by walking sequential from the previous line or being redirected by a jump.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE.ACCESSES",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x3",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every time the code stream enters into a new cache line by walking sequential from the previous line or being redirected by a jump and the instruction cache registers bytes are present.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE.HIT",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts every time the code stream enters into a new cache line by walking sequential from the previous line or being redirected by a jump and the instruction cache registers bytes are not present.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE.MISSES",
|
||||
"PublicDescription": "Counts every time the code stream enters into a new cache line by walking sequential from the previous line or being redirected by a jump and the instruction cache registers bytes are not present. -",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE_DATA.STALLS",
|
||||
"PublicDescription": "Counts cycles where a code line fetch is stalled due to an L1 instruction cache miss. The decode pipeline works at a 32 Byte granularity.",
|
||||
"SampleAfterValue": "500009",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "ICACHE_DATA.STALL_PERIODS",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE_DATA.STALL_PERIODS",
|
||||
"SampleAfterValue": "500009",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache tag miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_TAG.STALLS",
|
||||
"PublicDescription": "Counts cycles where a code fetch is stalled due to L1 instruction cache tag miss.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache In use-full",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_TAG.STALLS_INUSE",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache ISB-full",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_TAG.STALLS_ISB",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.DSB_CYCLES_ANY",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles DSB is delivering optimal number of Uops",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "8",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.DSB_CYCLES_OK",
|
||||
"PublicDescription": "Counts the number of cycles where optimal number of uops was delivered to the Instruction Decode Queue (IDQ) from the DSB (Decode Stream Buffer) path. Count includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles MITE is delivering any Uop",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MITE_CYCLES_ANY",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles MITE is delivering optimal number of Uops",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "8",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MITE_CYCLES_OK",
|
||||
"PublicDescription": "Counts the number of cycles where optimal number of uops was delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MITE_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when uops are being delivered to IDQ while MS is busy",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_CYCLES_ANY",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of switches from DSB or MITE to the MS",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"PublicDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops initiated by MITE or Decode Stream Buffer (DSB) and delivered to Instruction Decode Queue (IDQ) while Microcode Sequencer (MS) is busy",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"PublicDescription": "Counts the number of uops initiated by MITE or Decode Stream Buffer (DSB) and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "count cycles when IDQ didn't deliver any uop for 1 cycle, counts 1-cycle starvation windows.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x9c",
|
||||
"EventName": "IDQ_BUBBLES.BW_STARVATION",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event counts a subset of the Topdown Slots event that when no operation was delivered to the back-end pipeline due to instruction fetch limitations when the back-end could have accepted more operations. Common examples include instruction cache misses or x86 instruction decode limitations.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x9c",
|
||||
"EventName": "IDQ_BUBBLES.CORE",
|
||||
"PublicDescription": "This event counts a subset of the Topdown Slots event that when no operation was delivered to the back-end pipeline due to instruction fetch limitations when the back-end could have accepted more operations. Common examples include instruction cache misses or x86 instruction decode limitations. Software can use this event as the numerator for the Frontend Bound metric (or top-level category) of the Top-down Microarchitecture Analysis method.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when optimal number of uops was delivered to the back-end when the back-end is not stalled",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x9c",
|
||||
"EventName": "IDQ_BUBBLES.CYCLES_FE_WAS_OK",
|
||||
"Invert": "1",
|
||||
"PublicDescription": "Counts the number of cycles when the optimal number of uops were delivered by the Instruction Decode Queue (IDQ) to the back-end of the pipeline when there was no back-end stalls.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when no uops are delivered by the IDQ for 2 or more cycles when backend of the machine is not stalled - normally indicating a Fetch Latency issue",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x9c",
|
||||
"EventName": "IDQ_BUBBLES.FETCH_LATENCY",
|
||||
"PublicDescription": "Counts the number of cycles when no uops were delivered by the Instruction Decode Queue (IDQ) to the back-end of the pipeline when there was no back-end stalls for 2 or more cycles - normally indicating a Fetch Latency issue.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when no uops are not delivered by the IDQ when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "8",
|
||||
"EventCode": "0x9c",
|
||||
"EventName": "IDQ_BUBBLES.STARVATION_CYCLES",
|
||||
"PublicDescription": "Counts the number of cycles when no uops were delivered by the Instruction Decode Queue (IDQ) to the back-end of the pipeline when there was no back-end stalls.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the MS is busy.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe7",
|
||||
"EventName": "MS_DECODED.MS_BUSY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of times entered into a ucode flow in the FEC. Includes inserted flows due to front-end detected faults or assists.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe7",
|
||||
"EventName": "MS_DECODED.MS_ENTRY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of times nanocode flow is executed.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe7",
|
||||
"EventName": "MS_DECODED.NANO_CODE",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
}
|
||||
]
|
||||
299
tools/perf/pmu-events/arch/x86/novalake/memory.json
Normal file
299
tools/perf/pmu-events/arch/x86/novalake/memory.json
Normal file
@@ -0,0 +1,299 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to any number of reasons, including an L1 miss, WCB full, pagewalk, store address block or store data block.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ANY",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x7f",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to any number of reasons, including an L1 miss, WCB full, pagewalk, store address block or store data block, on a load that retires.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ANY_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xff",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a core bound stall including a store address match, a DTLB miss or a page walk that detains the load from retiring.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.L1_BOUND_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xf4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a DL1 miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.L1_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a DL1 miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.L1_MISS_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x81",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to other block cases.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.OTHER",
|
||||
"PublicDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to other block cases such as pipeline conflicts, fences, etc.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x40",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to other block cases.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.OTHER_AT_RET",
|
||||
"PublicDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to other block cases such as pipeline conflicts, fences, etc.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xc0",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a pagewalk.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.PGWALK",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a pagewalk.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.PGWALK_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0xa0",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a store address match.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ST_ADDR",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a store address match.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.ST_ADDR_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x84",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to request buffers full or lock in progress.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.WCB_FULL_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x82",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machine clears due to memory ordering caused by a snoop from an external agent. Does not count internally generated machine clears such as those due to memory disambiguation.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.MEMORY_ORDERING",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of machine clears due to memory ordering conflicts.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.MEMORY_ORDERING",
|
||||
"PublicDescription": "Counts the number of Machine Clears detected dye to memory ordering. Memory Ordering Machine Clears may apply when a memory read may not conform to the memory ordering rules of the x86 architecture",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of machine clears that flush the pipeline and restart the machine without the use of microcode.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc3",
|
||||
"EventName": "MACHINE_CLEARS.MEMORY_ORDERING_FAST",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8002",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Execution stalls while L3 cache miss demand load is outstanding.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x47",
|
||||
"EventName": "MEMORY_ACTIVITY.STALLS_L3_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x48",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 1024 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_1024",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x400",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 1024 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "53",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 128 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_128",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x80",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 128 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1009",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 16 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_16",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x10",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 16 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "20011",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 2048 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_2048",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x800",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 2048 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "23",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 256 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_256",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x100",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 256 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "503",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 32 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_32",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x20",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 32 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100007",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 4 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_4",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x4",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 4 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 512 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_512",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x200",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 512 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "101",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 64 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_64",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x40",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 64 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "2003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 8 cycles.",
|
||||
"Counter": "2,3,4,5,6,7",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.LOAD_LATENCY_GT_8",
|
||||
"MSRIndex": "0x3F6",
|
||||
"MSRValue": "0x8",
|
||||
"PublicDescription": "Counts randomly selected loads when the latency from first dispatch to completion is greater than 8 cycles. Reported latency may be longer than just the memory latency. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "50021",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired memory store access operations. A PDist event for PEBS Store Latency Facility.",
|
||||
"Counter": "0,1",
|
||||
"Data_LA": "1",
|
||||
"EventCode": "0xcd",
|
||||
"EventName": "MEM_TRANS_RETIRED.STORE_SAMPLE",
|
||||
"PublicDescription": "Counts Retired memory accesses with at least 1 store operation. This PEBS event is the precisely-distributed (PDist) trigger covering all stores uops for sampling by the PEBS Store Latency Facility. The facility is described in Intel SDM Volume 3 section 19.9.8 Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
}
|
||||
]
|
||||
144
tools/perf/pmu-events/arch/x86/novalake/other.json
Normal file
144
tools/perf/pmu-events/arch/x86/novalake/other.json
Normal file
@@ -0,0 +1,144 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Count all other hardware assists or traps that are not necessarily architecturally exposed (through a software handler) beyond FP; SSE-AVX mix and A/D assists who are counted by dedicated sub-events.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc1",
|
||||
"EventName": "ASSISTS.HARDWARE",
|
||||
"PublicDescription": "Count all other hardware assists or traps that are not necessarily architecturally exposed (through a software handler) beyond FP; SSE-AVX mix and A/D assists who are counted by dedicated sub-events. This includes, but not limited to, assists at EXE or MEM uop writeback like AVX* load/store/gather/scatter (non-FP GSSE-assist ) , assists generated by ROB like PEBS and RTIT, Uncore trap, RAR (Remote Action Request) and CET (Control flow Enforcement Technology) assists.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "ASSISTS.PAGE_FAULT",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc1",
|
||||
"EventName": "ASSISTS.PAGE_FAULT",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core cycles during which interrupts are masked.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcb",
|
||||
"EventName": "HW_INTERRUPTS.MASKED",
|
||||
"PublicDescription": "Core cycles during which interrupts are masked (disabled, when RFLAGS.IF is clear) while thread is Unhalted.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core cycles during which there are pending interrupts but interrupts are masked.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcb",
|
||||
"EventName": "HW_INTERRUPTS.PENDING_AND_MASKED",
|
||||
"PublicDescription": "Core cycles during which there are pending interrupts but interrupts are masked (disabled, when RFLAGS.IF is clear and there is pending interrupt from PIC) while thread is Unhalted.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of hardware interrupts received by the processor.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xcb",
|
||||
"EventName": "HW_INTERRUPTS.RECEIVED",
|
||||
"PublicDescription": "Counts the number of hardware interruptions received by the processor.",
|
||||
"SampleAfterValue": "203",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of LBR entries recorded. Requires LBRs to be enabled in IA32_LBR_CTL. [This event is alias to MISC_RETIRED.LBR_INSERTS]",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xe4",
|
||||
"EventName": "LBR_INSERTS.ANY",
|
||||
"PublicDescription": "Counts the number of LBR entries recorded. Requires LBRs to be enabled in IA32_LBR_CTL. [This event is alias to MISC_RETIRED.LBR_INSERTS] Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "number of port pushouts of integer ports (ready uop was delayed due to port being used by another uop) including integer STD.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xab",
|
||||
"EventName": "PORT_PUSHOUT.INTEGER",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "number of port pushouts of vector ports (ready uop was delayed due to port being used by another uop)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xab",
|
||||
"EventName": "PORT_PUSHOUT.VECTOR",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of vector uops scheduled for execution (no cancel) including vec/fp STD uops- ports with ready uops",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xaa",
|
||||
"EventName": "PORT_READY.VECTOR",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Alloc Stall cycles when stall is due to general shared resource (e.g. ROB) and is not MEMORY_BOUND stall",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xa9",
|
||||
"EventName": "STALL_CORE_BOUND.GENERAL",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Alloc Stall cycles when stall is due to MEM RS resource and is not MEMORY_BOUND stall",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xa9",
|
||||
"EventName": "STALL_CORE_BOUND.MEM_ADDRESS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Alloc Stall cycles when the stall is due to MEM RS resource or other memory resource and is not MEMORY_BOUND",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xa9",
|
||||
"EventName": "STALL_CORE_BOUND.MEM_RESOURCE",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x14",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Alloc Stall cycles when stall is due to serialization and is not MEMORY_BOUND stall",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xa9",
|
||||
"EventName": "STALL_CORE_BOUND.SERIALIZATION",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Alloc Stall cycles when stall is due to vector stack resource and is not MEMORY_BOUND stall",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xa9",
|
||||
"EventName": "STALL_CORE_BOUND.VECTOR",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles the uncore cannot take further requests",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x2d",
|
||||
"EventName": "XQ.FULL",
|
||||
"PublicDescription": "number of cycles when the thread is active and the uncore cannot take any further requests (for example prefetches, loads or stores initiated by the Core that miss the L2 cache).",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_core"
|
||||
}
|
||||
]
|
||||
1976
tools/perf/pmu-events/arch/x86/novalake/pipeline.json
Normal file
1976
tools/perf/pmu-events/arch/x86/novalake/pipeline.json
Normal file
File diff suppressed because it is too large
Load Diff
42
tools/perf/pmu-events/arch/x86/novalake/uncore-memory.json
Normal file
42
tools/perf/pmu-events/arch/x86/novalake/uncore-memory.json
Normal file
@@ -0,0 +1,42 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Read CAS command sent to DRAM (including Read CAS with auto precharge)",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x22",
|
||||
"EventName": "UNC_M_CAS_COUNT_RD",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Write CAS command sent to DRAM (including Write CAS with auto precharge)",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x23",
|
||||
"EventName": "UNC_M_CAS_COUNT_WR",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This counter counts number of bytes read, in 32B chunk, per DDR channel. Counter increments by 1 after receiving 32B chunk data. Note this includes data from mode register accesses",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x3A",
|
||||
"EventName": "UNC_M_RD_DATA",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total number of read and write byte transfers to/from DRAM, in 32B chunk, per DDR channel. Counter increments by 1 after sending or receiving 32B chunk data. Note this includes data from mode register accesses. Does not support channel masking",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x3C",
|
||||
"EventName": "UNC_M_TOTAL_DATA",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This counter counts number of bytes written, in 32B chunk, per DDR channel. Counter increments by 1 after sending 32B chunk data.",
|
||||
"Counter": "0,1,2,3,4",
|
||||
"EventCode": "0x3B",
|
||||
"EventName": "UNC_M_WR_DATA",
|
||||
"PerPkg": "1",
|
||||
"Unit": "iMC"
|
||||
}
|
||||
]
|
||||
338
tools/perf/pmu-events/arch/x86/novalake/virtual-memory.json
Normal file
338
tools/perf/pmu-events/arch/x86/novalake/virtual-memory.json
Normal file
@@ -0,0 +1,338 @@
|
||||
[
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks initiated by a demand load that missed the first and second level TLBs.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.MISS_CAUSED_WALK",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of first level TLB misses but second level hits due to a demand load that did not start a page walk. Accounts for all page sizes. Will result in a DTLB write from STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x60",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Loads that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts loads that miss the DTLB (Data TLB) and hit the STLB (Second level TLB).",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x320",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a demand load.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a demand load.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Load miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts completed page walks (all page sizes) caused by demand data loads. This implies it missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data load to a 1G page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts completed page walks (1G sizes) caused by demand data loads. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data load to a 2M/4M page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts completed page walks (2M/4M sizes) caused by demand data loads. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks completed due to load DTLB misses to a 4K page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts the number of page walks completed due to loads (including SW prefetches) whose address translations missed in all Translation Lookaside Buffer (TLB) levels and were mapped to 4K pages. Includes page walks that page fault.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data load to a 4K page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts completed page walks (4K sizes) caused by demand data loads. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks outstanding for Loads (demand or SW prefetch) in PMH every cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts the number of page walks outstanding for Loads (demand or SW prefetch) in PMH every cycle. A PMH page walk is outstanding from page walk start till PMH becomes idle again (ready to serve next walk). Includes EPT-walk intervals.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of page walks outstanding for a demand load in the PMH each cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x12",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts the number of page walks outstanding for a demand load in the PMH (Page Miss Handler) each cycle.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks initiated by a store that missed the first and second level TLBs.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.MISS_CAUSED_WALK",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of first level TLB misses but second level hits due to stores that did not start a page walk. Accounts for all page sizes. Will result in a DTLB write from STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts the number of first level TLB misses but second level hits due to a demand load that did not start a page walk. Accounts for all page sizes. Will result in a DTLB write from STLB.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x60",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Stores that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts stores that miss the DTLB (Data TLB) and hit the STLB (2nd Level TLB).",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x320",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a store.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a store.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Store misses in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts completed page walks (all page sizes) caused by demand data stores. This implies it missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data store to a 1G page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts completed page walks (1G sizes) caused by demand data stores. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data store to a 2M/4M page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts completed page walks (2M/4M sizes) caused by demand data stores. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks completed due to store DTLB misses to a 4K page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts the number of page walks completed due to stores whose address translations missed in all Translation Lookaside Buffer (TLB) levels and were mapped to 4K pages. Includes page walks that page fault.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walks completed due to a demand data store to a 4K page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts completed page walks (4K sizes) caused by demand data stores. This implies address translations missed in the DTLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks outstanding in the page miss handler (PMH) for stores every cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts the number of page walks outstanding in the page miss handler (PMH) for stores every cycle. A PMH page walk is outstanding from page walk start till PMH becomes idle again (ready to serve next walk). Includes EPT-walk intervals.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of page walks outstanding for a store in the PMH each cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts the number of page walks outstanding for a store in the PMH (Page Miss Handler) each cycle.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks initiated by a instruction fetch that missed the first and second level TLBs.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.MISS_CAUSED_WALK",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x1",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of first level TLB misses but second level hits due to an instruction fetch that did not start a page walk. Account for all pages sizes. Will result in an ITLB write from STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x20",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction fetch requests that miss the ITLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts instruction fetch requests that miss the ITLB (Instruction TLB) and hit the STLB (Second-level TLB).",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x120",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for code (instruction fetch) request.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a code (instruction fetch) request.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts completed page walks (all page sizes) caused by a code fetch. This implies it missed in the ITLB (Instruction TLB) and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (2M/4M)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts completed page walks (2M/4M page sizes) caused by a code fetch. This implies it missed in the ITLB (Instruction TLB) and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of page walks completed due to instruction fetch misses to a 4K page.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts the number of page walks completed due to instruction fetches whose address translations missed in all Translation Lookaside Buffer (TLB) levels and were mapped to 4K pages. Includes page walks that page fault.",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (4K)",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts completed page walks (4K page sizes) caused by a code fetch. This implies it missed in the ITLB (Instruction TLB) and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of page walks outstanding for an outstanding code request in the PMH each cycle.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "ITLB_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts the number of page walks outstanding for an outstanding code (instruction fetch) request in the PMH (Page Miss Handler) each cycle.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_core"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of retired loads that are blocked due to a first level TLB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x03",
|
||||
"EventName": "LD_BLOCKS.DTLB_MISS",
|
||||
"PublicDescription": "Counts the number of retired loads that are blocked due to a first level TLB miss. Available PDIST counters: 0,1",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x8",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer is stalled due to a DTLB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.DTLB_MISS",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x10",
|
||||
"Unit": "cpu_atom"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the number of cycles that the head (oldest load) of the load buffer and retirement are both stalled due to a DTLB miss.",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x05",
|
||||
"EventName": "LD_HEAD.DTLB_MISS_AT_RET",
|
||||
"SampleAfterValue": "1000003",
|
||||
"UMask": "0x90",
|
||||
"Unit": "cpu_atom"
|
||||
}
|
||||
]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user