背景
公司使用的两个评估板平台,RK3288与RK3399,CPU计算性能单核提升72%,多核提升29%(参见这个链接)。但是针对一款多人音视频引用,尽管使用了硬件编解码,但实际CPU占用,原来是90%,更换到新平台是40%+。经过分析,RK3288平台的内存拷贝环节占据CPU时间较多。内存子系统性能应当对于整体性能和体验具有重要影响,但这一环节之前被我们忽略了。
测试
为了验证内存性能的差异,这里进行了几个测试。
dd内存拷贝测试
对RK3399和RK3288进行dd内存拷贝对比测试,结果如下
1 2 3 4 5 |
rk3399_mid:/ # dd if=/dev/zero of=/dev/null bs=4m count=2048 2048+0 records in 2048+0 records out 8589934592 bytes transferred in 2.682 secs (3202809318 bytes/sec) |
1 2 3 4 5 |
rk3288:/ # dd if=/dev/zero of=/dev/null bs=4m count=2048 2048+0 records in 2048+0 records out 8589934592 bytes transferred in 4.528 secs (1897070360 bytes/sec) |
可见rk3288的内存拷贝速度达到1.89GB/s,而rk3399可以达到3.20GB/s
memcpy内存拷贝测试
另外通过memcpy进行反复拷贝进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#define MEM_BLK_SIZE (4 * 1024 * 1024) uint8_t *src = (uint8_t *) malloc(MEM_BLK_SIZE); uint8_t *dst = (uint8_t *) malloc(MEM_BLK_SIZE); clock_t t; double time_taken; t = clock(); for(int i = 0; i < 1000; i++) { memcpy(dst, src, MEM_BLK_SIZE); } t = clock() - t; time_taken = ((double)t)/CLOCKS_PER_SEC; printf("memcpy took %f seconds to execute \n", time_taken); |
结论是rk3288消耗了2.1s,rk3399消耗了0.8s
另外经过内存频率分析工具的查看,虽然没有100%确认,但基本可以确认rk3288搭配的是DDR3-1066,而rk3399-搭配的是DDR3-1600
CPU内存拷贝加速测试
另外还有一点,通过对比是否启用SIMD命令和增加每次操作的位宽进行拷贝,可以发现使用每次拷贝4字节(32bit模式)换成8字节(64bit模式),性能没有任何提升。使用neon指令一次拷贝128bit,也对性能没有任何提升。这说明一个问题。对于超过缓存的内存读写,内存带宽成为瓶颈,而CPU并不是瓶颈。
分析
视频编解码牵涉到较多的大内存拷贝和读写访问,特别是针对硬件加速编解码后的开销,更是如此。因此剩余的内存开销会比较多的落在内存拷贝上。特别是ARM平台上这些方案CPU性能相对比桌面要弱,总体来看内存拷贝的CPU开销和带来的延迟是不可忽略的。
rk3399平台选用了DDR3-1600,内存频率比rk3288选取的DDR3-1066高50%,叠加单核性能提升,得到了较好的综合性能提升。
同时引用来自techspot的一篇关于高频内存的评测文章,可以发现对于高分辨率视频编解码类应用,高频内存可以带来非常显著的性能提升
结论
针对高清晰度的视频,内存频率对于视频编解码应用性能有显著影响,即使是使用硬编硬解。因此在后续选型时,我们要注意尽量在可接受的成本下,选取高频内存。甚至一定程度上牺牲CPU提高内存规格可以达到更好的性价比。
参考
DDR扫盲——关于Prefetch与Burst的深入讨论
内存带宽测试与AVX指令集读写内存
NEON加速之memcpy在ARM平台的优化