プログラムのプロファイリングを行ったところ、「_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 ミスが発生したのはなぜですか? それを防ぐ方法はありますか?ありがとう!