4.5.13. 2D GPU 性能测试

4.5.13.1. 测试原理

2D GPU 性能测试主要评估在 2D 图形加速等常用操作中的性能表现,包含位块传输、矩形填充和清除、透明度混合等关键指标。 测试代码逻辑如下:

  1. 记录测试起始时间

  2. 2D GPU 处理函数循环执行 100 次

  3. 记录测试结束时间

  4. 根据测试起始、结束时间和执行次数计算 2D GPU 处理函数的平均耗时和帧率

4.5.13.2. 测试准备工作

  1. BSP 镜像中默认存放了可执行的测试程序 , 可以 cd 到如下路径查看 :

    cd /app/platform_samples/chip_base_test/10_gpu_2d_test/
    
    ls
    bin  performance_test.sh
    
  2. 如果是自定义镜像的情况,可以从 BSP 源码目录中的 app/samples/platform_samples/chip_base_test/10_gpu_2d_test 目录拷贝到设备中

4.5.13.3. 测试方法

  1. 执行 performance_test.sh

    ./performance_test.sh
    
  2. 打印如下结果:

root@buildroot:10_gpu_2d_test# ./performance_test.sh
[Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1142191   us] [AverageConsume 11421  us] [FPS    87.6]
[Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2046196   us] [AverageConsume 20461  us] [FPS    48.9]
[Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1227924   us] [AverageConsume 12279  us] [FPS    81.4]
[Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80673     us] [AverageConsume 806    us] [FPS  1239.6]
[Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1357203   us] [AverageConsume 13572  us] [FPS    73.7]
[Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 688650    us] [AverageConsume 6886   us] [FPS   145.2]
[Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1146742   us] [AverageConsume 11467  us] [FPS    87.2]
[Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1141900   us] [AverageConsume 11419  us] [FPS    87.6]
[Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1143476   us] [AverageConsume 11434  us] [FPS    87.5]

4.5.13.4. 测试指标

针对测试方法章节中的打印结果,分析如下:

测试项 FPS 说明
copy 87.2 使用 2DGPU 完成分辨率为 3840 * 2160 图像的拷贝操作
multi_source_alphablend 48.9 输入 4 个 3840 * 2160 图像融合成一个3840 *2160 的图像
resize 81.4 输入 1920*1080 的图像放大 4 倍后输出 3840 * 2160 的图像
resize( 第 2 个 ) 1239.6 输入 1920 * 1080 的图像缩小 4 倍后输出 960 * 540 的图像
stitch 73.7 输入 4 个 3840 * 2160的图像拼接成1个 3840 * 2160 的图像(输入图像的宽和高先各缩放 2 倍再拼接)
stitch(第 2 个) 145.2 输入 2 个 3840 * 2160的图像拼接成1个 3840*1080 的图像(输入图像的宽和高先各缩放 2 倍再在水平方向拼接)
alphablend 87.2 输入 2 个 3840 * 2160 的图像,两个图像的背景色是不同的,进行 alphablend 处理后,输出一个3840 * 2160 的图像
crop 87.6 输入 1 个 3840 * 2160 的图像,从输入图像的起始坐标 (0,0) 裁剪 3840 * 2160 的图像, 输出 3840 * 2160 的图像 (利用裁剪的方式实现图像拷贝)
rectangle_fill 87.5 输入一个 3840 * 2160 的图像背景色是黑色,填充一个和输入图像大小一样的红色矩形框,输出 3840 * 2160 的图像

源码见 BSP 源码目录中的 app/samples/platform_samples/sample_gpu_2d

4.5.13.5. 常见问题

  1. 多次执行的结果之间有比较小的差别

  • 问题描述:如下两次执行日志,测出的帧率是不同的 第一次执行日志:

      [Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1142191   us] [AverageConsume 11421  us] [FPS    87.6]
      [Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2046196   us] [AverageConsume 20461  us] [FPS    48.9]
      [Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1227924   us] [AverageConsume 12279  us] [FPS    81.4]
      [Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80673     us] [AverageConsume 806    us] [FPS  1239.6]
      [Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1357203   us] [AverageConsume 13572  us] [FPS    73.7]
      [Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 688650    us] [AverageConsume 6886   us] [FPS   145.2]
      [Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1146742   us] [AverageConsume 11467  us] [FPS    87.2]
      [Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1141900   us] [AverageConsume 11419  us] [FPS    87.6]
      [Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1143476   us] [AverageConsume 11434  us] [FPS    87.5]
    

    第二次执行日志:

    	[Case copy                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160530   us] [AverageConsume 11605  us] [FPS    86.2]
      [Case multi_source_alphablend       ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 2069446   us] [AverageConsume 20694  us] [FPS    48.3]
      [Case resize                        ] [Input 1*1920*1080] [Output 3840*2160] [TestTimes   100] [TotalConsume 1243849   us] [AverageConsume 12438  us] [FPS    80.4]
      [Case resize                        ] [Input 1*1920*1080] [Output  960*540 ] [TestTimes   100] [TotalConsume 80530     us] [AverageConsume 805    us] [FPS  1241.8]
      [Case stitch                        ] [Input 4*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1371815   us] [AverageConsume 13718  us] [FPS    72.9]
      [Case stitch                        ] [Input 2*3840*2160] [Output 3840*1080] [TestTimes   100] [TotalConsume 695384    us] [AverageConsume 6953   us] [FPS   143.8]
      [Case alphablend                    ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160516   us] [AverageConsume 11605  us] [FPS    86.2]
      [Case crop                          ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1160381   us] [AverageConsume 11603  us] [FPS    86.2]
      [Case rectangle_fill                ] [Input 1*3840*2160] [Output 3840*2160] [TestTimes   100] [TotalConsume 1149800   us] [AverageConsume 11498  us] [FPS    87.0]
    
  • 问题分析:性能测试的逻辑是执行 100 次,计算的平均时间,所以存在 1 帧左右的偏差

  • 解决办法:可以修改测试脚本 performance_test.sh 中执行次数(默认是 100 次,为了尽快输出测试结果)