TI:使用CLT工具优化C6000代码

摘要
在c6000 dsp的开发过程中,优化是必不可少的一个环节,根据对象不同可以分为系统,算法,代码以及内存优化。通常,开发者熟悉自己的代码,会从前三个方面修改以获得整体性能的提升,但是对于内存尤其是缓存(cache)的优化,因为其涉及到芯片本身的架构,cache的维护由dsp自动完成,用户通常不能干预,所以似乎无从着手;考虑到这些实际的问题,从ti的7.0系列编译器开始支持使用缓存优化工具(cache layout tools)对c6000代码进行优化,通过这一系列的工具,可以很轻松的完成l1p cache性能的提升,本文详细介绍了该工具的使用方法。
1.引言
目前,使用ti dsp的用户越来越多,在c6000系列dsp中,包含了c64x, c64x+, c66x等。在c6000 dsp的开发过程中,为了充分利用dsp的计算资源,需要对用户程序进行优化的工作,根据对象不同可以分为系统,算法,代码以及内存优化。通常,开发者熟悉自己的系统和代码,可以比较方便的从前三个方面修改以获得整体性能的提升,但是对于内存尤其是缓存(cache)的优化,因为其涉及到芯片本身的架构,cache的维护由dsp自动完成,用户通常不能干预,所以似乎无从着手;考虑到这些实际的问题,从ti 的7.0 系列编译器开始支持使用缓存优化工具(cache layout tools)对c6000代码进行优化,通过这一系列的工具,可以很轻松的完成l1p cache性能的提升,本文详细介绍了该工具的使用方法。
2.c6000 dsp内核缓存机制
c6000系统的存储器结构如下图所示。
figure 1.c6000存储器结构
存储器分成三级:第一级是l1,包括数据存储器(l1d)和代码存储器(l1p);第二级是代码和数据共用存储器(l2以及msmc sram);第三级是外部存储器,主要是ddr存储器。l1p、l1d和l2的cache功能分别由相应的l1p 控制器、l1d控制器和l2控制器完成。
在c6000 dsp中通常我们会把l1p全部配置成cache,当cpu发出取指命令,首先会从l1p里查找,如果l1p找不到,则到下一级cache或者memory里查找,当找到需要的地址,则将其读入l1p里,cpu从中读取执行。
因为l1p cache的大小是有限的(本文以32kb为例),而用户内存空间一般大于32kb,必须采取一种映射的方式使得所有地址都能被l1p缓存;在c6000 dsp中,l1p cache使用地址直接映射,所有dsp 核可访问的地址对l1p cache大小(32k)取模就能得到该地址在l1p cache的偏移值。
如果用户代码在内存排布不合理,可能会在l1p cache中发生反复的内容替换,下图中的例子是一个极端情况。
figure 2. 函数的不正确排布
top函数中for循环反复调用a 函数,而a,b,c三个函数在内存地址的分布上,与32kb边界的偏移地址是一样的,因此,a,b,c将对应l1p里同一个cache位置;其运行流程如下
当执行a时,cpu需要把a函数调入到cache偏移值n的位置上;
a调用b,此时调入b到cache偏移值n 的位置上,覆盖a的代码;
b调用c,此时调入c到cache偏移值n 的位置上,覆盖b的代码;
c返回,下一次循环调入a到cache中覆盖c的代码。
dsp核对l1p,l2,ddr的访问速度差异很大,对l1p的访问通常在1 个时钟周期内完成,而l2平均需要3-5个周期,ddr访问需要的时间更多,因此我们应该尽量避免上述这种反复重写cache的情况,尽可能的减少函数在cache中的置换。
如何解决该问题?最好的解决方法则是将a,b,c在内存中连续排放,这样对cache的操作次数将降到最低,能够有效的提高执行效率,如下图所示,只要a,b,c总的大小不超过32kb,它们在cache中的偏移值就是连续的,不会发生覆盖的现象,即使其总和大于32kb,发生置换的也仅仅是超过32k的部分。
figure 3. 函数的正确排布
3.内存优化工具
通过上述机制可以看到,对于l1p cache的优化主要通过分析函数调用关系和其在内存的分布。由于用户代码日益复杂,人工分析代码调用关系和地址排布需要花费大量的时间。因此,从7.0系列编译工具开始,ti提供了一套内存优化工具(cache layout tools)来帮助用户轻松快捷地解决该问题。
该工具的原理是在用户进行程序编译时打开生成分析信息选项,编译器会自动加入分析记录代码到用户程序里,之后用户在ti dsp simulator或者dsp芯片上运行该可执行文件,内置的分析代码会自动记录用户的函数调用关系及调用次数。运行的案例越多,记录的信息会更详细,优化的效果也就越好。
在得到函数运行时信息以后,就可以使用编译器工具对其进行分析,生成函数排布的顺序,最后将此排布顺序输入到编译器里重新编译原代码,生成的可执行文件就已经优化过内存排布,具体的操作可以参照以下实例。
4.实例教程
该实例主要由三个c文件组成,
实例中使用dsp计数器tscl来统计cycle数,子函数放在sub目录下。
使用实例的步骤如下,
1.编译代码
使用ti编译器对该实例进行编译,为了产生用于profile的信息,需要在编译时增加--gen_profile_info选项。如果使用命令还形式,命令行下运行compile.bat文件,cl6x的具体参数可以参考spru186和spru187两篇文档,一般可以在编译器的安装目录下找到他们,如c:\program files(x86)\texas instruments\c6000 code generation tools 7.3.9\doc。
同时在目录下生成obj和asm文件,这个和我们的实验关系不大,可以不用关注。out文件是一会需要下载到芯片里运行的可执行文件,而map文件用于帮助我们定位profile信息存放的内存地址。
如果用户使用ccs编译工具,则需要在build的属性里指定feedback选项,然后正常编译即可生成携带分析代码的可执行文件。
figure 4. ccs初编译的选项

2018智能制造发展现状分析
中国移动公布了2020-2021年非骨架式带状光缆产品集采中标结果
小米10将全球首发骁龙865处理器,支持SA/NSA双模5G
脉搏传感器的原理说明
广州集成电路难向新竹看齐 70亿发展芯片业稍显不足
TI:使用CLT工具优化C6000代码
中国医械高峰论坛引发热议:海外投资寻新机
中国智能终端技术大会召开 万物互联下的AI应用与终端创新
2023年OLED显示器出货预计达50.8万台,增幅323%
原位芯片宣布完成数千万元由红杉中国种子基金领投的A轮融资
推动线性执行器设计的多项因素
什么是3D打印柔性材料?主要用在哪些地方?
印度公布5G发展路线图 华为助力5G大规模部署
如何提升神经网络性能
解析监护仪的检测原理 分享临床知识
NI CompactRIO 控制和采集系统功能特点分析
Altium Designer PCB常用系统快捷键及自定义快捷键
关于MIIX 5的五个小秘密揭秘
低功耗、双仪表放大器INA2141产品介绍
台湾地区面板淡季 突围要看国内脸色