cache blocking
miss rate 概念
miss 次数例子
每个缓存块能够一次性加载一整行的8个元素,而每行有n个元素,那么在初始加载时,每行都会有 n/8次不命中。这是因为每次加载一个缓存块,都可以覆盖一整行的8个元素,而每行有n个元素,所以需要 n/8 次加载来处理整行。
如果每次加载一个缓存块,都能够容纳整行的8个元素,那么每行在处理过程中会有 n/8 次不命中。
对于每列会有n次不命中。3个for, 所以是 (n/8 + n) * n^2。
miss 次数使用分块技术的例子
缓存块的大小是8个双精度数,而缓存的总大小 C 远远小于数据集的大小 n。假设每个块的大小为 B^ 2 。由于三个块可以容纳在缓存中(即 3B^2 < C ,第一轮迭代时的不命中次数。
在每个块的第一次加载时,由于缓存块大小是8个双精度数,每次加载一个缓存块,实际上只加载了 8 个元素,即 (B^ 2)/8 个双精度数。因此,每个块的第一次加载会导致 (B^2)/8 次不命中,因为整个块的数据并未完全装入缓存。
缓存里的cache block 数量是 (B^2)/8。
由于每个块有(B^2)/8次不命中次数, 对于步长为B的情况,实际的miss次数是 (B ^2)/8 * (n/B), 因为是2个矩阵,所以需要再乘2。
miss 总数是 (nB )/4 * (n/B) ^2 。
miss 次数总结
缓存更新
缓存的更新通常是以缓存块为单位进行的,而不是以单个元素为单位。当程序访问内存时,它将一个块的数据加载到缓存中,这称为缓存行(cache line)。缓存行是缓存的基本单位,通常包含多个字节或数据项。
当某个数据被请求并加载到缓存时,可能会带入其周围的数据,即将整个缓存行加载到缓存中。这是因为在程序中,通常存在着局部性原理,即相邻的数据项很可能也会被近期使用。
如果在缓存中的某个块的数据被修改,通常整个缓存块会被标记为“脏”(dirty)。当这个缓存块被替换出缓存时,它的内容会被写回到主内存。因此,缓存的更新是以缓存块为单位的,而不是单个元素。
需要注意的是,具体的缓存行大小和更新策略可能因计算机架构而异。不同的处理器和架构可能有不同的缓存行大小和写回策略。