对于一些精确的测量,我想从命令行中使所有缓存失效/冲洗到RAM(主存储器),以便主程序运行时间评估不受此进程的影响。我发现以下(从here第一个和最后一个):如何从命令行中使所有(数据)缓存失效?
1. echo 3 > /proc/sys/vm/drop_caches
,我可以建立一个(预执行)程序有以下
2. #include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);
或我终于可以做一个
3. int main() {
const int size = 20*1024*1024; // Allocate 20M. Set much larger then L2
char *c = (char *)malloc(size);
for (int i = 0; i < 0xffff; i++)
for (int j = 0; j < size; j++)
c[j] = i*j;
}
我的问题是:我需要做什么,哪个版本最好,如果是#2,我应该给它作为起始地址的地址是什么?我的uname -a
是Linux 3.2.0-33-generic#52-Ubuntu SMP Thu Oct 18 16:19:45 UTC 2012 i686
对不起,@艺术,这不是我的问题的答案。 –
@DervinThunk可能不是您想要听到的答案,但它是您需要听到的答案。你的问题揭示了任何现代操作系统都无法满足的假设。我扩展了答案来解决你提到的方法。结论依然存在 - 你不能做你想做的事情,即使你能做到也不会给你预期的结果。 – Art
有一个'CLFLUSH'指令可以用来刷新各个缓存行(可以从用户空间使用);除非您需要对每个MiB内存执行16384次这样的指令(可能会或可能不会)在CPU的缓存中,并且CPU可以(推测性地)在刷新缓存后立即将数据重新提取到缓存中。 – Brendan