我想对在AMD机器上运行时在一段代码中发生的内存加载操作进行计数和采样。我知道以下代码可用于计算发生在英特尔计算机上的代码块中的内存负载。
int
main(int argc, char **argv)
{
struct perf_event_attr pe;
long long count;
int fd;
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_RAW;
pe.size = sizeof(struct perf_event_attr);
/* event number of MEM_UOPS_RETIRED.ALL_LOADS
event is 81d0 */
pe.config = 0x81d0;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;
fd = perf_event_open(&pe, 0, -1, -1, 0);
if (fd == -1) {
fprintf(stderr, "Error opening %llx\n", pe.config);
exit(EXIT_FAILURE);
}
ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
// code chunk to be profiled is here
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
read(fd, &count, sizeof(long long));
printf("Number of load operations: %lld\n", count);
close(fd);
}
但是,我不知道如何从AMD机器获取同一事件的计数。我已经在https://www.amd.com/system/files/TechDocs/24593.pdf第13.2和13.3节中阅读了有关性能计数器和IBS的AMD文档。但是,没有提及任何可以在上述代码中传递给pe.config的内存负载硬件事件号。
那么,如何通过使用perf_event_open来计数或采样AMD机器中的内存加载操作?
PS:我使用的AMD处理器是AMD EPYC 7551 32核。