Tiling前置知识的回忆——Cache,Memory

  分块这一块需要对cache以及Memory相关的知识非常熟悉。这些知识我之前搞得非常清楚,但是现在不太清楚了,所以回忆一下。

  参考:https://www.cnblogs.com/jokerjason/p/10711022.html

 

Cache的最小访问粒度:

  Cache是有最小访问粒度的,那就是cache line

  今天早上在想Loop Nest Reconstructing的问题。在空间局部性的这个问题上,显然,当我们访问数组当中的一个元素时,如果这个元素不在cache中,那么我们就需要把这个元素周围其他的数组元素也都一并调入cache当中。但是当时我犯了一个煞笔的错误:我认为会一次性调入整个cache大小的数据。

  现实显然完全不是这样的。cache和memory之间是有最小访问粒度的,cache的一行当中保存的数据,同一个主存块当中的数据是相同大小的,如下图所示:

  

  目前主流的CPU的cache的cache line的大小都是64Bytes,也就是512位。这个数字是不是很熟悉?是的,一个cache行当中有有效位,标记位Tag,脏位,替换算法位,数据位。数据位大小为512bit。然后主存当中的一个块,会根据cache的相联方式,对应到cache的某一行当中。对应方式如下,简单回忆一下就很容易想起来是怎么回事的。

 

  对于一个32位的系统当中的一个字节(这个字节有着自己的物理地址,假设是0x08048111),如果要访问这个字节,比如在这里,cache line的大小为64Bytes,然后就会需要6位来保存块内字节偏移,剩下的26位才是块号。因此,当这个字节被访问时,其余63字节也一并被调入cache

在linux当中查看关于cache的信息(作为编程的依据)

   查看cache line的大小:

cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size

cache的读写

  这是一个新的问题。来自矩阵转置这个问题,我们不光要对矩阵读,还要对矩阵写。那么这个时候如何平衡cache读写的关系?

  参考(40条消息) 计组之存储系统:8、Cache写策略(全写法、写回法、写分配法、非写分配法、多级Cache)_千寻瀑-CSDN博客

  

  CSapp当中的解释:

  推荐参考CSapp的两道习题:

  第三版6.34和6.35:

 

 

 

 

 

  6.34的答案:

  6.35的答案:

  

 

posted @ 2021-11-28 14:03  TheDa  阅读(193)  评论(0编辑  收藏  举报