硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2644|回复: 8
收起左侧

[Cache] cache测试

[复制链接]

6

主题

14

回帖

32

积分

新手上路

积分
32
发表于 2018-6-7 13:28:40 | 显示全部楼层 |阅读模式
今天测试cache性能时,发现一个问题:
笔者将测试代码放片外FLASH中,程序变量通过分散加载文件放在DTCM中,测试时打开I-cache、D-cache算法跑14秒,当打开I-cache、关闭D-cache时算法跑109秒,按道理来说,内核直接访问DTCM实现变量读写操作,关闭D-cache应该对性能无影响,可以测试结果影响还不小。求大神们解答,谢谢。
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
发表于 2018-6-7 16:14:07 | 显示全部楼层
对代码运行机制理解错了吧,我的理解是:代码放在片外flash里,程序分散加载文件只是把变量放在DTCM里读写,但是CPU仍然是从flash里读取指令执行的,也就是说CPU从外部flash里读取了读写变量操作的指令,然后CPU再去DTCM里改变变量的值。CPU从flash里执行代码效率低,开了I-cache后,指令有了缓存,CPU渎指令时间短了,没开读指令时间明显加长。
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
发表于 2018-6-7 16:16:48 | 显示全部楼层
你应该把代码拷贝到ITCM里,从ITCM运行代码,试试看
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
发表于 2018-6-7 16:21:35 | 显示全部楼层
看错题了,以上回答请忽略。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107379
QQ
发表于 2018-6-7 18:39:40 | 显示全部楼层
你的算法是否有用到栈空间,你的栈空间是否来自DTCM
回复

使用道具 举报

6

主题

14

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2018-6-8 13:36:06 | 显示全部楼层
eric2013 发表于 2018-6-7 18:39
你的算法是否有用到栈空间,你的栈空间是否来自DTCM

void  speed_test(void)
{
                uint32_t  i = 0 , j = 0;
       
                AudioInData = 0;
       
                for(i=0;i<30000;i++)
                {
                                for(j=0;j<30000;j++)
                                {
                                                AudioInData += 0xA5A5;
                                }
                }
}

所谓算法其实就是两个for循环计算累加和,AudioInData的地址为AudioInData                              0x20000000   Data           2  hello_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
回复

使用道具 举报

7

主题

102

回帖

123

积分

初级会员

积分
123
发表于 2018-6-11 10:29:39 | 显示全部楼层
2,3,4楼你没看错。

笔者将测试代码放片外FLASH中====楼主这句话就看出问题在哪里了,除了变量,执行代码也必须放到TCM里面。因为CPU是根据代码指令来执行内容,光变量放在DTCM没用。CPU要先从FLASH里面读取代码(注意,这是没执行一条指令都要从FLASH里面读取,不开cache的话),才知道要操作变量的。
回复

使用道具 举报

8

主题

26

回帖

243

积分

高级会员

积分
243
发表于 2018-6-11 11:10:46 | 显示全部楼层
eddy0317 发表于 2018-6-11 10:29
2,3,4楼你没看错。

笔者将测试代码放片外FLASH中====楼主这句话就看出问题在哪里了,除了变量,执行代码 ...

CPU读指令用的是I-Cache,楼主说的是关闭D-Cache,I-Cache还是开着的呢,关闭D-Cache对执行时间没有影响才对吧?
回复

使用道具 举报

7

主题

102

回帖

123

积分

初级会员

积分
123
发表于 2018-6-11 12:45:34 | 显示全部楼层
好吧,我也看漏了,没源码不知道哪里的问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-29 01:57 , Processed in 0.174010 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表