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

2019-07-20 12:14发布

本帖最后由 kongqijin 于 2017-8-30 19:58 编辑

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

void LK_ADDr(LK_Data * input, LK_Data * ZeroCenterParameter)
{
        while (Size--)
        {
                *im = *im + *meanParameter;
                im++;
                meanParameter++;
        }        
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
kongqijin
1楼-- · 2019-07-20 16:05
 精彩回答 2  元偷偷看……
kongqijin
2楼-- · 2019-07-20 21:49
上面提到那个程序,数据一样的时候,平均值是一样的,差零点几,换数据之后可能八百个数据下来就能差了几百个clock cycle了
kongqijin
3楼-- · 2019-07-21 00:50
 精彩回答 2  元偷偷看……
kongqijin
4楼-- · 2019-07-21 06:40
 精彩回答 2  元偷偷看……
NULLFF
5楼-- · 2019-07-21 09:01
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 ",DWT_Counter);               
//--------------------------------DWT END               


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

kongqijin
6楼-- · 2019-07-21 09:16

一周热门 更多>