gpt4 book ai didi

c - ARM PMU 周期计数器的值不一致

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:54 24 4
gpt4 key购买 nike

我正在尝试使用 pmu 测量我的代码在 linux 内核中的性能。首先,我想测试 pmu 因此在内核中创建了简单的一对操作循环。我将它置于禁用中断的自旋锁下,这样我的测试代码就不会被抢占。然后我打印周期计数器来检查这个循环需要多少 CPU 周期。但是我在每次打印时看到非常不同的值:100、500、1000、200,...我的问题是:为什么我每次都看到如此不同的值(value)观?PS:与循环计数器相反,pmu 的指令计数器是稳定的,我每次都看到相同的值。我也尝试使用 arm timer,但它也显示类似于 pmu 循环计数器的不同值。以下是我如何使用 ARM 定时器来衡量性能:

unsigned long long ticks_start, ticks_end;
int i = 0, j;
unsigned long flags;

spin_lock_irqsave(&lock, flags);
while (i++ < 100) {
j = 0;
asm volatile("mrs %0, CNTPCT_EL0" : "=r" (ticks_start));
while (j++ < 10000) {
asm volatile ("nop");
}
asm volatile("mrs %0, CNTPCT_EL0" : "=r" (ticks_end));
printk("ticks %d are: %llu\n", i, ticks_end - ticks_start);
}
spin_unlock_irqrestore(&lock, flags);

真实设备上的输出是(cortex A-57):

...
ticks 31 are: 2287
ticks 32 are: 2287
ticks 33 are: 2287
ticks 34 are: 1984
ticks 35 are: 457
ticks 36 are: 1604
ticks 37 are: 2287
...

最佳答案

要在 Arm 上使用定时器和 PMU 之类的东西,您应该在读取 PMU 寄存器之前插入一条 isb 指令。该架构允许处理器提前或延迟读取寄存器,因为它不依赖于 nops 的内部循环。

那么试试这个:

asm volatile("isb; mrs %0, CNTPCT_EL0" : "=r" (ticks_end));

isb 将在让 mrs 指令继续执行之前刷新管道。 CPU 也可能在热节流,但这不应该影响您使用周期计数器的测量,但如果您正在读取通用计时器来测量时间,它就会影响。

关于c - ARM PMU 周期计数器的值不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58586320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com