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
優化考慮:
- 提高兩個kernel的吞吐率,例化多個CU
- 流水線操作
3 總結
使用Vitis和自定義的ZCU106 XRT平臺完成了Vitis-Tutorials中的Convolution Example功能測試。並使用VCU加速了編解碼速度。