我刚开始使用处理器,无法理解以下内容。
假设我们有一个声明为
的数组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 :(得分:0)
确切的答案是特定于平台的,但一般来说,有三件事会导致外部存储器中的数据被加载到处理器缓存中。
最明显的是以普通方式访问内存的实际指令。如果该内存地址不驻留在处理器高速缓存中,则处理器必须获取它。第二种方式是推测性预取。如果某些处理器认为代码可能会访问它,则会将内存获取到缓存中。最后,编译器实际上可以发出指令将事物放入缓存中。
你所有的操作都在指针上,所以他们将加载所有操作,除了这一个:double t=*(a+i*3);
。这实际上取消引用指针并访问其值。因此,除非编译器足够智能以优化访问(因为你从不使用结果),这可能是代码的唯一部分,这将导致除了指针从主内存读入缓存之外的其他内容。 (假设它到达主内存,这取决于你的缓存大小。)