DSP 缓存机制

DSP 缓存机制

1.Cache基础

一般来说我们的代码往往是存放在我们的磁盘设备中(EMMC、SSD、Flash等),当我们运行程序的时候,我们需要将代码加载到我们的内存(DDR)中去运行,之后CPU再从内存中加载代码执行,但是相比较而言计算机CPU的运行速率与我们的DDR内存的运行速率,二者有着近百倍的速度差异,所以当我们实际运行一段代码的时候,CPU试图从内存中读取或写入一段数据的时候,往往会因为二者的速度差异而白白去等待造成性能上的浪费,所以为了解决这个问题,我们设计了缓存机制,即在CPU和内存之间增加一个速度极快但是容量极小的设备,我们称这段存储为Cache,CPU会首先从cache中查找对应地址的数据是否缓存在cache 中。如果其数据缓存在cache中,直接从cache中拿到数据并返回给CPU。

1.2 Cache line

我们在看一个芯片的属性的时候,往往会看到一条cache size,这个代表了我们的缓存的大小也表示缓存的数据容量,而cache line表示的就是缓存行,它的大小称为cache line size。cache line是操作cache的最小单位,这句话如何理解呢,假设我们的cache line是32字节,我们需要读取的数据的大小为4字节,当我们缓存这段数据的时候,cache不会只单单缓存4字节,而是一次缓存32字节(一行的数据量),这就好比缓存是一块蛋糕8斤,我们平均切了8刀,这每一块一斤就相当于一个缓存行,你想吃一小块二两,不可以,吃二两也给你一斤。所以cache每一次操作数据的最小单位名就是一个cache line size。

1.3.2 组相连缓存( Set-Associative Caches)

理解组相连缓存,我们需先要了解什么是路(Way),我们将cache平均分成多份,每一份就是一路。因此,两路组相连缓存就是将cache平均分成2份,四路组相连缓存就是将cache平均分成4份。在DSP C66X中,L1D cache 是两路组相连缓存,L2 cache是四路组相连缓存。

1.4 Cache更新策略(Cache update policy)

当我们的Cache在命中的时候,会涉及到cache的更新策略(当然命中也分读命中和写命中,读操作不涉及缓存更新,也就不存在什么更新策略),Cache的更新策略分为写直通和写回。

1.4.1 写直通(write through)

当CPU要写一个数据的时候并在Cache命中时,我们会更新cache中的数据并更新内存中的数据,这样cache和内存中的数据会始终保持一致,不会存在脏位。

1.4.2 写回(write back)

当CPU要写一个数据的时候并在Cache命中时,我们只会更新cache中的数据,除非我们cache line被替换或者说我们进行缓存同步操作,不然内存的数据不会更新,同时当我们更新cache中的数据时,我们还会将当前的cache line标记为“脏”,即 dirty bit 置一,表示当前缓存行内容更新过。在cache执行写回策略时,可能存在cache和内存不同的情况。所以我们需要注意缓存一致性的问题。

1.5 Cache分配策略(Cache allocation policy)

当CPU在访问cache时发生了缺失时,cache会依据当前缓存的分配策略来进行数据的缓存操作,一般分为读分配和写分配。

1.5.1 读分配(read allocation)

当我们的缓存支持读分配时,在发生cache缺失的时候,缓存会分配一个缓存行(cache line)来缓存源于下一次存储设备的数据。

1.5.2 写分配(write allocation)

当我们的缓存支持写分配时,我们首先从主存中加载数据到cache line中(相当于先做个读分配动作),然后会更新cache line中的数据。当是当我们不支持写分配时,写指令只会更新内存的数据。

2 一级程序内存和缓存

2.1. 一级程序(L1P)内存和缓存的用途

1级程序(L1P)存储器和缓存的目的是使代码执行的性能最大化。 L1P缓存的可配置性提供了许多系统所需的灵活性。L1P高速缓存对于促进以快速时钟速率获取程序代码是必要的,以便维持较大的系统内存。 高速缓存负责隐藏与读取和写入较慢的系统内存相关的延迟。

2.1.1 功能

L1P内存和缓存提供了使用C66x CorePac的设备所需的内存灵活性。可以将部分或全部L1P转换为缓存。 L1P支持4K,8K,16K和32K的缓存大小。L1P高速缓存通过从L1P内存映射的顶部开始向下进行工作,将内存从RAM转换为高速缓存。 解释一下,L1P存储器的最高地址首先成为高速缓存。

? 当配置为告诉缓存时,L2内存是具有32字节高速缓存线的直接映射高速缓存
? 可完全配置为高速缓存或SRAM
? L2 存储器控制器具有纠错码(ECC)和 ED 机制
? 不支持错误校正或检测
? L2内存的页大小为2K

2.1.2 L1P缓存架构

