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的答案: