【XRT Vitis-Tutorials】视频处理加速(Kernel+VCU)

【XRT Vitis-Tutorials】视频处理加速(Kernel+VCU)1前言前面文章导航:ZCU106XRT环境搭建ZCU106XRTVivado工程分析ZCU106XRTPetaLinux工程分析【XRTVitis-Tutorials】RTLKernels测试【XRTVitis-Tutorials】C++/RTLKernel混合编程测试【XRTVitis-Tutorials】图像并行计算【XRTVitis-Tutorials…

大家好,又见面了,我是你们的朋友全栈君。

1 前言

前面文章导航:
ZCU106 XRT环境搭建
ZCU106 XRT Vivado工程分析
ZCU106 XRT PetaLinux工程分析
【XRT Vitis-Tutorials】RTL Kernels测试
【XRT Vitis-Tutorials】C++/RTL Kernel混合编程测试
【XRT Vitis-Tutorials】图像并行计算
【XRT Vitis-Tutorials】cl调度优化

官方文档:
2019.2 Vitis™ Application Acceleration Development Flow Tutorials
Vitis Unified Software Platform Documentation Application Acceleration Development
Vitis Unified Software Platform Documentation Embedded Software Development

Vitis ZCU106 Platform
ZCU106 Vitis Platform

pre-built,直接下载并复制到SD卡即可测试:
ZCU106 Test Image

使用VCU的代码:
zcu106_codec

2 创建Vitis工程

本篇文章来测试Tutorials中的第4个例子:Convolution Example
该例子中主要目的是对视频进行处理,其中进行了多个实验,从CPU单独运行到最后的RTL加速运行。

2.1 CPU Only

该实验使用纯CPU的方法对视频图像处理进行了测试。

2.1.1 新建工程

在Vitis中创建一个新的Application Project
平台:zcu106vcu_base并命名为conv_system
APP:conv_cpu

2.1.2 添加源码

我们将需要编译的内容直接添加到src目录下,包括:
design/cpu_src目录下的所有内容
最终的工程目录结构如下图:
在这里插入图片描述

2.1.3 代码分析

  • 创建两个ffmpeg实例,一个用于读取MP4文件并解码读出,一个用于编码后写入新的MP4文件
  • 读取MP4文件并解码出图像
  • 将解码出的图像进行conv计算
  • 将conv输出的图像灰度化
  • 将灰度化的图像写入MP4文件

2.1.4 固件编译

由于该实验是CPU Only,所以没有需要进行加速的RTL部分。所以直接使用Vitis进行交叉编译即可。为了更快速的运行程序,将优化编译选项配置成 -O3

2.1.5 测试验证

将固件复制到SD卡,然后运行命令进行测试

A53 CPU运行测试:

root@zcu106vcu_base:~# cp /mnt/conv_cpu.exe ./conv_cpu.exe
root@zcu106vcu_base:~# cp /mnt/video.mp4 ./video.mp4
root@zcu106vcu_base:~# ./conv_cpu.exe --gray true ./video.mp4 -o ./video_out.mp4
input: ./video.mp4
output: ./video_out.mp4
video size: 1920x1080
nframes: 132
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4
Processing 132 frames of ./video.mp4 ...
[###################################] 100 %

Processed 7.91 MB in 49.259s (21.20 MBps)

root@zcu106vcu_base:~#

由于暂时没有找到方法在A53中运行gprof来分析性能,因此在PC中进行测试。
i5 CPU运行测试:

convolution-tutorial/design/cpu_src$ ./convolve --gray true ./video.mp4 -o ./video_out.mp4
input: ./video.mp4
output: ./video_out.mp4
video size: 1920x1080
nframes: 132
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pix_fmt rgba -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4 -q:v 5 -an -codec mpeg4 ./video_out.mp4
Processing 132 frames of ./video.mp4 ...
[###################################] 100 %

Processed 7.91 MB in 8.927s (116.97 MBps)

convolution-tutorial/design/cpu_src$ gprof convolve gmon.out> gprofresult.txt
convolution-tutorial/design/cpu_src$ cat gprofresult.txt 
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 93.43      7.53     7.53      132    57.05    57.05  convolve_cpu
  6.71      8.07     0.54      132     4.10     4.10  grayscale_cpu
  0.00      8.07     0.00      132     0.00     0.00  print_progress(int, int)
  0.00      8.07     0.00        1     0.00     0.00  _GLOBAL__sub_I_default_output
***
convolution-tutorial/design/cpu_src$ sudo apt-get install graphivz
convolution-tutorial/design/cpu_src$ pip3 install gprof2dot
convolution-tutorial/design/cpu_src$ gprof2dot gprofresult.txt > gprof_graph.dot
convolution-tutorial/design/cpu_src$ dot -Tpng gprof_graph.dot -o gprof_graph.png

使用graphviz的dot工具分析了程序运行流程,可以看到convolve_cpu函数消耗了大量的时间。
在这里插入图片描述

2.1.6 结果分析

可以看到A53的运行速度1920×1080分辨率,132帧,然后进行conv和灰度计算,总共消耗了49秒的时间,这时间中还包含了编解码消耗的时间。相对于PC运算,效率还是太低了。
A53 CPU的处理速度:132/49 = 2.69 FPS,这与实时视频处理需求的30 FPS,还差的太远了。
我们需要依赖A53的硬件至少实现12倍的加速才能够实现30 FPS的速度。

2.2 Convolution加速

2.2.1 新建工程

在Vitis中创建一个新的Application Project
平台:conv_system
APP:conv_kernel

2.2.2 添加源码

我们将需要编译的内容直接添加到src目录下,包括:
design/multi_cu目录下的所有内容
最终的工程目录结构如下图:
在这里插入图片描述

2.2.3 代码分析

  • 创建两个ffmpeg实例,一个用于读取MP4文件并解码读出,一个用于编码后写入新的MP4文件
  • 读取MP4文件并解码出图像
  • 将解码出的图像进行conv计算,使用OpenCL调用C++ Kernel实现
  • 将conv输出的图像灰度化
  • 将灰度化的图像写入MP4文件

注:斜体加粗 部分是与上一个测试不同的地方

2.2.4 固件编译

按照例程中的设置,将Conv模块的CU数量设置为4,提高并行处理速度

2.2.5 测试验证

将固件复制到SD卡,然后运行命令进行测试

A53 CPU运行测试:

root@zcu106vcu_base:~# ./conv_kernel.exe ./conv_kernel.xclbin --gray true --kernel_name convolve_fpga ./video.mp4 -o ./video_out.mp4
input: ./video.mp4
output: ./video_out.mp4
video size: 1920x1080
nframes: 132
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4
[ 3829.312242] [drm] Pid 12273 opened device
Binary Path: ./conv_kernel.xclbin
Processing 132 frames of ./vi[ 3829.318928] [drm] Pid 12273 closed device
deo.mp4 ...
[ 3829.328709] [drm] Pid 12273 opened device
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
INFO: Importing ./conv_kernel.xclbin
Loading: './conv_kernel.xclbin'
[ 3829.430157] [drm] The XCLBIN already loaded. Don't need to reload.
[ 3829.435742] [drm] Reconfiguration not supported
[###################################] 100 % 
FPGA Time:       22.5645 s
FPGA Throughput: 46.2735 MB/s


Processed 7.91 MB in 22.761s (45.87 MBps)

[ 3852.037993] [drm] zocl_free_userptr_bo: obj 0x0000000099078c8b
root@zcu106vcu_base:~#

2.2.6 结果分析

通过运算时间可以看到处理速度从49秒降低到了22.5秒,总时间减小了一半多。
这个CU=4的配置感觉没有生效,需要考虑一下原因(可能是编码速度太慢?)
A53 CPU的处理速度:132/22.56 = 5.85 FPS

2.3 GrayScale加速

这个工程的代码是自己手动添加的,原有例程中没有

2.3.1 新建工程

在Vitis中创建一个新的Application Project
平台:conv_system
APP:conv_gray

2.3.2 添加源码

我们将grayscale在RTL中实现

void grayscale_compute_dataflow(hls::stream<GrayPixel>& write_stream,
								hls::stream<RGBPixel>& read_stream,
                        		int elements) {
	RGBPixel pix_rgb;
	GrayPixel pix_gray;
	fixed cr(0.30);
	fixed cg(0.59);
	fixed cb(0.11);
	while(elements--) {
		read_stream >> pix_rgb;
		pix_gray = 	(pix_rgb.r * cr) + //red
					(pix_rgb.g * cg) + // green
					(pix_rgb.b * cb);  // blue
		write_stream << pix_gray;
	}
}

2.3.3 代码分析

  • 创建两个ffmpeg实例,一个用于读取MP4文件并解码读出,一个用于编码后写入新的MP4文件
  • 读取MP4文件并解码出图像
  • 将解码出的图像进行conv计算,使用OpenCL调用C++ Kernel实现
  • 将conv输出的图像灰度化,使用OpenCL调用C++ Kernel实现
  • 将灰度化的图像写入MP4文件

注:斜体加粗 部分是与上一个测试不同的地方

2.3.4 固件编译

因为AXI_Slave Number小于等于16的限制,将Conv和Gray模块的CU数量都设置为1

2.3.5 测试验证

将固件复制到SD卡,然后运行命令进行测试

A53 CPU运行测试:
软件计算grayscale

root@zcu106vcu_base:~# 
root@zcu106vcu_base:~# /mnt/conv_gray.exe /mnt/conv_gray.xclbin --gray true /mnt/video.mp4 -o ./video_gray_g.mp4
input: /mnt/video.mp4
output: ./video_gray_g.mp4
video size: 1920x1080
nframes: 132
IN COMMAND:  ffmpeg -v error -hide_banner -i /mnt/video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pi-
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4 -q:v4
Binary Path: /mnt/conv_gray.xclbin
Processing 132 frames of /mnt/video.mp4 ...
[   81.273251] [drm] Pid 2671 opened device
[   81.277212] [drm] Pid 2671 closed device
[   81.281354] [drm] Pid 2671 opened device
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
INFO: Importing /mnt/conv_gray.xclbin
Loading: '/mnt/conv_gray.xclbin'
[   81.383444] [drm] The XCLBIN already loaded. Don't need to reload.
[   81.386711] [drm] Reconfiguration not supported
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 1 0
[## ] 6 %[ 82.924773] print_req_error: I/O error, dev mmcblk0, sector 7689
[   82.930848] Buffer I/O error on dev mmcblk0p1, logical block 7554, lost async page write
[###################################] 100 % 
FPGA Time:       23.4527 s
FPGA Throughput: 44.5211 MB/s


Processed 7.91 MB in 23.664s (44.12 MBps)

[  104.869503] [drm] zocl_free_userptr_bo: obj 0x00000000c51e768b
[  104.883850] [drm] Pid 2671 closed device
root@zcu106vcu_base:~#

硬件加速计算grayscale

root@zcu106vcu_base:~# /mnt/conv_gray.exe /mnt/conv_gray.xclbin --gray true --gray_acc true /mnt/video.mp4 -o ./video_gray_g.mp4
input: /mnt/video.mp4
output: ./video_gray_g.mp4
video size: 1920x1080
nframes: 132
IN COMMAND:  ffmpeg -v error -hide_banner -i /mnt/video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pi-
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4 -q:v4
Binary Path: /mnt/conv_gray.xclbin
Processing 132 frames of /mnt/video.mp4 ...
[  169.665196] [drm] Pid 2959 opened device
[  169.669156] [drm] Pid 2959 closed device
[  169.673512] [drm] Pid 2959 opened device
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
INFO: Importing /mnt/conv_gray.xclbin
Loading: '/mnt/conv_gray.xclbin'
[  169.773466] [drm] The XCLBIN already loaded. Don't need to reload.
[  169.777814] [drm] Reconfiguration not supported
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 1 1
[###################################] 100 % 
FPGA Time:       21.2221 s
FPGA Throughput: 49.2006 MB/s


Processed 7.91 MB in 21.441s (48.70 MBps)

[  191.037663] [drm] zocl_free_userptr_bo: obj 0x00000000940c51e8
[  191.052737] [drm] Pid 2959 closed device
root@zcu106vcu_base:~#

2.3.6 结果分析

由于CU数量改为了1,速度与前一个实验不具备可比性,因此该实验运行了两次,区别是有没有开启–gray_acc这个参数。
开启这个参数时处理时间为21.22秒,不开启时处理时间为23.45秒,计算时间能够降低9.5%左右。
A53 CPU的处理速度:132/21.22 = 6.22 FPS

2.4 Codec加速

这个工程的代码是自己手动添加的,原有例程中没有

2.4.1 新建工程

在Vitis中创建一个新的Application Project
平台:conv_system
APP:conv_codec

2.4.2 添加源码

2.4.3 代码分析

  • 创建两个基于gstreamer的opencv实例,一个用于读取MP4文件并解码读出,一个用于编码后写入新的MP4文件
  • 读取MP4文件并解码出图像,使用VCU解码器
  • 将解码出的图像进行conv计算,使用OpenCL调用C++ Kernel实现
  • 将conv输出的图像灰度化,使用OpenCL调用C++ Kernel实现
  • 将灰度化的图像写入MP4文件,使用VCU编码器

注:斜体加粗 部分是与全部CPU运行测试不同的地方

2.4.4 固件编译

2.4.5 测试验证

将固件复制到SD卡,然后运行命令进行测试

A53 CPU运行测试:

纯CPU运行

root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin --cpu true ./video.mp4 -o ./video_color_cpu.mp4
input: ./video.mp4
output: ./video_color_cpu.mp4
video size: 1920x1080
nframes: 132
Accel:OFF
VCU decoder:OFF encoder:OFF
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pix_fmt rgba -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt rgba -s 1920x1080 -framerate 25 -i - -f mp4 -q:v 5 -an -codec mpeg4 ./video_color_cpu.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
[###################################] 100 %

Processed 7.91 MB in 54.541s (19.14 MBps)

root@zcu106vcu_base:~# mkdir video_color_cpu
root@zcu106vcu_base:~# cp xclbin.run_summary video_color_cpu && cp timeline_trace.csv video_color_cpu && cp profile_summary.csv video_color_cpu && cp video_color_cpu.mp4 video_color_cpu
root@zcu106vcu_base:~# 
root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin --cpu true --gray true ./video.mp4 -o ./video_gray_cpu.mp4
input: ./video.mp4
output: ./video_color_cpu.mp4
video size: 1920x1080
nframes: 132
Accel:OFF
VCU decoder:OFF encoder:OFF
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pix_fmt rgba -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4 -q:v 5 -an -codec mpeg4 ./video_gray_cpu.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
[###################################] 100 %

Processed 7.91 MB in 58.208s (17.94 MBps)

root@zcu106vcu_base:~# mkdir video_gray_cpu
root@zcu106vcu_base:~# cp xclbin.run_summary video_gray_cpu && cp timeline_trace.csv video_gray_cpu && cp profile_summary.csv video_gray_cpu && cp video_gray_cpu.mp4 video_gray_cpu
root@zcu106vcu_base:~# 

不使能VCU

root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin ./video.mp4 -o ./video_color_vcu_none.mp4
input: ./video.mp4
output: ./video_color_vcu_none.mp4
video size: 1920x1080
nframes: 132
Accel:ON
VCU decoder:OFF encoder:OFF
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pix_fmt rgba -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt rgba -s 1920x1080 -framerate 25 -i - -f mp4 -q:v 5 -an -codec mpeg4 ./video_color_vcu_none.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
Found Platform Number: 1
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
devices number : 1
INFO: Importing ./conv.xclbin
Loading: './conv.xclbin'
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 0 0
[###################################] 100 % 
FPGA Time:       45.9614 s
FPGA Throughput: 22.7178 MB/s

Processed 7.91 MB in 46.137s (22.63 MBps)

root@zcu106vcu_base:~# mkdir video_color_vcu_none
root@zcu106vcu_base:~# cp xclbin.run_summary video_color_vcu_none && cp timeline_trace.csv video_color_vcu_none && cp profile_summary.csv video_color_vcu_none && cp video_color_vcu_none.mp4 video_color_vcu_none
root@zcu106vcu_base: 
root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin --gray true --gray_acc true ./video.mp4 -o ./video_gray_vcu_none.mp4
input: ./video.mp4
output: ./video_gray_vcu_none.mp4
video size: 1920x1080
nframes: 132
Accel:ON
VCU decoder:OFF encoder:OFF
IN COMMAND:  ffmpeg -v error -hide_banner -i ./video.mp4 -f image2pipe -vcodec rawvideo -vf scale=w=1920:h=1080 -vframes 132 -pix_fmt rgba -
OUT COMMAND: ffmpeg -v error -hide_banner -y -f rawvideo -vcodec rawvideo -pix_fmt gray -s 1920x1080 -framerate 25 -i - -f mp4 -q:v 5 -an -codec mpeg4 ./video_gray_vcu_none.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
Found Platform Number: 1
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
devices number : 1
INFO: Importing ./conv.xclbin
Loading: './conv.xclbin'
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 1 1
[###################################] 100 % 
FPGA Time:       21.1492 s
FPGA Throughput: 49.3702 MB/s

Processed 7.91 MB in 21.328s (48.96 MBps)

root@zcu106vcu_base:~# mkdir video_gray_vcu_none
root@zcu106vcu_base:~# cp xclbin.run_summary video_gray_vcu_none && cp timeline_trace.csv video_gray_vcu_none && cp profile_summary.csv video_gray_vcu_none && cp video_gray_vcu_none.mp4 video_gray_vcu_none
root@zcu106vcu_base:~# 

打开VCU Encoder and Decoder

root@zcu106vcu_base:~# 
root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin --enc true --dec true ./video.mp4 -o ./video_color_vcu_all.mp4
input: ./video.mp4
output: ./video_color_vcu_all.mp4
video size: 1920x1080
nframes: 132
Accel:ON
VCU decoder:ON encoder:ON
IN COMMAND:  filesrc location=./video.mp4 ! queue ! qtdemux ! queue ! h264parse ! video/x-h264, alignment=au ! queue ! omxh264dec ! video/x-raw,format=NV12,width=1920,height=1080 ! queue ! appsink
OUT COMMAND: appsrc ! queue ! videoconvert ! video/x-raw,width=1920,height=1080 ! queue ! omxh264enc target-bitrate=2000 ! video/x-h264, alignment=au ! queue ! capsfilter ! h264parse ! queue ! qtmux ! queue ! filesink location=./video_color_vcu_all.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
Found Platform Number: 1
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
devices number : 1
INFO: Importing ./conv.xclbin
Loading: './conv.xclbin'
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 0 0
inFrameMatNV12 1920 1620 1 0
outFrameMatRGBA 1920 1080 4 24
[                                   ]   1 %!! Warning : Adapting profile to support bitdepth and chroma mode
!! The specified Level is too low and will be adjusted !!
[################################## ] 99 %
Error: partial frame 131 read failed                 
FPGA Time:       9.29383 s
FPGA Throughput: 112.348 MB/s

Processed 7.91 MB in 9.467s (110.29 MBps)

root@zcu106vcu_base:~# mkdir video_color_vcu_all
root@zcu106vcu_base:~# cp xclbin.run_summary video_color_vcu_all && cp timeline_trace.csv video_color_vcu_all && cp profile_summary.csv video_color_vcu_all && cp video_color_vcu_all.mp4 video_color_vcu_all
root@zcu106vcu_base:~# 
root@zcu106vcu_base:~# ./conv.exe ./conv.xclbin --gray true --gray_acc true --enc true --dec true ./video.mp4 -o ./video_gray_vcu_all.mp4
input: ./video.mp4
output: ./video_gray_vcu_all.mp4
video size: 1920x1080
nframes: 132
Accel:ON
VCU decoder:ON encoder:ON
IN COMMAND:  filesrc location=./video.mp4 ! queue ! qtdemux ! queue ! h264parse ! video/x-h264, alignment=au ! queue ! omxh264dec ! video/x-raw,format=NV12,width=1920,height=1080 ! queue ! appsink
OUT COMMAND: appsrc ! queue ! videoconvert ! video/x-raw,width=1920,height=1080 ! queue ! omxh264enc target-bitrate=2000 ! video/x-h264, alignment=au ! queue ! capsfilter ! h264parse ! queue ! qtmux ! queue ! filesink location=./video_gray_vcu_all.mp4
Binary Path: ./conv.xclbin
Processing 132 frames of ./video.mp4 ...
Found Platform Number: 1
platform Name: Xilinx
Vendor Name : Xilinx
Found Platform
devices number : 1
INFO: Importing ./conv.xclbin
Loading: './conv.xclbin'
            compute_units = 1 1
   lines_per_compute_unit = 1080
                     gray = 1 1
inFrameMatNV12 1920 1620 1 0
outFrameMatGRAY 1920 1080 1 0
[                                   ]   1 %!! Warning : Adapting profile to support bitdepth and chroma mode
!! The specified Level is too low and will be adjusted !!
[################################## ] 99 %
Error: partial frame 131 read failed                 
FPGA Time:       10.6679 s
FPGA Throughput: 97.8773 MB/s

Processed 7.91 MB in 10.841s (96.31 MBps)

root@zcu106vcu_base:~# mkdir video_gray_vcu_all
root@zcu106vcu_base:~# cp xclbin.run_summary video_gray_vcu_all && cp timeline_trace.csv video_gray_vcu_all && cp profile_summary.csv video_gray_vcu_all && cp video_gray_vcu_all.mp4 video_gray_vcu_all
root@zcu106vcu_base:~# 

2.4.6 结果分析

由于使用gstreamer的方法无法完成gray或rgba到H264 encoder的格式匹配。所以中间添加了颜色转换的操作(OpenCV的方法),速度与前一个实验不具备可比性。未知异常,只处理了131帧,少了1帧。
处理时间为10.67秒
A53 CPU的处理速度:132/10.67 = 12.28 FPS
与目标30FPS还差了很多,后续还需要进行整体优化。

2.4.7 处理时间分析

在测试时使用性能分析工具:Vitis Analyzer
在运行程序的当前目录添加xrt.ini
默认打开性能分析工具

[Debug]                                                                         
profile=true                                                                    
data_transfer_trace=fine                                                        
stall_trace=all                                                                 
timeline_trace=true                                                             
root@zcu106vcu_base:~#

我们只接分析最终10.67秒的这次处理
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
可以看到
convolve_fpga的运行时比较不稳定,平均34ms,最大131ms,总共消耗4571ms。其中有5次运行超过100ms。
grayscale_fpga类似,平均16ms,最大40ms,总计消耗了2098ms。
最后一张图,可以看到虽然convolve_fpga和grayscale_fpga可以被队列化运行,但是没有合codec进行流水线。可以
Memor读消耗317ms,写消耗1105ms

优化考虑:

  1. 提高两个kernel的吞吐率,例化多个CU
  2. 流水线操作

3 总结

使用Vitis和自定义的ZCU106 XRT平台完成了Vitis-Tutorials中的Convolution Example功能测试。并使用VCU加速了编解码速度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157986.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • ubuntu配置opencv环境_opencv的安装与配置详细教程

    ubuntu配置opencv环境_opencv的安装与配置详细教程目录一、安装opencv(1)下载opencv-3.4.15数据包(2)解压缩包(3)使用cmake安装opencv​​(4)配置环境(5)检验二、实例使用(1)打开图片(2)打开摄像头显示处理视频(3)录制视频三、总结四、参考文献一、安装opencv(1)下载opencv-3.4.15数据包打开浏览器,进入下载地址ReleaseOpenCV3.4.15·opencv/opencv·GitHub,选择Source..

  • 压缩文件密码暴力破解——cRARk使用方法

    压缩文件密码暴力破解——cRARk使用方法cRARk使用方法压缩文件如果忘记密码就需要使用暴力破解的方法进行破解,因为使用了加密的手段,是无法绕过密码验证的。cRARk是一款开源的功能强大的rar,7z类压缩软件的破解工具,支持GPU加速。官网地址目前有命令行版本和windows的GUI版本。使用方法在官网下载命令行版本GUI版本注意:GUI版本必须有命令行版本下才能运行GUI使用命令行版本下载解压,提示需要输入密码,但是实际上密码为空。或者为UTF-16。(crark55.rar)然后解压GUI版本,里面只有一个可运

  • 安卓ExpandableListView的详细使用教程(附代码解析过程)「建议收藏」

    安卓ExpandableListView的详细使用教程(附代码解析过程)「建议收藏」ExpandableListView又称可扩展的ListView,它可以实现点击父项展开子项的效果,本文实现了一个比较精美的ExpandableListView。

  • 股票打板策略分析_打板选股技巧

    股票打板策略分析_打板选股技巧股票打板策略分析这里我们只分析一件事情,就是如何打板才能最大概率赚到钱,就是我们可以分析过去一天涨停今天还涨停、分析过去两天涨停今天涨的概率,一直到过去10天涨停今天涨的概率,其实很多人都喜欢打板,但是可能大家都没分析过打板的胜率。前面我们已经可以筛选出截止到特定日期的过去10天中的连续涨停了,这里我们只需要将所有日期过去10日的连续涨停计算出来就可以作为我们的数据源,然后计算统计个数算分布就可以了,至于如何计算连续涨停可以参考股票数据分析计算历史数据的涨停情况我们今天的打板分析,是在昨天的基础上,

    2022年10月21日
  • (转载)如何画好架构图[通俗易懂]

    (转载)如何画好架构图[通俗易懂](转载)如何画好架构图标签(空格分隔):系统设计转载自阿里巴巴中间件公众号。原文地址:"如何画好架构图"写在前面当我们想用一张或几张图来描述一下我们的系统时,是不是许

  • Spring JpaTransactionManager事务管理

    Spring JpaTransactionManager事务管理    首先,在做关于JpaTransactionManager之前,先对Jpa做一个简单的了解,他毕竟不如hibernate那么热门,其实二者很相识,只不过后期hibernate和JDO版本都已经兼容了其Jpa,目前大家用的少了。   JPA全称JavaPersistenceAPI.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化…

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号