我正在試驗PERF_EVENTS,這是Linux內核提供的性能事件接口。我通過perf_event_open系統調用成功地獲取了參數(cpu cycles,...)。perf_event_open可能被濫用syscall
long
perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
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_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_CPU_CYCLES;
pe.disabled = 1;
pe.exclude_idle = 1;
pe.exclude_kernel = 1;
pe.exclude_callchain_kernel = 1;
fd = perf_event_open(&pe, 0, -1, -1, 0);
if (fd == -1) {
fprintf(stderr, "Error opening leader %llx\n", pe.config);
exit(EXIT_FAILURE);
}
ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
printf("Measuring instruction count for this printf\n");
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
read(fd, &count, sizeof(long long));
printf("%lld \n", count);
return 0;
}
但是,我不完全理解使用perf_event_open。我盲目傳遞-1作爲第四個參數。我不會什麼時候把事件分組,什麼時候把他們分開,他們中的哪一個應該是團隊的「領導者」。下面
是第四參數的文檔:
的group_fd參數允許創建事件組。一個事件組有一個事件是組長。首先創建領導者,使用group_fd = -1。其餘的組成員是通過隨後的perf_event_open()調用創建的,其中group_fd被設置爲組長的fd。 (單個事件是通過group_fd = -1創建的,並且被認爲是隻有一個成員的組)。事件組作爲一個單元被安排在CPU上:只有當所有的事件組組中的事件可以放到CPU上。這意味着成員事件的值可以有意義地相互比較,相加,區分(以得到比率)等等,因爲他們已經爲同一組執行指令計數了事件。
那麼,任何一個人都可以在第四次(如果可能的話,它與第五次的關係)有所提示?做事的正確方法是什麼? 也是一個例子會讓事情變得更好。
這是更好的解釋,但是當你說'另一個會使用第一個櫃檯的fd作爲它的領導'你的意思是他們共享相同的fd,我的理解是正確的嗎? –
否;每個計數器都有自己的文件描述符。您將創建一個作爲領導者,然後在創建第二個時,您將提供第一個fd作爲領導者: 'fd1 = perf_event_open(&pea,0,cpu,-1,0); //創建領導者' 'fd2 = perf_event_open(&pea,0,cpu,fd1,0); //創建另一個,從屬於上面的領導' –
好吧,所以這只是一種方法來確保你的計數器綁在一起關閉和CPU上 –