如何刷新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));
}
但这在编译时会给出以下错误:
错误:"易失性"之前的预期主表达式
然后我将其更改如下:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}
它编译成功,但计时结果没有改变。如果编译器出于优化目的而将其删除,我对此表示怀疑。 任何人都知道如何解决这个问题?
第二个刷新包含指针的内存__p
,它在堆栈上,这就是为什么它没有你想要的效果。
第一个的问题是它使用 宏__force
,这是在 Linux 内核中定义的,在这里不需要。(__attribute__((力))做什么?
如果您删除__force
,它将执行您想要的操作。
(您还应该更改它以避免使用变量名__p
,这是一个保留标识符。
相关文章:
- 将数组的地址分配给变量并删除
- 为什么在全局范围内使用"extern int a"似乎不行?
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 指向地址的指针似乎调整在范围之外
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 如何找到在本地范围内声明的变量的地址?
- 指针上的 For 循环:它会移动整个地址范围吗?
- 如何使用C或C 查找给定的IPv6地址是否属于CIDR范围
- 如何刷新CPU缓存中的地址范围?
- 变量循环范围会导致返回局部变量的地址引用
- C 线程堆栈地址范围
- IP 地址重叠/在 CIDR 范围内
- 本地变量的地址不在smaps显示的堆栈地址范围内
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- 从堆栈地址形成指针范围是未定义的行为吗
- 为什么运行得很好?(范围外变量的访问地址)
- 什么原因导致std::sort()访问超出范围的地址
- 是否有一种方法可以获得堆上可用的内存地址范围
- CUDA 运行时错误:未指定的启动失败 & 超出范围的共享或本地地址