1

プログラムのプロファイリングを行ったところ、「_raw_spin_unlock_irq」システム コールが ARM Cortex A15 ボードで多くの iTLB ミスを引き起こしていることがわかりました。アセンブリ コードを注意深く確認したところ、"cpsie" 命令が原因の 1 つである可能性があることがわかりました。したがって、私は自分の仮定を検証するために短いコードをプログラムしました。

以下は私のコードです:

#include "stdio.h"
#include "stdlib.h"
void compute()
{
     int i = 100000000;
     do {
         asm volatile(
                     "cpsie i"
                     :
                     :
                     : "memory", "cc"
         i--;
     } while (i > 0);
}
int main()
{
     compute();
     return 0;
}

次に、perf ツールを使用して iTLB ミスを確認したところ、次のように報告されました。

89172 dTLB ロードミス

5694 dTLB ストア ミス

43248 iTLB ロードミス

「cpsie i」命令を削除すると、結果は次のようになります。

23453 dTLB ロードミス

1453 dTLB ストア ミス

12035 iTLB ロードミス

結果は、「cpsie i」が iTLB ミスの 4 倍に増加したことを示しています。パフォーマンス レポートを使用してバイナリ コードに注釈を付けました。69.5% の iTLB ミスが "cpsie i" 命令の後に隣接して発生しました。

       │    void compute()                                                                                       
       │    {                                                                                                     
       │      push   {r7}                                                                                         
       │      sub    sp, #12                                                                                      
       │      add    r7,                                                                                          
       │            int i = 100000000;                                                                            
       │      mov.w  r3, #57600      ; 0xe100                                                                     
       │      movt   r3, #1525       ; 0x5f5                                                                      
       │      str    r3, [r7, #4]                                                                                 
       │            do {                                                                                          
       │                    asm volatile(                                                                         
 13.93 │      cpsie  i                                                                                            
       │                            "cpsie i"                                                                     
       │                            :                                                                             
       │                            :                                                                             
       │                            :"memory", "cc");                                                             
       │                    i--;                                                                                  
 69.26 │      ldr    r3, [r7, #4]                                                                                 
       │      subs   r3, #1                                                                                       
       │      str    r3, [r7, #4]                                                                                 
       │            }while(i > 0);                                                                                
 16.80 │      ldr    r3, [r7, #4]                                                                                 
       │      cmp    r3,                                                                                          
       │      bgt.n  8400 <compute+0x10>                                                                          
       │    }                                                                                                     
       │      add.w  r7, r7, #12                                                                                  
       │      mov    sp,                                                                                          
       │      pop    {r7}                                                                                         
       │      bx     lr

「cpsie i」命令の後に多くの iTLB ミスが発生したのはなぜですか? それを防ぐ方法はありますか?ありがとう!

4

0 に答える 0