Hod*_*ani 5 c++ linux x86 caching userspace
我想测试在x86上运行的linux中用户空间程序的性能。为了计算性能,我有必要将特定的缓存行刷新到内存(确保这些行无效,并且在下一个请求时将出现缓存未命中)。
我已经看到过使用cacheflush(2)的建议,该建议应该是系统调用,但g ++抱怨它没有被声明。另外,我不能使用clflush_cache_range,它显然只能在内核程序中调用。现在,我试图做的是使用以下代码:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" : "+m" (*(volatile char __force *)__p));
}
Run Code Online (Sandbox Code Playgroud)
但这在编译时会产生以下错误:
错误:“ volatile”之前预期的主表达式
然后我将其更改如下:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}
Run Code Online (Sandbox Code Playgroud)
它编译成功,但是计时结果没有改变。我怀疑编译器是否出于优化目的将其删除。剂量有人知道如何解决这个问题?
第二个刷新包含指针的内存__p,该指针位于堆栈上,这就是为什么它没有\xe2\x80\x99 达到您想要的效果。
第一个的问题是它使用了__forceLinux 内核中定义的宏,这里不需要它。(__attribute__((force)) 有什么作用?)
如果删除__force,它将执行您想要的操作。
(您还应该更改它以避免使用变量 name __p,这是一个保留的标识符。)
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |