2017-07-31 30 views
0

我正在試驗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上。這意味着成員事件的值可以有意義地相互比較,相加,區分(以得到比率)等等,因爲他們已經爲同一組執行指令計數了事件。

那麼,任何一個人都可以在第四次(如果可能的話,它與第五次的關係)有所提示?做事的正確方法是什麼? 也是一個例子會讓事情變得更好。

回答

1

雖然我不確定這些標誌,但是我可以在組上給出一些顏色,但我不知道這是否能夠充分回答您的問題,而不是僅僅重新說明您所引用的文檔。

CPU硬件非常有限^因此訪問計數器必須共享。因爲您的資源可能會被取消映射,並且隨着操作系統不時決定誰會使用底層物理資源而重新映射。

如果您同時測量兩個計數器,您可能會進行一些測量:例如採取的分支數與分支預測失誤的數量。

爲了確保您的兩個計數器由操作系統共同安排在CPU和CPU之間,而不是獨立運行,您需要創建一個組。其中一個應該是領導者,然後另一個將使用第一個計數器的fd作爲其領導者。

然後你知道你讀的任何計數都來自兩個計數器都啓用並一起運行的時間。

^除了像「週期退役」這樣的常見事情外,大多數英特爾CPU只支持從數百個調色板中一次測量四種事件類型。

+0

這是更好的解釋,但是當你說'另一個會使用第一個櫃檯的f​​d作爲它的領導'你的意思是他們共享相同的fd,我的理解是正確的嗎? –

+0

否;每個計數器都有自己的文件描述符。您將創建一個作爲領導者,然後在創建第二個時,您將提供第一個fd作爲領導者: 'fd1 = perf_event_open(&pea,0,cpu,-1,0); //創建領導者' 'fd2 = perf_event_open(&pea,0,cpu,fd1,0); //創建另一個,從屬於上面的領導' –

+0

好吧,所以這只是一種方法來確保你的計數器綁在一起關閉和CPU上 –