制作一个测量缓存块大小的C程序

时间:2012-11-27 16:04:45

标签: c caching

程序使用sbrk()函数声明大数组。 Sbrk按指定的增量更改数据段大小。我正在使用的标准库函数,例如:

#include  <stdio.h>  
#include <sys/time.h>  
#include <unistd.h> 

我的main()函数通过声明一个变量开始:     注册* a; 我的目标是尝试将我在内存访问期间使用的所有变量放入寄存器中 我想要的内存访问是数组。如果局部变量将驻留在内存中,则访问它们 可能会对测量产生影响。 接下来是分配数组,一个大约400万个整数的数组,在32位上是16 MB 机等。

a=sbrk(4*1024*4096+8192);
a=(int  *)((((int)a>>13)<<13)+8192);

启动程序时,会为其分配一些内存。函数sbrk()增加了这个记忆 按给定数量。在函数调用之后,“a”将指向这个巨大数组的开头。

现在我有这些问题我不知道该做什么以获得缓存块的大小,有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我知道没有办法获得直接C来获取缓存行大小。如果您使用的是x86处理器,则可以使用cpuid查询CPU的缓存行大小。

This page包含有关如何执行此操作的说明。向下滚动到CPUID — Detecting Cache Line Sizes

  

如果您愿意,查找处理器的缓存行大小非常​​有用   使用指令积极地将数据刷新并预取到缓存中   喜欢prefetch和clflush。检测到这一点取决于   谁制造了CPU。

     

对于Intel微处理器,可以通过计算缓存行大小   调用cpuid函数0x1后,将bh乘以8。

     

对于AMD微处理器,数据高速缓存行大小在cl和   指令Cache line Size在调用cpuid函数后以dl为单位   0x80000005。

     

了解缓存行大小可让您调度有效   预取和刷新,还可以帮助您将数据与高速缓存行对齐   避免从分裂缓存行加载的边界,这可能会影响   性能