专栏算法工具链J6系统 GPU的功能和使用概述

J6系统 GPU的功能和使用概述

费小财2024-12-09
281
1

gpu sample

功能概述

本文的gpu sample简单展示了:

  1. OpenGL ES的渲染功能,几何shader,细分shader,计算shader

  2. EGL,GBM,DRM之间的通路

  3. Vulkan的简单demo

  4. OpenCL的计算和图片处理功能

    本文sample的主要目的是展示J6X gpu能够正常运行,仅供参考。
    本文sample的代码参考了“learnopengl(尽管OpenGL ES相比于OpenGL具有一些限制和特定之处,但它们共享许多基本的概念和流程)”和“ARM vulkan-sdk”,如果您对入门GPU有兴趣,强烈推荐“learnopengl”,以下是链接:
    1. `learnopengl <https://learnopengl.com>`_

    2. `ARM vulkan-sdk <https://github.com/ARM-software/vulkan-sdk>`_

软件架构说明

本文的sample基于gpu的libgbm api,libEGL api,liblibGLESv2 api(支持GLES2,GLES3.2),libvulkan api(支持Vulkan1.3),libOpenCL api(支持OpenCL3.0)实现。

Description

代码位置与目录结构

代码路径

  1. 代码位置:{sdk_dir}/test/samples/platform_samples/source/S83_Sample/S83E04_Module/gpu_sample

    1. 目录结构:

      .
      ├── build.sh
      ├── CMakeLists.txt
      ├── Kconfig
      ├── pkgconfig
      └── src
      ├── common
      ├── gles
      │ ├── camera_calibration_4v_with_stitch
      │ ├── camera_calibration_single_picture
      │ ├── common
      │ ├── compute_shader_sample
      │ ├── geometry_shader_sample
      │ ├── multi_thread_stitch
      │ ├── multi_thread_stitch_4v_3m_instanced_draw
      │ ├── multi_thread_stitch_4v_3m_single_sampler
      │ └── tessellation_shader_sample
      ├── opencl
      │ ├── fma_calculation
      │ └── image_grayscale_process
      ├── vulkan
      │ ├── common
      │ ├── Sample.cmake
      │ └── vk_multi_thread_stitch
      └── wayland_protocols_out
      Kconfig用于控制该demo是否加入整体编译;
      ild.sh会控制sample的编译流程,指定cmake的编译参数,输出编译产物;
      akeLists.txt定义项目的构建规则和配置信息;
      c目录中包含所有的sample代码;
      yland_protocols_out中包含解析wayland protocol得到的输出文件。

API流程说明

OpenGL ES sample的EGL api调用相对固定,GLES api的调用流程相对灵活。下面的流程图中省略了GLES的api调用流程,相对详细地展示了EGL api的调用流程:

Description

Vulkan sample中的api调用数量很多,但其中有一些相对固定的调用。下面的流程图中抽取了部分相对固定的api调用,简要展示了Vulkan api的调用流程:

Description

OpenCL sample中的api调用相对简单。下面的流程图中抽取了相对固定的api调用,简要展示了OpenCL api的调用流程:

Description

编译

编译环境

本文的sample编译环境使用SDK中的build工具,请参考: :doc:Build环境建立 <../../j6_sysdev/build/j6_sysdev_build>。

编译说明

编译命令

#编译命令
make lunch
1
source envsetup.sh
bdm gpu-sample
# 输出文件:
{sdk_dir}/out/debug-gcc_{gcc_version}/target/deploy/app/sample/S83_Sample/S83E04_Module/gpu_sample

运行

支持平台

Matrix 6E/M

硬件环境搭建

NA

运行指南
1.1 gles multi_thread_stitch sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/multi_thread_stitch/multi_thread_stitch --dump_image=1
# 1.2 gles tessellation_shader_sample sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/tessellation_shader_sample/tessellation_shader_sample --dump_image=1
# 1.3 gles geometry_shader_sample sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/geometry_shader_sample/geometry_shader_sample --dump_image=1
# 1.4 gles compute_shader_sample sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/compute_shader_sample/compute_shader_sample --dump_image=1
# 1.5 gles camera_calibration_single_picture sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_single_picture/camera_calibration_single_picture --win_width=576 --win_height=252 --dump_image=1
# 1.6 gles camera_calibration_4v_with_stitch sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_4v_with_stitch/camera_calibration_4v_with_stitch --win_width=896 --win_height=896 --dump_image=1
# 1.7 gles camera_calibration_4v_with_stitch sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_4v_with_stitch/camera_calibration_4v_with_stitch --win_width=896 --win_height=896 --max_fps=-1 --benchmark=10 --dump_image=3
# 1.8 gles stitch_3v_8v_0_1_idu sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/stitch_3v_8v_0_1_idu/stitch_3v_8v_0_1_idu --winsys_type=3 --benchmark=10
# 2.1 vulkan multi_thread_stitch sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/vulkan/vk_multi_thread_stitch/vk_multi_thread_stitch --dump_image=1
# 2.1 opencl image_grayscale sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/image_grayscale_process --dump_image=1
# 2.2 opencl fma_calculation sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/fma_calculation/fma_calculation
# 2.3 opencl distortion_correction sample
/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction --dump_image=1

