我想测试在 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”之前的预期主表达式</p>
然后我将其更改如下:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}
它编译成功,但计时结果没有改变。我怀疑编译器是否出于优化目的将其删除。任何人都知道我该如何解决这个问题?