我想在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));
}
它编译成功,但是计时结果没有改变。我怀疑编译器是否出于优化目的将其删除。 剂量有人知道我该如何解决这个问题?
答案 0 :(得分:2)
第二个刷新包含指针__p
的内存,该内存位于堆栈上,这就是为什么它没有您想要的效果的原因。
第一个问题是它使用了__force
宏,该宏在Linux内核中定义,在此不需要。 (What does the __attribute__((force)) do?)
如果您删除__force
,它将执行您想要的操作。
(您还应该更改它以避免使用变量名__p
,它是保留的标识符。)