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

时间:2019-05-08 18:12:19

标签: c++ linux caching x86 userspace

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

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

<img src="https://cdn.wpbeginner.com/wp-content/uploads/2015/01/rename-on-save.png">

但这会在编译时产生以下错误:

错误:“ volatile”之前的预期主要表达式

然后我将其更改如下:

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

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

1 个答案:

答案 0 :(得分:2)

第二个刷新包含指针__p的内存,该内存位于堆栈上,这就是为什么它没有您想要的效果的原因。

第一个问题是它使用了__force宏,该宏在Linux内核中定义,在此不需要。 (What does the __attribute__((force)) do?

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

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