程序使用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”将指向这个巨大数组的开头。
现在我有这些问题我不知道该做什么以获得缓存块的大小,有什么建议吗?
答案 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。
了解缓存行大小可让您调度有效 预取和刷新,还可以帮助您将数据与高速缓存行对齐 避免从分裂缓存行加载的边界,这可能会影响 性能