运行参数说明

下面列出了3个本文sample常用的入参,更多的参数信息可以通过help得到。需要注意的是,并不是每个sample都支持help打印得到的运行参数,具体参数的使用请结合本章的运行指南和运行结果说明。
=============== ===================================================================================== ============
参数名 用法 是否必需 ============= ===================================================================================== ==============
dump_image dump_image=<0,1>,输入0时,sample处理得到的结果不会被导出为文件,为1时图片会被导出 否
benchmark benchmark=n,其中n>0,指定sample的运行时间,单位是秒 否
help help,帮助选项,会打印帮助信息 否
=============== ===================================================================================== ==============

运行结果说明

OpenGL ES sample

  1. 以下是OpenGL ES的多线程拼接sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/multi_thread_stitch/multi_thread_stitch --dump_image=1
    umpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 1080p,可以通过看图软件查看,该图片实际上是由四张图片拼接而成。下图仅为示例,实际情况请结合输入图片进行确认:
Description
DescriptionDescription
  1. 以下是OpenGL ES的细分shader sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/tessellation_shader_sample/tessellation_shader_sample --dump_image=1
    umpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed

运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 1080p,可以通过看图软件查看,该图片是由gpu计算并绘制得到的一条贝塞尔曲线。下图仅为示例,实际情况请结合输入图片进行确认:

Description
  1. 以下是OpenGL ES的几何shader sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/geometry_shader_sample/geometry_shader_sample --dump_image=1
    umpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed

运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 1080p,可以通过看图软件查看,该图片是由gpu计算并绘制得到的4个多边形。下图仅为示例,实际情况请结合输入图片进行确认:

Description
  1. 以下是OpenGL ES计算管线的sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/compute_shader_sample/compute_shader_sample --dump_image=1
    umpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed

运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 1080p,可以通过看图软件查看,该图片中间的彩色纹理由gpu的计算管线计算得到。下图仅为示例,实际情况请结合输入图片进行确认:

Description
  1. 以下是OpenGL ES畸变矫正Sample

本文提供两个畸变矫正sample,分别是“单张图片的畸变矫正”以及“4张图片畸变矫正之后进行拼接”。首先展示单张图片的畸变矫正:
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_single_picture/camera_calibration_single_picture --win_width=576 --win_height=252 --dump_image=1
Dumpfile(dump_out_raw_image_nv12_576x252*.yuv) successed
运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 576x252,可以通过看图软件查看。下图仅为示例,实际情况请结合输入图片进行确认:
Description
单张图片的畸变矫正sample支持读取gdc的remap文件(文件格式为txt,其中存储了remap数据),支持对指定图片进行畸变矫正。比如路径/app/sample/S83_Sample/S83E04_Module/gpu_sample中存有畸变的图片以及对应的remap数据文件,可以通过以下命令生成一张畸变矫正后的图片:
# --image_path 指定畸变图片的路径
# --image_width 指定畸变图片的宽
# --image_height 指定畸变图片的高
# --gdc_bin_file_path 指定remap数据路径
# --dump_image=1 将结果dump为文件到当前工作路径下
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_single_picture/camera_calibration_single_picture --image_path=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/720p_fisheye_0.yuv --image_width=1280 --image_height=720 --gdc_bin_file_path=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/camera_0_gdc_config_3.1.txt --dump_image=1
Dumpfile(dump_out_raw_image_nv12*.yuv) successed
运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 1920x1080,可以通过看图软件查看。下图仅为示例,实际情况请结合输入图片进行确认:
Description
4张图片畸变矫正之后进行拼接:
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_4v_with_stitch/camera_calibration_4v_with_stitch --win_width=896 --win_height=896 --dump_image=1
Dumpfile(dump_out_raw_image_nv12_896x896*.yuv) successed

运行结束之后会看到当前文件夹中有一张yuv图片,格式为nv12 896x896,可以通过看图软件查看。下图仅为示例,实际情况请结合输入图片进行确认:

Description
  1. 以下是OpenGL ES畸变矫正后输出到Codec进行编码并进一步输出h264文件的Sample

    -benchmark=10 意味着该Sample会运行10秒
    -max_fps=-1 意味着不限制帧率
    -dump_image=3 意味着GPU的输出会送给Codec进行编码并存为文件保存在当前路径中
    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/camera_calibration_4v_with_stitch/camera_calibration_4v_with_stitch --win_width=896 --win_height=896 --max_fps=-1 --benchmark=10 --dump_image=3
    .....
    ump gpu_sample_codec_output_896x896.h264 success
    PU(%) : 18.460000
    PS : 191.100000
    otal frames : 1911.000000

运行结束之后会看到当前文件夹中有一个名为gpu_sample_codec_output_896x896.h264的文件,可以通过ffplay进行查看。下图仅为示例,实际情况请结合输入图片进行确认:

Description
  1. 以下是OpenGL ES 两个线程,一个线程进行3v的拼接并输出到idu0,另一个线程进行8v的拼接并输出到idu1的Sample

    -winsys_type=3 意味着图片会通过drm输出
    -benchmark=10 意味着该Sample会运行10秒
    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/stitch_3v_8v_0_1_idu/stitch_3v_8v_0_1_idu --winsys_type=3 --benchmark=10
    .....
    PU(%) : 106.239999
    PS : 59.800000
    otal frames : 598.000000
通过CSI TX输出,可以使用MAX9295E加串器输出,再通过MAX9296或MAX96712解串器接入RX,收图查看结果,具体参考 :doc:Display sample <../../sample_doc/platform_samples/sample_doc_platform_samples_display_sample> 中的回环sample。
在没有外接子板的情况下可以将图片保存为文件,通过以下的命令运行:
--benchmark=1 意味着该Sample会运行1秒
--dump_image=1 意味着GPU的输出会保存为文件在当前路径中
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/gles/stitch_3v_8v_0_1_idu/stitch_3v_8v_0_1_idu --benchmark=1 --dump_image=1
......
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
Dumpfile(dump_out_raw_image_nv12_1920x1080*.yuv) successed
......
CPU(%) : 118.800003
FPS : 11.000000
Total frames : 11.000000
运行结束之后会看到当前文件夹中有多个图片文件,格式为nv12 1920x1080,输出结果有3v和8v两种,可以通过看图软件查看。下图仅为示例,实际情况请结合输入图片进行确认:
Description
Description

Vulkan sample

  1. 以下是Vulkan的多线程拼接sample

root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/vulkan/vk_multi_thread_stitch/vk_multi_thread_stitch --dump_image=1
INFO: MALI_PNG_PATH environment variable not defined, falling back to default.
INFO: Dumping PNG files to: Mali-SDK-Frames.xxxxxxxx.png.
INFO: Instance extension: VK_KHR_device_group_creation
INFO: Instance extension: VK_KHR_external_fence_capabilities
INFO: Instance extension: VK_KHR_external_memory_capabilities
INFO: Instance extension: VK_KHR_external_semaphore_capabilities
INFO: Instance extension: VK_KHR_get_physical_device_properties2
INFO: Instance extension: VK_EXT_debug_report
INFO: Instance extension: VK_EXT_debug_utils
INFO: Instance extension: VK_KHR_display
INFO: Instance extension: VK_KHR_surface
INFO: Instance extension: VK_EXT_headless_surface
INFO: Instance extension: VK_KHR_get_surface_capabilities2
INFO: Instance extension: VK_KHR_portability_enumeration
INFO: Instance extension: VK_LUNARG_direct_driver_loading
INFO: Instance extension: VK_KHR_wayland_surface
INFO: Enabling Vulkan debug reporting.
INFO: Found ARM Mali physical device: Mali-G78AE.
INFO: Found application base directory: "/app/sample/S83_Sample/S83E04_Module/gpu_sample/vulkan/vk_multi_thread_stitch".
INFO: Writing rgb file to: "Mali-SDK-Frames.00000000rgba8888.rgba".
Dumpfile(Mali-SDK-Frames.00000000rgba8888.rgba) successed
INFO: Wrote RGB file: "Mali-SDK-Frames.00000000rgba8888.rgba".

运行结束之后会看到当前文件夹中有一张格式为raw rgba8888 1080p的图片,可以通过看图软件查看,该sample的效果和OpenGL ES的多线程拼接sample一样,此处不再展示。

OpenCL sample

  1. 以下是OpenCL的图片灰度处理sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/image_grayscale_process --dump_image=1
    umpfile(/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/dump_out_res_image_rgba8888_3840x2160.rgba) successed
    umpfile(/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/dump_out_ref_image_rgba8888_3840x2160.rgba) successed
    hread(pid) 1321634 info :
    PU(%) : 31.200001
