2014-05-10 34 views
0

我刚开始使用处理器,无法理解以下内容。指针和缓存利用率

Asume,我们有一个数组声明

static double x[1000][3] 

,我们在功能

double up (double *a, int i) 
{ 
    double t=*(a+i*3); 
    return t; 
} 

int main(int argc, char *argv[]) 
{ 
    static double x[1000][3]; 
    //some manipulations// 
    double b; 
    for (int i=0;i<10;i++) 
    { 
     b=up(&x[0][0],i); 
    } 
} 

访问在这种情况下,什么被加载到高速缓存存储器 - 一个指针指向实际值到或仅有地址?如果地址 - 是否意味着会有另一个周期来加载实际值?对于这个循环来说,缓存利用率总体来说是否合适?

+0

对不起,具体的问题或观察你有。否则,这个问题是OT为'太广泛'! –

+0

发布的代码很可能不会编译,如果是这样,它将不会运行,因为它使用8MB的堆栈,这很可能会溢出堆栈... –

+0

问题不在于编译,而只是一个例。我需要知道指针如何工作在缓存中 – user3624070

回答

0

确切的答案是平台特定的,但一般来说,有三件事导致外部存储器中的数据被加载到处理器缓存中。

最明显的是以普通方式访问内存的实际指令。如果该内存地址不驻留在处理器缓存中,则处理器将不得不获取它。第二种方法是推测性预取。如果某些处理器相信代码可以访问它,则某些处理器将获取内存到缓存中最后,编译器实际上可以发出指令将事物放入缓存中。

你所有的操作都在指针上,所以这些都是他们会加载的,除了这一个:double t=*(a+i*3);。这实际上取消引用一个指针并访问它的值。因此,除非编译器足够聪明才能优化访问权限(因为您从不使用结果),这很可能是您的代码的唯一部分,它会导致指针从主内存读入缓存中。 (假设它已经到达主内存,这取决于你的缓存大小。)

+0

如果编译器足够聪明以优化解除引用,那么也可以非常聪明地将整个程序替换为空,因为该程序在功能上不起作用。 – codetaku