簡體   English   中英

preempt_disable / enable和raw_local_irq_save / restore在基准測試中的作用

[英]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_saveraw_local_irq_restore做什么?
  • preempt_disablepreempt_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM