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

How to flush a range of address in CPU cache?

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

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

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

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

错误:‘volatile’之前需要主表达式

然后我改成如下:

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

编译成功,但计时结果没有变化。我怀疑编译器是否出于优化目的将其删除。 谁知道我该如何解决这个问题?

第二个flush了包含指针__p的内存,它在栈上,所以没有你想要的效果

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

如果您删除 __force,它将按照您的要求执行。

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