2

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

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

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

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

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

现在我有了这些,我不知道该怎么做才能获得缓存块的大小,有什么建议吗?

4

1 回答 1

2

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

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

如果您想使用 prefetch 和 clflush 等指令积极地将数据刷新和预取到缓存中,则查找处理器的 Cache Line Size 会很有帮助。检测到这一点会因制造 CPU 的厂商而异。

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

对于 AMD 微处理器,调用 cpuid 函数 0x80000005 后,数据缓存线大小在 cl 中,指令缓存线大小在 dl 中。

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

于 2012-11-27T19:09:08.437 回答