如何刷新 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));
}
但这会在编译时出现以下错误:
错误:‘volatile’之前需要主表达式
然后我改成如下:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}
编译成功,但计时结果没有变化。我怀疑编译器是否出于优化目的将其删除。
谁知道我该如何解决这个问题?
第二个flush了包含指针__p
的内存,它在栈上,所以没有你想要的效果
第一个的问题是它使用了宏 __force
,它在 Linux 内核中定义,这里不需要。 ()
如果您删除 __force
,它将按照您的要求执行。
(你也应该改变它以避免使用变量名__p
,这是一个保留标识符。)
我想在 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’之前需要主表达式
然后我改成如下:
static inline void clflush(volatile void *__p)
{
asm volatile("clflush %0" :: "m" (__p));
}
编译成功,但计时结果没有变化。我怀疑编译器是否出于优化目的将其删除。 谁知道我该如何解决这个问题?
第二个flush了包含指针__p
的内存,它在栈上,所以没有你想要的效果
第一个的问题是它使用了宏 __force
,它在 Linux 内核中定义,这里不需要。 (
如果您删除 __force
,它将按照您的要求执行。
(你也应该改变它以避免使用变量名__p
,这是一个保留标识符。)