OpenVX并发数据对象访问

并发数据对象访问

只有当所有访问都是只读的时,才允许使用映射、复制、读取功能,访问OpenVX数据对象,同时执行正在访问相同数据对象的图形。对于Map,Copy具有只读访问模式,而对于图中的节点,则仅将该数据对象作为输入参数。在所有其他情况下,包括写入或读写模式和写入访问功能,以及将数据对象作为输出的图形节点,应用程序必须保证访问不会与图形执行同时执行。这可以通过在调用vxScheduleGraph或vxProcessGraph前,先调用映射后的un-map来实现。此外,在调用Map、Read、Write或Copy前,应用程序必须在vxScheduleGraph后调用vxWaitGraph,以避免受限的并发访问。如果应用程序未能遵守上述规定,则可能会在未经OpenVX框架通知时,遇到实现定义的行为和/或数据丢失。访问从ROI(vxCreateImageFromROI)创建的图像,或从通道(vxCreateImage FromChannel)创建的图像,必须视为访问整个图像。在这方面,设置属性被视为写入数据对象。

2.2.17扩展 OpenVX

除了用户内核之外,供应商还有其他机制来扩展OpenVX中的功能。这些机制不适用于用户内核。每个OpenVX扩展都有一个唯一的标识符,由大写字母、数字和下划线组成,前缀为KHR_,例如KHR_NEW_FEATURE。

1. 扩展属性

在扩展属性时,供应商必须将其从vx_销售方_ID_e分配的ID与相应的宏一起使用,以使用vx_ATTRIBUTE_BASE创建新属性。为某些对象类型扩展新属性的典型机制(例如vx_ID_TI中的vx_node属性)如下所示:

enum {

   VX_NODE_TI_NEWTHING = VX_ATTRIBUTE_BASE(VX_ID_TI, VX_TYPE_NODE) + 0x0,

};

某些对象支持 API 设置属性,即使它们的所有属性都是 在OpenVX中指定为只读。这些 API 用于扩展属性。

2.自定义内核

将更多内核添加到提供给 OpenVX 的基本集的供应商,提供表单的标题。

#include <VX/vx_ext_<销售方>.h>

包含以下各项的定义。

每个函数的新节点创建函数原型。

/*! \brief [Graph] 这是ISV或OEM提供的一个示例节点,在Graph中执行以调用XYZ内核。

 * \param [in] graph 要在其中实例化节点的图形的句柄。

 * \param [in] input 输入图像

 * \param [in] value 输入标量值

 * \param [out] output 输出图像

 * \param [in,out] temp 每个迭代所需的一些数据的临时数组。

* \ingroup group_example_kernel

 */

vx_node vxXYZNode(vx_graph graph, vx_image input, vx_uint32 value, vx_image output, vx_array temp);

每个函数都有一个新的内核枚举和内核字符串。

#define VX_KERNEL_NAME_KHR_XYZ org.khronos.example.xyz

/*! \brief:XYZ示例库集

 * \ingroup group_xyz_ext

 */

#define VX_LIBRARY_XYZ (0x3) // 由Khronos分配,供应商自主控制的

/*! \brief:内核列表

 * \ingroup group_xyz_ext

 */

enum vx_kernel_xyz_ext_e {

    /*! \brief:用户定义的内核示例 */

    VX_KERNEL_KHR_XYZ = VX_KERNEL_BASE(VX_ID_DEFAULT, VX_LIBRARY_XYZ) + 0x0,

    // 最多可以创建0xFFF内核枚举

};

[可选]每个函数都有一个新的 VXU 函数。

/*! \brief [Immediate] 这是XYZ节点的即时模式版本的一个示例。

 * \param [in] context 实现的总体上下文。

 * \param [in] input 输入图像

 * \param [in] value 输入标量值

 * \param [out] output 输出图像

 * \param [in,out] temp 每个迭代所需的一些数据的临时数组。

 * \ingroup group_example_kernel

 */

vx_status vxuXYZ(vx_context context, vx_image input, vx_uint32 value, vx_image output, vx_array temp);

这应该为扩展的每个新部分提供良好的文档。理想情况下,这些类型的扩展不应要求链接到新对象 以方便使用。

3.供应商自定义扩展

一些扩展会影响基本视觉功能,因此可能对大多数用户不可见。在这种情况下,供应商必须通过上下文上的VX_CONTEXT_extensions属性向基本节点报告支持的扩展。

vx_char *tmp, *extensions = NULL;

vx_size size = 0;

vxQueryContext(context,VX_CONTEXT_EXTENSIONS_SIZE,&size,sizeof(size));

extensions = malloc(size);

vxQueryContext(context,VX_CONTEXT_EXTENSIONS,

               extensions, size);

此列表中的扩展依赖于扩展本身;可以具有,也可以不具有报头和新的内核,或框架特征或数据对象。共同的特点是由实现供应商实现和支持。

 

posted @ 2025-03-05 21:23  吴建明wujianming  阅读(26)  评论(0)    收藏  举报