Caching 缓存大小和数组大小如何影响数组上数学运算的性能?

Caching 缓存大小和数组大小如何影响数组上数学运算的性能?,caching,processor,Caching,Processor,我正在努力学习缓存的用法。从我做的一些样本实验程序来看,如果我将数组大小增加到超过某个特定值,则执行程序遍历数组并对元素执行某些操作所需的时间会突然大幅增加。有人能简单地解释缓存大小和数组大小如何影响数组上数学运算的性能吗 如果缓存无法累积数组,则对这些未累积元素的任何引用都将导致缓存未命中。访问数组元素的方式也会有所不同,因为在每次未命中时,处理器都会将数据块带到缓存中,并认为可能很快就会需要这些数据,从而为避免将来的缓存未命中做好准备 例如: 如果您在连续位置对元件进行操作,性能将得到提高。

我正在努力学习缓存的用法。从我做的一些样本实验程序来看,如果我将数组大小增加到超过某个特定值,则执行程序遍历数组并对元素执行某些操作所需的时间会突然大幅增加。有人能简单地解释缓存大小和数组大小如何影响数组上数学运算的性能吗

如果缓存无法累积数组,则对这些未累积元素的任何引用都将导致缓存未命中。访问数组元素的方式也会有所不同,因为在每次未命中时,处理器都会将数据块带到缓存中,并认为可能很快就会需要这些数据,从而为避免将来的缓存未命中做好准备

例如:

如果您在连续位置对元件进行操作,性能将得到提高。因为根据缓存线的大小,处理器将在第一次缓存未命中时获取内存块

例如,以矩阵乘法为例,我们按照以下方式进行

假设:矩阵太大,无法在缓存中累积

 for (i = 0; i < N; i = i + 1)
      for (j = 0; j < N; j = j + 1)
          A[i*N + j] = (double) random() / SOME_NUMBER;     

 for (i = 0; i < N; i = i + 1)
   for (j = 0; j < N; j = j + 1)
       B[i*N + j] = (double) random() / SOME_NUMBER;


 for (i = 0; i < N; i = i + 1)
    for (j = 0; j < N; j = j + 1)
       for (k = 0; k < N; k = k + 1)
           C[i*N + j] = C[i*N + j] + A[i*N + k]*B[k*N + j];
您还必须按以下顺序访问转置数组:

  C[i*N + j] = C[i*N + j] + A[i*N + k]*B[j*N + k];

这取决于你在做什么样的数学运算。你能说得更具体一点吗?谢谢你的回答。但我的问题是,当达到缓存大小时,为什么执行时间会突然增加?因为在这之后,任何未缓存的元素引用都是缓存未命中。然后,处理器将进入L2,然后是L3(若有多级缓存),或者最后进入主内存。与访问缓存相比,内存访问非常耗时(CPU周期数)。但每次未命中缓存都会发生这种情况,对吗。因此,性能取决于是否使用已加载到缓存的数据。它不应该取决于缓存是否已满。那么为什么缓存未命中取决于缓存大小?缓存未命中是指元素不在缓存中时。由于以下原因,元素将不在缓存中-缓存已满,由于数据组织和缓存线大小不佳,元素未预取,缺少时间和空间位置。我有一个数组,并且在该数组上执行了一些操作。我有一个大小为1MB的单级缓存,缓存线大小为32字节。然后,每次请求当前不在缓存中的数组元素时,都会将32个字节加载到缓存中。当缓存已满时,也会发生同样的情况,唯一的区别是需要覆盖缓存线。因此,缓存未命中计数将仅取决于此32字节(即缓存线大小)。我仍然没有得到缓存大小所扮演的角色。
  C[i*N + j] = C[i*N + j] + A[i*N + k]*B[j*N + k];