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

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

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

这是输出:@H_301_3@took 81 ticks

took 81 ticks

flush: took 387 ticks

took 72 ticks

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

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

源代码:@H_301_3@#include

#include

inline void

clflush(volatile void *p)

{

asm volatile ("clflush (%0)" :: "r"(p));

}

inline uint64_t

rdtsc()

{

unsigned long a,d;

asm volatile ("rdtsc" : "=a" (a),"=d" (d));

return a | ((uint64_t)d << 32);

}

volatile int i;

inline void

test()

{

uint64_t start,end;

volatile int j;

start = rdtsc();

j = i;

end = rdtsc();

printf("took %lu ticks\n",end - start);

}

int

main(int ac,char **av)

{

test();

test();

printf("flush: ");

clflush(&i);

test();

test();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值