[英]Role of preempt_disable/enable and raw_local_irq_save/restore in benchmarking
以下intel( link )論文描述了一種准確基准代碼的方法。 基准測試的核心內容如下(請參閱第31頁):
preempt_disable();
raw_local_irq_save(flags);
asm volatile (
"CPUID\n\t"
"RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: "%rax", "%rbx", "%rcx", "%rdx"
);
/*call the function to measure here*/
asm volatile(
"CPUID\n\t"
"RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t": "=r" (cycles_high1), "=r" (cycles_low1):: "%rax", "%rbx", "%rcx", "%rdx"
);
raw_local_irq_restore(flags);
preempt_enable();
我在想:
raw_local_irq_save
和raw_local_irq_restore
做什么? preempt_disable
和preempt_enable
什么作用? 在您提供的鏈接中,如果您閱讀第2.2節中實際實現內核模塊的地方,則可以看到一些注釋-
preempt_disable(); /*we disable preemption on our CPU*/
這是一個Linux內核功能 ,基本上使處理器無法將上下文切換到其他進程。
第二個電話-
raw_local_irq_save(flags); /*we disable hard interrupts on our CPU*/
/*at this stage we exclusively own the CPU*/
這掩蓋了硬件上的所有中斷。 再次是另一個Linux內核功能 。
兩者共同暗示着,在基准測試完成之前,即使是硬件中斷也不會干擾處理器。 這是為了確保對處理器和其他資源(例如緩存,TLB等)的獨占訪問權。我認為您可以弄清楚為什么這樣做對於正確的基准測試是必要的。
顧名思義,其他兩個功能會在基准測試完成后重新啟用搶占並恢復中斷屏蔽。
至於將要發生的情況,如果刪除了這些調用,那么“某些事情”會打斷您的基准測試過程,並且您的測量結果會有很大的差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.