【XRT Vitis-Tutorials】視頻處理加速(Kernel+VCU)

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加速了編解碼速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章