用户内核
OpenVX支持客户端定义函数的概念,这些函数应作为节点,从图形内部或图形内部执行。这种模式的目的是:
1)进一步利用OpenVX平台内节点的独立操作。
2)允许在OpenVX的其他地方重用组件化功能。
3)将严格的验证要求正式化(即合同编程)。
如图2-6所示,要执行客户端提供的函数,图形不必先暂停,然后再恢复。这些节点应相对于OpenVX中的独立基础节点,以独立的方式执行。如果存在利用此属性的硬件,能实现进一步最小化执行时间。
图2-6 具有用户内核节点的基本图
1.参数验证
用户内核必须通过为其实现的每个视觉功能,提供明确的验证功能来帮助图形验证工作。传递给用户内核的实例化节点的每个参数,都使用客户端提供的验证函数进行验证。客户端必须检查以下属性和/或每个参数的值:
1)必须检查参数的每个属性或值。例如,数组的大小,或在一个范围内的标量的值,或图像的维度约束,如宽度可分割性。一些实现可能有限制,例如图像宽度可以被某个固定数字整除。
2)如果输出参数依赖于输入参数的属性或值,则必须检查这些关系。
3)元格式对象是一个不透明的对象,用于收集有关输出参数的要求,然后OpenVX实现将对其进行检查。客户端必须手动设置要根据输出参数检查的相关对象属性,如维度、格式、缩放等。
2.用户内核命名约定
用户内核必须使用唯一名称和唯一枚举导出。OpenVX的客户端可能使用名称或枚举来检索内核,因此,非唯一名称引起的冲突将导致问题。内核枚举可以通过以下示例进行扩展。
#define VX_KERNEL_NAME_KHR_XYZ "org.khronos.example.xyz"
/*! \简要介绍XYZ示例库集
* \ingroup group_xyz_ext
*/
#define VX_LIBRARY_XYZ (0x3) // 由Khronos分配,供应商控制的
/*! \简要介绍XYZ内核列表
* \ingroup group_xyz_ext
*/
enum vx_kernel_xyz_ext_e {
/*! \简要介绍用户定义内核示例 */
VX_KERNEL_KHR_XYZ = VX_KERNEL_BASE(VX_ID_DEFAULT, VX_LIBRARY_XYZ) + 0x0,
// 最多可以创建0xFFF内核枚举
};
愿景功能或实现的每个供应商,都必须向Khronos申请一个唯一的标识符。在获得唯一ID前,供应商必须使用VX_ID_DEFAULT。
要构造内核枚举,供应商必须同时具有其ID和库ID。库ID完全由供应商定义(但是,当使用VX_ID_DEFAULT ID时,许多库可能会在命名空间中发生冲突)。
一旦定义了两者,就可以使用VX_kernel_BASE宏和偏移量来构建内核枚举。偏移量是可选的,但对于长枚举非常有用。
2.2.11即时模式函数
OpenVX还包含<VX/vxu.h>中定义的接口,允许立即执行视觉功能。这些接口以vxu为前缀,以将它们与Node接口区分开来,Node接口的形式为vx<Name>Node。除了一些例外,这些接口中的每一个都复制一个Node接口。立即模式函数被定义为表现为单节点图,在函数返回后,在图框架内没有泄漏的副作用(例如,没有日志条目)。
2.2.12目标设备
目标指定执行节点或即时模式功能的物理或逻辑设备。这允许在不同的目标上使用视觉功能的不同实现。通过使用定义的API向应用程序共享目标。目标的选择允许对节点的执行位置,进行不同级别的控制。OpenVX实现必须至少支持一个目标。使用适当的枚举指定其他支持的目标。参阅vxSetNodeTarget、vxSetImmediateModeTarget和vx_target_e。OpenVX实现必须至少支持一个目标vx_target_ANY以及vx_target_STRING枚举数。OpenVX实现也可能支持这两个以上的功能,以指示特定设备的使用。例如,一种实现方式可以添加VX_TARGET_CPU和VX_TARGET _GPU枚举,以指示对两个可能的目标的支持,从而将节点分配(或执行即时模式功能)。
可以指示多个目标(例如CPU和GPU)存在的另一种方式,将目标指定为VX_target_STRING并使用字符串CPU和GPU。因此,使用名称而不是枚举数来定义目标。字符串或枚举数的特定命名不受规范强制执行,由供应商记录和传达目标命名。一旦在给定的实现中可用,应用程序可以将目标分配给节点,以指定必须使用API vxSetNodeTarget执行该节点的目标。对于即时模式功能,目标指定将来尝试执行该功能的物理或逻辑设备。当所选目标不支持立即模式功能时,执行将回退到VX_target_ANY。