指针和缓存利用率

时间:2014-05-10 19:23:04

标签: c++ c pointers caching processor

我刚开始使用处理器,无法理解以下内容。

假设我们有一个声明为

的数组
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);
     }
}

在这种情况下,加载到缓存中的内容 - 指针指向的实际值还是仅指向地址?如果地址 - 是否意味着将有另一个周期来加载实际值?对于这个循环来说,它对于缓存利用是否全部有用?

1 个答案:

答案 0 :(得分:0)

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

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

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