perf_event_open: Add support for counting REF_CPU_CYCLES
Using thread's tsc count instead of performance counter Refs: #1025 Change-Id: I1d7a18f1c52f1d52087002d31818638a6b206014
This commit is contained in:
committed by
Masamichi Takagi
parent
bc06d68d84
commit
309145587f
103
test/issues/1025/perf_case_e.c
Normal file
103
test/issues/1025/perf_case_e.c
Normal file
@ -0,0 +1,103 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <langinfo.h>
|
||||
#include <locale.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "perftool.h"
|
||||
|
||||
#define IS_GROUP 1
|
||||
|
||||
/* perf flow: Start -> calc -> Stop -> Read */
|
||||
|
||||
void
|
||||
usage()
|
||||
{
|
||||
printf("Usage: perf_case_a mode cntr_num [<type> <config>]...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
long fds[PERF_CNTR_NUM];
|
||||
long long counts[PERF_CNTR_NUM + 1];
|
||||
int types[PERF_CNTR_NUM];
|
||||
int configs[PERF_CNTR_NUM];
|
||||
int group_fd = -1;
|
||||
|
||||
int cntr_num;
|
||||
int mode;
|
||||
int i;
|
||||
|
||||
if (argc < 3) {
|
||||
printf("ERROR: Too few arguments.\n");
|
||||
usage();
|
||||
}
|
||||
|
||||
mode = atoi(argv[1]);
|
||||
cntr_num = atoi(argv[2]);
|
||||
|
||||
/* perse args */
|
||||
if (argc < cntr_num * 2 + 2) {
|
||||
printf("ERROR: Too few arguments.\n");
|
||||
usage();
|
||||
}
|
||||
|
||||
for (i = 0; i < cntr_num; i++) {
|
||||
types[i] = atoi(argv[i * 2 + 3]);
|
||||
configs[i] = atoi(argv[i * 2 + 4]);
|
||||
}
|
||||
|
||||
/* perf_event_open */
|
||||
for (i = 0; i < cntr_num; i++) {
|
||||
fds[i] = pe_opener(group_fd, mode,
|
||||
types[i], configs[i], IS_GROUP);
|
||||
if (group_fd == -1) {
|
||||
group_fd = fds[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* perf_start */
|
||||
PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP);
|
||||
|
||||
/* calc */
|
||||
calc_task();
|
||||
|
||||
/* perf_end */
|
||||
PERF_END(group_fd, PERF_IOC_FLAG_GROUP);
|
||||
|
||||
/* calc (not counted) */
|
||||
calc_task();
|
||||
|
||||
/* perf_restart */
|
||||
PERF_START(group_fd, PERF_IOC_FLAG_GROUP);
|
||||
|
||||
/* calc */
|
||||
calc_task();
|
||||
|
||||
/* perf_end and read */
|
||||
PERF_END(group_fd, PERF_IOC_FLAG_GROUP);
|
||||
PERF_READ(group_fd, counts, sizeof(counts));
|
||||
|
||||
for (i = 0; i < cntr_num; i++) {
|
||||
close(fds[i]);
|
||||
}
|
||||
|
||||
/* print result */
|
||||
for (i = 0; i < counts[0]; i++) {
|
||||
if (types[i] == PERF_TYPE_HARDWARE) {
|
||||
printf("%s: %16ld\n",
|
||||
hw_event_names[configs[i]], counts[i + 1]);
|
||||
}
|
||||
else if (types[i] == PERF_TYPE_HW_CACHE) {
|
||||
printf("%s_%s_%s: %16ld\n",
|
||||
id_names[(configs[i] >> 0) & 0xff],
|
||||
op_id_names[(configs[i] >> 8) & 0xff],
|
||||
result_names[(configs[i] >> 16) & 0xff],
|
||||
counts[i + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user