linux – 有没有办法检查处理器缓存最近是否被刷新?

linux – 有没有办法检查处理器缓存最近是否被刷新?,第1张

概述在i386 linux上.如果可能,最好在c /(c / posix std libs)/ proc中.如果没有任何一个程序集或第三方库可以做到这一点? 编辑:我正在尝试开发测试内核模块是否清除缓存行或整个处理程序(使用wbinvd()).程序以root身份运行,但如果可能,我更愿意留在用户空间. 缓存一致的系统最大限度地将你的东西隐藏起来.我想你将不得不间接地观察它,要么通过使用性能计数寄存器来 在i386 linux上.如果可能,最好在c /(c / posix std libs)/ proc中.如果没有任何一个程序集或第三方库可以做到这一点?

编辑:我正在尝试开发测试内核模块是否清除缓存行或整个处理程序(使用wbinvd()).程序以root身份运行,但如果可能,我更愿意留在用户空间.

解决方法 缓存一致的系统最大限度地将你的东西隐藏起来.我想你将不得不间接地观察它,要么通过使用性能计数寄存器来检测高速缓存未命中,要么仔细测量使用高分辨率定时器读取内存位置的时间.

这个程序适用于我的x86_64框以演示clflush的效果.使用rdtsc读取全局变量需要多长时间.作为一个直接与cpu时钟相关的指令,直接使用rdtsc是理想的选择.

这是输出:

took 81 tickstook 81 ticksflush: took 387 tickstook 72 ticks

你会看到3个试验:第一个确保我在缓存中(它是,因为它只是零作为BSS的一部分),第二个是读取我应该在缓存中的.然后,clflush将我从缓存中(连同其邻居)踢出来,并显示重新读取需要更长的时间.最终读取验证它是否回到缓存中.结果是非常可重复的,差异足够大,很容易看到缓存未命中.如果您关心校准rdtsc()的开销,您可以使差异更加显着.

如果您无法读取要测试的内存地址(尽管/ dev / mem的mmap甚至可以用于这些目的),如果您知道高速缓存的缓存线大小和关联性,则可以推断出所需的内容.然后,您可以使用可访问的内存位置来探测您感兴趣的集合中的活动.

源代码:

#include <stdio.h>#include <stdint.h>inline voIDclflush(volatile voID *p){    asm volatile ("clflush (%0)" :: "r"(p));}inline uint64_trdtsc(){    unsigned long a,d;    asm volatile ("rdtsc" : "=a" (a),"=d" (d));    return a | ((uint64_t)d << 32);}volatile int i;inline voIDtest(){    uint64_t start,end;    volatile int j;    start = rdtsc();    j = i;    end = rdtsc();    printf("took %lu ticks\n",end - start);}intmain(int ac,char **av){    test();    test();    printf("flush: ");    clflush(&i);    test();    test();    return 0;}
总结

以上是内存溢出为你收集整理的linux – 有没有办法检查处理器缓存最近是否被刷新?全部内容,希望文章能够帮你解决linux – 有没有办法检查处理器缓存最近是否被刷新?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048424.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存