cache测试
今天测试cache性能时,发现一个问题:笔者将测试代码放片外FLASH中,程序变量通过分散加载文件放在DTCM中,测试时打开I-cache、D-cache算法跑14秒,当打开I-cache、关闭D-cache时算法跑109秒,按道理来说,内核直接访问DTCM实现变量读写操作,关闭D-cache应该对性能无影响,可以测试结果影响还不小。求大神们解答,谢谢。
对代码运行机制理解错了吧,我的理解是:代码放在片外flash里,程序分散加载文件只是把变量放在DTCM里读写,但是CPU仍然是从flash里读取指令执行的,也就是说CPU从外部flash里读取了读写变量操作的指令,然后CPU再去DTCM里改变变量的值。CPU从flash里执行代码效率低,开了I-cache后,指令有了缓存,CPU渎指令时间短了,没开读指令时间明显加长。 你应该把代码拷贝到ITCM里,从ITCM运行代码,试试看 看错题了,以上回答请忽略。。。 你的算法是否有用到栈空间,你的栈空间是否来自DTCM eric2013 发表于 2018-6-7 18:39
你的算法是否有用到栈空间,你的栈空间是否来自DTCM
voidspeed_test(void)
{
uint32_ti = 0 , j = 0;
AudioInData = 0;
for(i=0;i<30000;i++)
{
for(j=0;j<30000;j++)
{
AudioInData += 0xA5A5;
}
}
}
所谓算法其实就是两个for循环计算累加和,AudioInData的地址为AudioInData 0x20000000 Data 2hello_world.o(.data)
通过分散加载,系统所有变量都在DTCM中,堆栈详细如下:
Execution Region ARM_LIB_HEAP (Exec base: 0x20000040, Load base: 0x60004004, Size: 0x00000400, Max: 0x00000400, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000040 - 0x00000400 Zero RW 1 ARM_LIB_HEAP.bss anon$$obj.o
Execution Region ARM_LIB_STACK (Exec base: 0x2000fc00, Load base: 0x60004004, Size: 0x00000400, Max: 0x00000400, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x2000fc00 - 0x00000400 Zero RW 2 ARM_LIB_STACK.bss anon$$obj.o 2,3,4楼你没看错。
笔者将测试代码放片外FLASH中====楼主这句话就看出问题在哪里了,除了变量,执行代码也必须放到TCM里面。因为CPU是根据代码指令来执行内容,光变量放在DTCM没用。CPU要先从FLASH里面读取代码(注意,这是没执行一条指令都要从FLASH里面读取,不开cache的话),才知道要操作变量的。 eddy0317 发表于 2018-6-11 10:29
2,3,4楼你没看错。
笔者将测试代码放片外FLASH中====楼主这句话就看出问题在哪里了,除了变量,执行代码 ...
CPU读指令用的是I-Cache,楼主说的是关闭D-Cache,I-Cache还是开着的呢,关闭D-Cache对执行时间没有影响才对吧? 好吧,我也看漏了,没源码不知道哪里的问题。
页:
[1]