下载示例
下载设备端 VME 示例代码 和高级示例。
运行指令详见 VME 示例用户指南。 请参阅 AVC 设备端 VME 手册。
请注意:本示例目前仅限在 Linux*、SRB4/Media Server Studio 2017 R2 及更高版本中运行,仅支持第六代智能英特尔® 酷睿™ 处理器及更新一代的处理器。
简介
本文介绍了面向 OpenCL* 的全新设备端 h.264/高级视频编码 (AVC) 运动评估扩展,该扩展由英特尔处理器图形 GPU 提供;视频运动评估 (VME) 硬件作为英特尔® 媒体软件开发套件视频编解码器的重要组件,多年前便可以进行访问,也可以通过主机调用的内置函数进行访问。全新 cl_intel_device_side_avc_motion_estimation扩展(在 Linux 驱动程序 SRB4 中获取) 提供了从内核访问硬件支持 AVC VME 功能的细化接口。
以下部分介绍了 VME 如何利用英特尔扩展访问 OpenCL* 标准:
运动评估概述
运动评估流程可以用于搜索一系列本地(数据块级别)转换,这些转换能够出色地匹配帧和帧之间的时间差异。 如果没有硬件加速,该搜索成本高昂。 通过实现该操作的硬件加速,我们能够以全新的方式对各种算法进行研究。
对于第六代酷睿/Skylake 处理器,英特尔® 处理器显卡 Gen9 计算架构 指南提供了 更多的硬件信息, 可以简要概括为:
- VME 硬件作为采样器模块的一部分,包含在所有子切片中(下图左下方)。英特尔分支团体在子切片级别工作,设备端 VME 扩展也基于分支团体。
- Gen9 硬件的每个切片一般包含 3 个子切片(24 EU/片)。
- 处理器包含的切片数量各不相同, 您可以根据 ark.intel.com(提供处理器图形 GPU 的名称)或 notebookcheck.com 等其他网站(提供关于处理器图形模型的更多信息)中的信息确定切片的数量。
运动搜索是许多现代编解码器的核心操作, 它还有许多其它方面的应用。 可以添加至视频稳定和帧插值等过滤器中,以进行视频处理。 它还是一款实用的预处理器,可以进行编码,提供运动复杂性、运动在帧中的位置等信息。
从计算机视觉的角度看,运动矢量是基于光流的算法基础。
目前可用的英特尔® 处理器图形 GPU 硬件只支持 AVC/H.264 运动评估, HEVC/H.265 运动评估要复杂得多。 但是,这不一定意味着 AVC 运动评估只面向 AVC。 可以利用 VME 返回的选择(旨在简化 AVC 运动方向搜索) 缩小第二次通过/更详细的搜索(如需要)的搜索区域。
设备端接口
之前的实施注重主机调用的内置函数, 设备端实施需要若干设置阶段的内核代码:
- 一般初始化 (intel_sub_group_avc_ime_initialize)
- 操作配置(包括内部成本及所需的其他属性)
(来自 vme_basic.cl)
intel_sub_group_avc_ime_payload_t payload = intel_sub_group_avc_ime_initialize( srcCoord, partition_mask, sad_adjustment); payload = intel_sub_group_avc_ime_set_single_reference( refCoord, CLK_AVC_ME_SEARCH_WINDOW_EXHAUSTIVE_INTEL, payload); ulong cost_center = 0; uint2 packed_cost_table = intel_sub_group_avc_mce_get_default_medium_penalty_cost_table(); uchar search_cost_precision = CLK_AVC_ME_COST_PRECISION_QPEL_INTEL; payload = intel_sub_group_avc_ime_set_motion_vector_cost_function( cost_center, packed_cost_table, search_cost_precision, payload );
然后是评估阶段 (intel_sub_group_avc_ime_evaluate*). 随后可以利用 intel_sub_group_avc_ime_get* 函数提取结果。
intel_sub_group_avc_ime_result_t result = intel_sub_group_avc_ime_evaluate_with_single_reference( srcImg, refImg, vme_samp, payload ); // Process Results long mvs = intel_sub_group_avc_ime_get_motion_vectors( result ); ushort sads = intel_sub_group_avc_ime_get_inter_distortions( result ); uchar major_shape = intel_sub_group_avc_ime_get_inter_major_shape( result ); uchar minor_shapes = intel_sub_group_avc_ime_get_inter_minor_shapes( result ); uchar2 shapes = { major_shape, minor_shapes }; uchar directions = intel_sub_group_avc_ime_get_inter_directions( result );
在本示例中,我们利用相似的步骤修改了运动评估的子像素:
intel_sub_group_avc_ref_payload_t payload = intel_sub_group_avc_fme_initialize( srcCoord, mvs, major_shape, minor_shapes, directions, pixel_mode, sad_adjustment); payload = intel_sub_group_avc_ref_set_motion_vector_cost_function( cost_center,packed_cost_table,search_cost_precision,payload ); intel_sub_group_avc_ref_result_t result = intel_sub_group_avc_ref_evaluate_with_single_reference( srcImg, refImg, vme_samp, payload ); mvs = intel_sub_group_avc_ref_get_motion_vectors( result ); sads = intel_sub_group_avc_ref_get_inter_distortions( result );
预期结果
请注意 -- 下面仅用了输入/输出帧的 一小片区域。
来自输入(源帧和参考帧/前一帧)
本示例的测试片段中产生了“缩小”的运动, 下图显示了主要差异的位置(来自源图像和参考图像的 imagemagick 对比)。
此处显示示例的输出覆盖了运动矢量。 需要指出的是,多数符合缩小的预期径向模式。
其他输出包括 AVC 宏模块形状选择(如下所示)和残差。
结论
视频运动评估是一个强大的特性,开启了探索用于视频编解码器和计算机视觉的众多算法的全新方式。 如果在 CPU 上搜索最具代表性的运动矢量,会产生高昂的计算成本, 可以将搜索卸载至英特尔处理器图形架构图像采样器中的特定硬件。 全新的设备端(从内核中调用)接口支持更高的灵活性和定制功能,同时减少主机端启动的潜在性能成本。
参考资料
如欲获取关于编译器优化的完整信息,请查看 优化通知。
OpenCL 和 OpenCL 标识是苹果公司的商标,需获得 Khronos 的许可方能使用。