如何刷新CPU缓存中的地址范围?

How to flush a range of address in CPU cache?

本文关键字:地址 范围 缓存 CPU 何刷新 刷新      更新时间:2023-10-16

我想在x86上运行的linux中测试用户空间程序的性能。为了计算性能,我有必要将特定的缓存行刷新到内存中(确保这些行无效,并且在下一次请求时会出现缓存未命中)。

我已经看到了使用 cacheflush(2) 的建议,这应该是一个系统调用,但 g++ 抱怨它没有被声明。此外,我不能使用显然只能在内核程序中调用的clflush_cache_range。 现在我试图做的是使用以下代码:

static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" : "+m" (*(volatile char __force *)__p));
}

但这在编译时会给出以下错误:

错误:"易失性"之前的预期主表达式

然后我将其更改如下:

static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}

它编译成功,但计时结果没有改变。如果编译器出于优化目的而将其删除,我对此表示怀疑。 任何人都知道如何解决这个问题?

第二个刷新包含指针的内存__p,它在堆栈上,这就是为什么它没有你想要的效果。

第一个的问题是它使用 宏__force,这是在 Linux 内核中定义的,在这里不需要。(__attribute__((力))做什么?

如果您删除__force,它将执行您想要的操作。

(您还应该更改它以避免使用变量名__p,这是一个保留标识符。