``sigsegv`在Alder Lake效率核心上阅读hw_cpu_cycles
我想阅读 perf_type_hardware
+ perf_count_hw_cpu_cycles
in intel 12gen上。
这是我的测试程序(基于
#include <linux/perf_event.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
static struct perf_event_attr attr;
static int fdperf = -1;
static struct perf_event_mmap_page *buf = 0;
long long cpucycles_amd64rdpmc(void) {
long long result;
unsigned int seq;
long long index;
long long offset;
if (fdperf == -1) {
attr.type = PERF_TYPE_HARDWARE;
attr.config = PERF_COUNT_HW_CPU_CYCLES;
attr.exclude_kernel = 1;
fdperf = syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);
buf = mmap(NULL, sysconf(_SC_PAGESIZE), PROT_READ, MAP_SHARED, fdperf, 0);
}
do {
seq = buf->lock;
asm volatile("" ::: "memory");
index = buf->index;
offset = buf->offset;
asm volatile("rdpmc;shlq $32,%%rdx;orq %%rdx,%%rax"
: "=a"(result)
: "c"(index - 1)
: "%rdx");
asm volatile("" ::: "memory");
} while (buf->lock != seq);
result += offset;
result &= 0xffffffffffff;
return result;
}
int main() {
long long c = cpucycles_amd64rdpmc();
printf("counter: %llx\n", c);
return 0;
}
如果我只是运行它,它有时 sigsegv
s out,有时会打印一些反值。
如果我将其固定到性能核心 taskset -c n./a.out
n
为 1..15
,它始终打印出计数器,,,,
如果我将其固定在效率核心上,则使用 n
为 16..23
它总是 sigsegv
s。
因此,我认为这些MSR在这些内核上不可用。
- 我在哪里可以找到有关哪些核心的信息的信息?
- 效率内核上是否还有另一个PMC(
rdtscp
)? - 编辑:IT
sigsegv
在rdpmc
带有rcx = 0x7ffffffff7ea9bd7
的指令
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论