OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4665|回复: 6

cache、dtcm、程序速度问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-3-3
在线时间
4 小时
发表于 2018-3-3 19:09:29 | 显示全部楼层 |阅读模式
1金钱
今天用原子的767板子测试了一下运行速度,不太如意,跟写的462DMIPS还是有比较大差距。请各位大神解惑:测试中,做了一个约30万次的循环,汇编中共使用了27个指令(已包含循环本身的指令);总的耗时34ms左右,这算出来的大概只有56%(462DMIPS)左右的性能。分析和疑问如下:
27个指令中,有7个LDR加载指令,可能是加载内存数据时间较长拖慢计算时间,于是做了以下测试:
测试1.对比cache开和不开的差别,发现没差别(就算把指令改成从固定内存中拿出来计算,开和不开还是没差别)
测试2.对比片内SRAM和SDRAM差别,片内SRAM只有3%的性能优势。
测试3.对比片内SRAM和DTCM(程序有所修改,因为DTCM只有128KB),结果是基本没差别。


问题:(上面说没啥差别指的是差别在1%以内)
1.测试1为啥没差别?
2.测试2差别偏少啊。
3.测试3为啥没差别?手册上宣传Cache,TCM的加入,使得f7有明显的性能提升,但用跟不用一个样。
4.从汇编来看,使用了已经是最简单的“加、减、比较、跳转”,乘、除都没有,更没有浮点运算,为啥只能达到462DMIPS的56%这么少?


以下贴出具体的时间:
0x08005A92 E022      B             0x08005ADA
   155:                         for(j=1;j<640;j++)
   156:                         {
0x08005A94 2601      MOVS          r6,#0x01
0x08005A96 E01C      B             0x08005AD2
   157:                                 pt=&image[0];   //1.5ms
0x08005A98 4C66      LDR           r4,[pc,#408]  ; @0x08005C34
   158:                                 pt+=i*640+j-640; //7ms
   159:
0x08005A9A EB050085  ADD           r0,r5,r5,LSL #2
0x08005A9E EB0610C0  ADD           r0,r6,r0,LSL #7
0x08005AA2 F5A07020  SUB           r0,r0,#0x280
0x08005AA6 4404      ADD           r4,r4,r0
   160:                                 k=*(pt-1) + *pt * 2+ *(pt+1);  //11ms
   161:                                 
0x08005AA8 F8141C01  LDRB          r1,[r4,#-0x01]
0x08005AAC 7820      LDRB          r0,[r4,#0x00]
0x08005AAE EB010040  ADD           r0,r1,r0,LSL #1
0x08005AB2 7861      LDRB          r1,[r4,#0x01]
0x08005AB4 1847      ADDS          r7,r0,r1
   162:                                 pt+=1280;
0x08005AB6 F50464A0  ADD           r4,r4,#0x500
   163:                                 f=*(pt-1) + *pt * 2  + *(pt+1); //11ms
   164:                                 
   165:                                 
0x08005ABA F8141C01  LDRB          r1,[r4,#-0x01]
0x08005ABE 7820      LDRB          r0,[r4,#0x00]
0x08005AC0 EB010040  ADD           r0,r1,r0,LSL #1
0x08005AC4 7861      LDRB          r1,[r4,#0x01]
0x08005AC6 EB000A01  ADD           r10,r0,r1
   166:                                 k+=f-k;    //1.5ms
   167:                                 

   188:                         }
   189:                 }
0x08005ACA EBAA0007  SUB           r0,r10,r7
0x08005ACE 4407      ADD           r7,r7,r0
0x08005AD0 1C76      ADDS          r6,r6,#1
0x08005AD2 F5B67F20  CMP           r6,#0x280
0x08005AD6 DBDF      BLT           0x08005A98
   153:                 for(i=1;i<480-1;i++)
0x08005AD8 1C6D      ADDS          r5,r5,#1
0x08005ADA F5B57FEF  CMP           r5,#0x1DE
0x08005ADE DDD9      BLE           0x08005A94






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-3-3
在线时间
4 小时
 楼主| 发表于 2018-3-4 10:28:47 | 显示全部楼层
自己顶上去,原子哥在哪里?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-3-3
在线时间
4 小时
 楼主| 发表于 2018-3-4 10:31:59 | 显示全部楼层
测试代码是从例程的dsp中修改的,具体见附件。

实验52_1 DSP BasicMath测试.rar

2.54 MB, 下载次数: 48

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-5 01:34:58 | 显示全部楼层
内部内存比SDRAM要快非常多的。3%的优势是肯定不对的。 你再重新写代码测试下。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-3-3
在线时间
4 小时
 楼主| 发表于 2018-3-5 15:55:15 | 显示全部楼层
正点原子 发表于 2018-3-5 01:34
内部内存比SDRAM要快非常多的。3%的优势是肯定不对的。 你再重新写代码测试下。

暂时没看出我的测试方案有什么问题,都是很简单的方法,就是不停循环计算,把数组的位置定义在DTCM、片内普通内存、和SDRAM来做对比。我今晚回去再看看代码,不过原子哥能做个简单的demo就更好了,体现一下M7的牛逼。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-3-3
在线时间
4 小时
 楼主| 发表于 2018-3-5 21:19:17 | 显示全部楼层
正点原子 发表于 2018-3-5 01:34
内部内存比SDRAM要快非常多的。3%的优势是肯定不对的。 你再重新写代码测试下。

http://www.stmcu.org/module/forum/thread-614962-1-1.html
我在另外的网站问过,9楼给出的数据,貌似也说明差距不明显。唯有把代码放在sdram的时候是特别慢。代码放在flash,sram中差别不大。还有数据放在sdram,sram,dtcm也差别不大。不知道是不是特定场景应用才会体现出差距。还有cache的性能差距,也还没测试出来。
原子哥,你的内部内存比sdram快这个结论是怎样测出来的?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-6 00:20:38 | 显示全部楼层
zhxih206662 发表于 2018-3-5 21:19
http://www.stmcu.org/module/forum/thread-614962-1-1.html
我在另外的网站问过,9楼给出的数据,貌似 ...

你可以试试:
定义一个u32的数组,比如100个大小,然后对数组里面的每个成员都进行自增,从0开始,一直增到很大的一个数,比如10000000。
统计这个自增所需要的时间。

然后,对比:
1,数组定义在内部sram的时候,自增要多久?
2,数组定义在SDRAM的时候,自增要多久?

差距肯定不止3%
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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