运行结束之后会看到当前文件夹中有两张格式为raw rgba8888 4k的图片,一张是由cpu生成的参考图片,另一张是由gpu生成的图片。处理前和处理后的图片如下所示:
Description
Description
该sample会逐像素地对cpu和gpu的计算结果做校验,在sample运行结束之后会打印sample的cpu占用率。由log可以看到cpu占用率约为31%,这是由于图片加载以及逐像素校验导致的。
通过额外的运行参数可得到opencl任务下发线程的cpu占用率:
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/image_grayscale_process --benchmark=10
Thread(pid) 1325816 info :
CPU(%) : 5.340000
Process info:/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/image_grayscale_process/image_grayscale_process
CPU(%) : 29.457143
FPS : 98.600000
Total frames : 986.000000

可以看到,任务下发线程的cpu占用率约为5%,输出的图片帧率约为98fps,总共输出了986帧数据。

  1. 以下是OpenCL的fma计算sample

    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/fma_calculation/fma_calculation
    xecution times : 1.000000
    verage FLOPS (GFLOPS) : 95.654274
    umber of Compute Units : 2.000000
    PU Time elapsed (ms) : 856.417561
    PP Time elapsed (ms) : 856.678666
    PU Time / APP Time (%) : 99.969521

可以看到,fma运算的任务总共在gpu端运行了1次,由此得到的gpu算力为95gflops,gpu的计算单元有两个,该任务在gpu端执行了约856.417561ms,整个sample的运行时间约为856.678666ms,gpu运算时间占sample运行时间的99.969521%。

  1. 以下是OpenCL的畸变矫正sample

    -cl_sample_image_in_height 表示输入图片的高
    -cl_sample_image_in_width 表示输入图片的宽
    -cl_sample_remap_height 表示remap表对应的图片高
    -cl_sample_remap_width 表示remap表对应的图片宽
    -cl_sample_image_in 表示输入图片路径
    -cl_sample_remap_data_path 表示remap表的输入路径
    -dump_image=1 表示结果会以文件的形式dump出来
    oot@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction --dump_image=1
    -cl_sample_image_in_height=720
    -cl_sample_image_in_width=1280
    -cl_sample_remap_height=720
    -cl_sample_remap_width=1280
    -cl_sample_image_in=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/720p_fisheye_0.yuv
    -cl_sample_remap_data_path=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/camera_0_gdc_config_3.1.txt
    umpfile(distortion_correction_dump_out_1_1280x720.yuv) successed

运行结束之后当前文件夹中会生成一张yuv图片,格式为nv12 1280x720,可以通过看图软件查看。下图仅为示例,实际情况请结合输入图片进行确认:

Description
该sample可以进行1920x1080和3840x2160分辨率的畸变矫正任务,以下是运行示例:
--benchmark=20 表示该sample会运行20秒
--max_fps=-1 表示不限制最高帧率
root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction --cl_sample_image_in=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/1080p_fisheye_0.yuv --cl_sample_image_in_height=1080 --cl_sample_image_in_width=1920 --benchmark=20 --max_fps=-1
--cl_sample_image_in_height=1080
--cl_sample_image_in_width=1920
--cl_sample_remap_height=720
--cl_sample_remap_width=1280
--cl_sample_image_in=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/1080p_fisheye_0.yuv
--cl_sample_remap_data_path=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/camera_0_gdc_config_3.1.txt
Process info:/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction
CPU(%) : 3.100000
FPS : 292.000000
Total frames : 5840.000000

以上是1080p分辨率畸变矫正的运行示例,运行期间的cpu占用率约为3%,平均帧率约为292fps,总共进行了5840帧畸变矫正任务。

root@hobot:~# /app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction --cl_sample_image_in=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/3840x2160_fisheye_0.yuv --cl_sample_image_in_height=2160 --cl_sample_image_in_width=3840 --benchmark=20 --max_fps=-1
--cl_sample_image_in_height=2160
--cl_sample_image_in_width=3840
--cl_sample_remap_height=720
--cl_sample_remap_width=1280
--cl_sample_image_in=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/3840x2160_fisheye_0.yuv
--cl_sample_remap_data_path=/app/sample/S83_Sample/S83E04_Module/gpu_sample/res/gpu_gdc_res/camera_0_gdc_config_3.1.txt
Process info:/app/sample/S83_Sample/S83E04_Module/gpu_sample/opencl/distortion_correction/distortion_correction
CPU(%) : 2.450000
FPS : 74.100000
Total frames : 1482.000000

以上是4k分辨率畸变矫正的运行示例,运行期间的cpu占用率约为2%,平均帧率约为74fps,总共进行了1482帧畸变矫正任务。

算法工具链
征程6社区征文技术深度解析前沿技术
评论1
0/1000
  • 费小财
    Lv.5

    这里只是对GPU的主要功能做了简单的描述,对于GPU如何在项目中使用,具体是用于前置还是环视的,欢迎大家进行讨论

    2024-12-09
    0
    0