Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用程序检查总缓存大小_C_Caching_Size - Fatal编程技术网

C 如何使用程序检查总缓存大小

C 如何使用程序检查总缓存大小,c,caching,size,C,Caching,Size,因此,我在创建一个程序来测量C语言中的缓存大小时遇到了一些困难。我理解进行这项工作的基本概念,但我仍然无法准确地找出我做错了什么 基本上,我创建了一个长度可变的数组(2的幂),访问数组中的每个元素,并将其放入一个虚拟变量中。我在阵列中做了大约1000次,以消除“噪音”,如果我只做一次,就可以得到精确的时间测量值。然后,我寻找导致访问时间大幅增加的大小。不幸的是,这就是我的问题所在,我没有看到使用我的代码的这种跳转,显然我做错了什么 另一件事是,我使用/proc/cpuinfo检查缓存,它说大小是

因此,我在创建一个程序来测量C语言中的缓存大小时遇到了一些困难。我理解进行这项工作的基本概念,但我仍然无法准确地找出我做错了什么

基本上,我创建了一个长度可变的数组(2的幂),访问数组中的每个元素,并将其放入一个虚拟变量中。我在阵列中做了大约1000次,以消除“噪音”,如果我只做一次,就可以得到精确的时间测量值。然后,我寻找导致访问时间大幅增加的大小。不幸的是,这就是我的问题所在,我没有看到使用我的代码的这种跳转,显然我做错了什么

另一件事是,我使用/proc/cpuinfo检查缓存,它说大小是6114,但不是2的幂。有人告诉我用2的幂来计算缓存,有人能解释为什么会这样吗

这是我的代码…如果需要,我会发布其余的

 {
    struct timeval start;
struct timeval end;
int n =1 ; // change this to test different sizes
int array_size = 1048576*n; // size of 1MB
int x = 0;
int i =0, j=0;
int *a;
int sum = 0;
a =malloc((array_size)*sizeof(int));



for(j=0; j < array_size; j ++)
    {

        a[j] = 1; // intialize all elements to 1


    }



gettimeofday(&start,NULL);

for(i=0; i<500; i++)
{
    for(j=0; j < array_size; j ++)
    {

        x += a[j];
    }
}



gettimeofday(&end,NULL);

      sum = x+8192;

int timeTaken = (end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec *1000000 + start.tv_usec);
printf("Time Taken: %d \n", timeTaken);
printf("Average: %f \n", (double)timeTaken/((double)array_size));
{
结构timeval启动;
结构timeval-end;
int n=1;//将其更改为测试不同的大小
int数组_size=1048576*n;//大小为1MB
int x=0;
int i=0,j=0;
int*a;
整数和=0;
a=malloc((数组大小)*sizeof(int));
对于(j=0;j对于(i=0;i即使您可以确保未优化阵列访问,但
gettimeofday
没有足够的时间分辨率来测量缓存访问,尤其是L1(任何最近的商品处理器都有2或3级缓存)

你可以用一个纳秒时钟和大量的统计数据来减少每次测量的误差


另一方面,您可以使用第三方库,如PAPI(性能API),它必须获取信息而不是度量。

请发布您的实际代码(这不可能,因为使用了一个未声明的
x
变量,以及未声明的
start
end
。此代码也不尝试和计算
缓存大小
;它只是遍历数组的每个元素并丢弃读取的值(
x
永远不会在任何地方使用,除非它被赋值为
a[j]
,这意味着
a[j]
只是无缘无故地被读取)。这里也没有任何与“2的幂”相关的内容,并且“1MB大小”的常数是错误的(应该是
1048576
,即“2的幂”)。即使假设“真实”代码是正确的,您也应该检查内存读取没有得到优化。您可以尝试对内存内容求和,并确保对结果进行处理。对不起,我的错误我应该提到我编写的代码只是试图先找到执行时间的跳跃。对此我深表歉意。我更新了请随时检查!谢谢!问题在于时间只是线性增加,没有跳跃。正如Ken指出的那样,您的数组大小有点奇怪。我会从小开始-可能是1k,而不是1M。正如我之前所说的,确保读数没有被优化。我如何确保它不会优化ze out?我尝试求和,但每条指令所用的平均时间不变:S。我将尝试从较低的开始,但我被告知缓存大小将为1MB-16MB,我应该相应地进行malloc