硬汉嵌入式论坛

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

[技术讨论] 无意中发现AC6的memcpy速度比AC5的快了十倍(测试结果有误,只快了1us)

[复制链接]

5

主题

165

回帖

180

积分

初级会员

积分
180
发表于 2023-9-5 11:05:37 | 显示全部楼层 |阅读模式
本帖最后由 DX3906 于 2023-9-5 11:29 编辑

我是在at32f415上用EventRecorder测出来的,AC5的memcpy拷贝8192字节数据,for循环重复十次的时间304.05us,换成AC6之后只需要30.81us!9.8倍的差距!AC5是-o3,AC6是-ofast

刚开始怀疑AC6把EventRecorder的代码优化了导致时间不准,改成了用GPIO高低电平翻转的高电平宽度来测时间,但是结果也差不多

逻辑分析仪测到的结果,AC5 447us,AC6 48us
QQ截图20230905105335.png QQ截图20230905105616.png



这是我的测试代码,实在想不明白AC6是怎么做到如此巨大提升,要真有这么夸张的话,DMA做内存拷贝完全没优势了
[C] 纯文本查看 复制代码
define BUF_SIZE 8192

__ALIGNED(4) uint8_t txbuf[BUF_SIZE] = {0};
__ALIGNED(4) uint8_t rxbuf[BUF_SIZE] = {0};

/**
* @brief Main program
* @param None
* @retval None
*/
int main(void)
{
        nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

        system_clock_config();
        // nvic_configuration();
        dwt_config();
        dma_m2m_init();
        bsp_dbg_uart_config();

        /* 初始化EventRecorder */
        EventRecorderInitialize(EventRecordAll, 1);
        EventRecorderStart();

        while(1)
        {
                dwt_delay_ms(1);
                for(uint32_t i = 0; i < BUF_SIZE; i++)
                {
                        txbuf[i] = rand();
                }
                EventStartA(2);
                GPIOB->scr = GPIO_PINS_0;
                for(uint32_t i = 0; i < 10; i++)
                {
                        memcpy((uint32_t*)rxbuf, (uint32_t*)txbuf, BUF_SIZE);
                }
                GPIOB->clr = GPIO_PINS_0;
                EventStopA(2);
                dwt_delay_ms(1);
        }
}






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106723
QQ
发表于 2023-9-5 11:09:37 | 显示全部楼层
AC6的测试应该有问题,部分代码被优化了,有可能for循环仅执行了1次,因为每次都是同一个memcpy。另外MDK5的时间优化是不是没开。
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2023-9-5 11:24:28 | 显示全部楼层
eric2013 发表于 2023-9-5 11:09
AC6的测试应该有问题,部分代码被优化了,有可能for循环仅执行了1次,因为每次都是同一个memcpy。另外MDK5 ...

尴尬,确实是AC6下只执行了一次memcpy就跳出循环了,实际上只比AC5快了1us左右
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2023-9-5 11:29:27 | 显示全部楼层
测试结果有误,AC6优化太激进,导致10次相同操作的for循环被优化成单次操作,也就是说30us只是单次memcpy的时间,把AC5测试也改成测单次memcpy之后,时间就差不多了,31us
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106723
QQ
发表于 2023-9-5 11:32:44 | 显示全部楼层
DX3906 发表于 2023-9-5 11:24
尴尬,确实是AC6下只执行了一次memcpy就跳出循环了,实际上只比AC5快了1us左右

AC6的优化确实比较狠,我好几次测速都入坑了。
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2023-9-5 13:35:11 来自手机 | 显示全部楼层
做拷贝永远是cpu最快,这个是总线结构资源倾斜的结果。dma只有异步释放吞吐的意义,并不会改善拷贝性能。
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2023-9-5 14:22:12 | 显示全部楼层
alexyzhov 发表于 2023-9-5 13:35
做拷贝永远是cpu最快,这个是总线结构资源倾斜的结果。dma只有异步释放吞吐的意义,并不会改善拷贝性能。

我记得以前在at32f415上测过,dma拷贝8192字节比C库的memcpy快了大概16%的样子,有提升但也不多,可能各家芯片的总线结构略有区别,不过如果用汇编去优化memcpy估计就没有16%的差距了

dma确实非常适合拿来做异步传输
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-9-5 14:22:16 | 显示全部楼层
有理论瓶颈在那里,编译器怎么也突破不了。
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2023-9-6 08:51:19 | 显示全部楼层
emwin 发表于 2023-9-5 14:22
有理论瓶颈在那里,编译器怎么也突破不了。

确实,毕竟编译器也不是什么超级神器&#129315;
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-9-7 11:17:05 | 显示全部楼层
至于DMA与CPU谁快,以前通常是CPU最快,现在得分情况了:
矩阵架构的总线,抢占带宽就不太适用了,同等频率下,应该是DMA更快(DMA运行逻辑简单)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106723
QQ
发表于 2023-9-7 11:34:42 | 显示全部楼层
emwin 发表于 2023-9-7 11:17
至于DMA与CPU谁快,以前通常是CPU最快,现在得分情况了:
矩阵架构的总线,抢占带宽就不太适用了,同等频 ...

是的,通用的DMA不行,MDMA,DMA2D可以。

【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等操作是否合理,多个DMA数据流同时刷是否处理过来
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109765
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-9-7 14:43:37 | 显示全部楼层
eric2013 发表于 2023-9-7 11:34
是的,通用的DMA不行,MDMA,DMA2D可以。

【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等 ...

看了数据,有没有统一测试条件?要在相同的时钟频率下测。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 08:56 , Processed in 0.296013 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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