本文转自http://volvet.blogbus.com/logs/8227255.html
C64x Cache Architecture
C64x CPU使用2级的Cache架构+外部内存(external memory),Level 1 Cache 按照功能分为L1 Program Cache和L1 Data Cache。每个L1 Cache的大小为16k Byte,也就是说C64x CPU有16k L1P Cache 和 16k L1D Cache。CPU访问L1Cache可以无需任何延迟。因为L1 Cache的时钟频率是和C64x CPU同样为600 M。Level 2 Memory 其实是C64x 的片内内存(addressable on chip memory),大小为1024k, 可以设置为L2 Cache或 普通内存。L2 Cache主要是对片外内存做Cache,L2 普通内存可以用来做高速访问的内存。L2 Memory的时钟频率是300M。L1D Cache Miss 访问L2 Cache的时钟延迟是8 cycle , 而访问L1D Cache Miss 访问L2 Memory的时钟延迟是 6 cycle。 另外 L2 Cache 是同时作为Program Cache和Data Cache使用的。如果L1和L2 Cache 都Miss, 访问外部内存的速度则是非常慢的,因为C64x 的外部内存时钟是100M-133M,因此要尽量避免CPU访问外部内存,才是有效提高程序性能的关键。
(1) Level 1 Program Cache
L1P Cache 是Direct Mapped Cache, 大小为16k。CPU要从内存读取指令的时候,这些指令是直接被放到L1P Cache中的。L1P Cache是只读的,C64x中,L1P Cache的Line Size 是32byte , C64x 的指令长度一般为4Byte , 这就是表示在L1P Cache 读取指令的时候,其实每次是读取8 条指令。L1P Cache Miss 还会打乱指令流水,如何减少应用程序运行期的L1P Cache Miss, 绝对是DSP 程序设计中的一个重点。
因为L1P Cache 是Direct Mapped Cache, L1P Cache和实际内存的数据映射关系就很重要,理解Direct Mapped Cache,对实际函数的书写非常重要。而且跟函数被链接和转载入的内存地址有关。比方说Loop中有两个被连续调用的函数,如果一个函数的起始位置是0x80000010, 长度为40H, 另一个函数起始地址为0x80004010,长度为40H, 明显函数1被调用后,函数1的所有指令被加载入L1P Cache,但是函数2被调用的时候,因为Conflict Cache Miss, L1P Cache的内容被清掉后加载入函数2的指令,等再回去调用函数1的时候再次遇到Cache Miss, 这个是个Cache 使用最糟糕的例子。因为L1P Cache的Line Size 是32Byte, 因为代码的被使用的单位通常是函数(Function),因此保证每个Function在Memory中的起始地址是32Byte对齐是有效利用L1P Cache的方式。
Direct Mapped Cache是一种最简单的Cache结构,因此这种结构的弊端也是显而易见的,Conflict Cache Miss 会成为比Capacity Cache Miss更严重的存在。因此在L1D Cache,C64x 使用了2Way Set Associative Cache。
(2) Level 1 Data Cache
L1D Cache是2 Way Set Associative Cache,大小为16k。L1D Cache的Line Size 是64 byte,L1D Cache 是2 Way Set Associative Cache的意思就是同一区块 , L1D Cache有两个入口可以访问, 相比Direct Mapped Cache ,L1D 就可以大大减少Conflict Cache Miss发生的机会。同样, L1D Cache Miss 也会打乱指令流水。于L1P Cache还有不同的是L1D Cache是可写的, 这就有可能会涉及到写延迟,下文再仔细讨论。
(3) Level 2 Cache
Level 2 Cache 其实就是C64x 中的On Chip Memory。C64x 的On Chip Memory的大小是1024k Bytes。可以被设置成为L2 Cache 或者 L2 SRAM。L2的Line Size 是128 Bytes,可以是 1,2,3,4 Way Set Associative Cache , 取决于分配的L2 Cache大小。可以是0K, 32K (1-Way), 64K ( 2-Way) , 128K (3-Way) 或者 256K ( 4-Way) 。L2 Cache 最大会使用256K 的L2 SRAM, 这样 L2 SRAM最少还可以有1024 – 256 = 768K可以被程序使用, 如何利用L2 SRAM 应该是程序员煞费苦心的地方。