OpenEdv-开源电子网

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

STM32做加法运算,数据不一样的时候速度不一样,难道加法不是单周期的吗?

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
发表于 2017-8-29 18:20:29 | 显示全部楼层 |阅读模式
18金钱
本帖最后由 kongqijin 于 2017-8-30 19:58 编辑

我用STM32F746NG的浮点加法器,然后用for循环运行八百个数的单精度加法。  然后把这个循环执行一万次取平均值。平均大概是五千左右。

void LK_ADDr(LK_Data * input, LK_Data * ZeroCenterParameter)
{
        while (Size--)
        {
                *im = *im + *meanParameter;
                im++;
                meanParameter++;
        }        
}

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

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-29 18:23:12 | 显示全部楼层
这个跟FPU有关系吗?是不是精度不一样的时候,FPU用来对齐两个数的时间不一样。fpu算的快的话就有个flag召唤CPU。因为cpu是双发射的,所以计算速度不一样?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-29 18:25:16 | 显示全部楼层
上面提到那个程序,数据一样的时候,平均值是一样的,差零点几,换数据之后可能八百个数据下来就能差了几百个clock cycle了
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-29 18:27:11 | 显示全部楼层
另外我改变size大小的时候,平均每个loop耗时也不一样,
比如这个图,随着size变大,整个函数耗时竟然是二次方上涨的,这很奇怪
未命名图片170829_2.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-29 18:30:38 | 显示全部楼层
我详细研究了一下X前面的系数,这个系数应该跟size的大小有关系。
发现系数跟size的关系是这样的

当size小的时候,比如只加一个数,这个loop耗时是13.

然后随着size加大,每个loop耗时变小,最后稳定在7.这个跟FPU有关系?还是跟数据有关?还是跟arm的分支预测有关?整个跟PID似的
未命名图片170827.png
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-8-29 20:45:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-29 23:57:59 | 显示全部楼层
NULLFF 发表于 2017-8-29 20:45
看看反汇编指令,你这个是浮点的就不好说。我知道整点的数据肯定是单周期的。

您好,汇编显示是这样的

   182:  
0x08002198 BD70      POP           {r4-r6,pc}
    78: {
    79:         int Size = input->Size;
    80:         LK_Accuarcy_Data *im=input->Matrix;
0x0800219A B510      PUSH          {r4,lr}
    81:         LK_Accuarcy_Data *meanParameter=ZeroCenterParameter->Matrix;
    82:  
    83:         while (Size--)
    84:         {
0x0800219C 690A      LDR           r2,[r1,#0x10]
0x0800219E E9D01003  LDRD          r1,r0,[r0,#0x0C]
0x080021A2 E003      B             0x080021AC
    85:                 *im = *im + *meanParameter;
    86:                 im++;
    87:                 meanParameter++;
    88:         }
    89:  
0x080021A4 CA10      LDM           r2!,{r4}
0x080021A6 6803      LDR           r3,[r0,#0x00]
0x080021A8 4423      ADD           r3,r3,r4
0x080021AA C008      STM           r0!,{r3}
0x080021AC 1E49      SUBS          r1,r1,#1
    83:         while (Size--)
    84:         {
    85:                 *im = *im + *meanParameter;
    86:                 im++;
    87:                 meanParameter++;
    88:         }
    89:  
0x080021AE D2F9      BCS           0x080021A4
    90: }
0x080021B0 BD10      POP           {r4,pc}

然后我用int又试了试,还是一样的情况
我是这么获得时间值的:
//--------------------------------DWT REST
uint32_t DWT_Counter;
DWT->CYCCNT = 0;   // sub 6
DWT->CPICNT = 0;   // sub 2
DWT->EXCCNT = 0;          // sub 0
DWT->SLEEPCNT = 0; // sub 0
DWT->LSUCNT = 0;                // sub 0
DWT->FOLDCNT = 0;        // sub 0
//--------------------------------DWT                       
               
                LK_ADDr(&T1, &T2);//H1
//--------------------------------DWT OUTPUT               
DWT_Counter=DWT->CYCCNT;        printf_s("  %d\r\n",DWT_Counter);               
//--------------------------------DWT END               


改变数组大小,从0增加到10000,其中平均loop耗时从8减到4又加到7.  这个数据是我随机生成的0~1024大小的int型,仍然是这种情况。看来是与数据关系不大。难道真是分支预测器在起作用?

170829_3.png
170829_4.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-30 19:57:58 | 显示全部楼层
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-6-7
在线时间
2 小时
 楼主| 发表于 2017-8-30 19:58:18 | 显示全部楼层
是分支预测器的原因嘛
回复

使用道具 举报

头像被屏蔽

12

主题

167

帖子

0

精华

禁止访问

积分
517
金钱
517
注册时间
2017-5-30
在线时间
110 小时
发表于 2017-8-31 09:49:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 07:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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