laogan666 发表于 2018-6-7 13:28:40

cache测试

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

xufeixueren 发表于 2018-6-7 16:14:07

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

xufeixueren 发表于 2018-6-7 16:16:48

你应该把代码拷贝到ITCM里,从ITCM运行代码,试试看

xufeixueren 发表于 2018-6-7 16:21:35

看错题了,以上回答请忽略。。。

eric2013 发表于 2018-6-7 18:39:40

你的算法是否有用到栈空间,你的栈空间是否来自DTCM

laogan666 发表于 2018-6-8 13:36:06

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

eddy0317 发表于 2018-6-11 10:29:39

2,3,4楼你没看错。

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

xufeixueren 发表于 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对执行时间没有影响才对吧?

eddy0317 发表于 2018-6-11 12:45:34

好吧,我也看漏了,没源码不知道哪里的问题。
页: [1]
查看完整版本: cache测试