L1P高速缓存是直接映射的高速缓存,这意味着系统中的每个物理内存位置在其可能驻留的高速缓存中都有一个可能的位置。 当DSP尝试获取一段代码时,L1P必须检查所请求的地址是否位于L1P高速缓存中。 为此,将DSP提供的32位地址划分为三个字段(tag, set, and offset),如下图所示。

2.3 总结

c66x的一级缓存分为一个可分配的32K的L1D cache和一个可分配的32K的L1P cache,其中L1P是一个直接映射缓存,支持读分配无写分配,Line size的大小为32字节;L1D是一个两路组相干缓存,支持读分配和写回操作,Line size的大小为64字节。

3 二级程序内存和缓存

3.1 二级程序(L2)内存和缓存的用途

L2存储器控制器在较快的1级存储器(L1D,L1P)和较慢的外部存储器之间提供了片上存储器解决方案。 其优点在于,它支持比L1存储器更大的存储器大小,同时提供比外部存储器更快的访问速度。与L1存储器类似,您可以将L2配置为同时提供缓存和非缓存(即可寻址)存储器。

3.2 特征

L2内存和缓存提供以下功能:
? 当配置为告诉缓存时,L2内存是具有128字节高速缓存线的4路组关联高速缓存
? 只有256KB的 L2 内存可以配置为cache或SRAM
? L2 存储器的32KB总是映射为SRAM
? L2 存储器控制器具有纠错码(ECC)和 ED 机制
? L2内存控制器支持硬件预取,还提供带宽管理、内存保护和掉电功能
? L2内存的页大小为16K

4 cache相关寄存器

4.1 L1P相关寄存器

AM 5728关于DSP C66x核心相关的控制寄存器分为3组,每一组寄存器控制一种类型的cache,其中L1P cache相关的寄存器如下:

L1P缓存控制寄存器 (L1PCC)

L1PCC缓存控制寄存器(L1PCC)控制L1P是冻结还是未冻结。

L1P无效字数寄存器(L1PIWC)

L1P无效字计数寄存器(L1PIWC)定义了相干运算将要作用于的块无效的大小。 大小以32位字定义。

4.2 L1D相关寄存器

L1D cache支持写回操作,所以L1D包含的寄存器会多几组,具体如下:

L1D写回寄存器(L1DWB)

L1D写回基地址寄存器(L1DWBAR)

L1D回写基地址寄存器(L1DWBAR)定义了将回写的块的基地址。

4.3 L2相关寄存器

L2寄存器组与L1D相似,具体如下:

4.4 MARn寄存器组

4.1~4.3介绍的寄存器均为设置cache本身的寄存器,但是若要使我们的内存能够真正缓存到cache中,除了需要设置我们的cache以外,还需配置我们需要缓存的内存段的可缓存性,只有当我们将内存段的可缓存性设置为缓存使能,我们这块内存中存储的内容才会被缓存至cache,MAR寄存器组就是完成内存段的属性设置。

5.缓存的使用

在DSP复位的时候,默认会以最大缓存量使能L1 cache,L2cache则全部设置为SRAM,但这样我们内存中的内容实际上是不会缓存到cache中的,我们设置cache需要作出以下的几个步骤,由于c66x DSP支持CSL库,所以我们只需调用相应的API即可,无需直接设置寄存器:

1.初始化L1P,用户可按需求设置为4K 、8K 、16K 、32K

? (API:static inline void CACHE_setL1PSize (CACHE_L1Size newSize).

2.初始化L1D,用户可按需求设置为4K 、8K 、16K 、32K

? (API:static inline void CACHE_setL1DSize (CACHE_L1Size newSize))

3.初始化L2,用户可按需求设置为32K 、64K 、128K 、256K、512K、1024K、

? (API:static inline void CACHE_setL2Size (CACHE_L1Size newSize))

4.设置内存段的可缓存属性

? (API:static inline void CACHE_enableCaching (Uint8 mar))

5.使缓存失效,并等待缓存失效操作完成

6.测试

我们在内存(DDR)中设置一个4KB大小的数组,我们对该数组进行读写来模拟4K的数据量交互,通过对比读写相同4K数据量的所耗时间来比较 cache对于性能的影响:

通过使用CCS 我们可以知道代码运行的所消耗的时钟周期,所以我们只需对比测试代码中两个for循环的耗时即可得出4K数据读写的总耗时。
注意:本测试进行与DSP c66x 裸机环境

6.1 测试一: 开启cache;

6.3 4K数据量的完整测试结果 DSP 缓存机制

总结:我们可以看出cache对于内存的读写会存在较大的影响,读写相同的数据量,使用缓存的耗时远远小于不使用缓存的,cache对性能的提升有较大作用。

参考资料:
《sprugy8 – TMS320C66x DSP Cache User Guide》
《高速缓存与一致性专栏 – 知乎》

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月16日
下一篇 2021年1月16日

相关推荐