8.节点执行独立性
在如图2-5所示例中,客户端根据输入图像、梯度幅度和梯度相位。OpenVX并不要求并行运行,但可以由OpenVX供应商实现。
图2-5 具有一些独立节点的简单图形。
构造这种图形的代码,如下所示。
vx_context context = vxCreateContext();
vx_image images[] = {
vxCreateImage(context, 640, 480, VX_DF_IMAGE_UYVY),
vxCreateImage(context, 640, 480, VX_DF_IMAGE_S16),
vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8),
};
vx_graph graph = vxCreateGraph(context);
vx_image virts[] = {
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT),
};
vxChannelExtractNode(graph, images[0], VX_CHANNEL_Y, virts[0]),
vxGaussian3x3Node(graph, virts[0], virts[1]),
vxSobel3x3Node(graph, virts[1], virts[2], virts[3]),
vxMagnitudeNode(graph, virts[2], virts[3], images[1]),
vxPhaseNode(graph, virts[2], virts[3], images[2]),
status = vxVerifyGraph(graph);
if (status == VX_SUCCESS)
{
status = vxProcessGraph(graph);
}
vxReleaseContext(&context); /* 将释放所有内容 */
9.测试验证
OpenVX中的图形在执行前,必须经过严格的验证过程,以满足消除运行时开销(参数检查)的设计理念,从而确保图形的安全执行。OpenVX必须检查(但不限于)这些条件,可得节点参数。
1)每个所需的参数都被提供给节点(vx_parameter_state_e)。可选参数可能不存在,因此在不存在时不进行检查。如果存在,则对其进行检查。
2)节点的每个参数都必须具有正确的方向(vx_direction_e中的值)。
3)节点的每个参数都必须是正确的对象类型(来自vx_type_e的对象范围)。
4)必须验证每个参数属性或值。在标量值时,可能需要对其进行范围检查(例如,0.5≤k≤1.0)。该实现不需要执行标量值的运行时范围检查。如果标量的值在运行时更改为超出范围,则结果是实现定义的。理由是运行时范围检查的潜在性能风险太大,无法强制执行。它仍将在图形验证时作为时间零点健全性进行检查。如果标量是另一个节点的输出参数,则必须将其初始化为合法值。在vxScaleImageNode时,输入图像大小与输出图像
大小的关系,决定了缩放因子。必须在每个平台上,检查数据对象的这些值或属性的兼容性。
5)图连接性-vx_Graph必须是有向无循环图(DAG)。不允许循环或反馈。vx_delay对象被设计为显式地处理Graph执行之间的反馈。
6)虚拟数据对象的解析-虚拟数据对象从未指定格式,或维度到特定格式,或维度的任何更改,以及在处理时,可观察到的特定类型对象的相关创建,都发生在验证时。
除非参数值设置为NULL,否则,实现必须在节点创建时,检查所有节点参数的类型是否正确。还可以对非NULL参数进行额外的检查。必须允许用户在节点创建时,将参数设置为NULL,即使这些参数是必需的参数,以便创建未在图形执行中使用的示例节点,或增量创建节点。因此,对于显式设置为NULL的参数,实现在节点创建时不得生成错误。但是,在vxVerifyGraph过程中,实现必须检查所有必需的参数,是否为非NULL和正确的类型。在vxVerifyGraph过程中,也可以进行其他更复杂的检查。该实现应在vxVerifyGraph期间,提供NULL参数的特定错误报告,例如,Node<Node>的Parameter<Parameter>为NULL。
2.2.9回调
回调是一种控制图形流,并根据完成的工作做出决策的方法。vxAssignNodeCallback调用将回调函数作为参数。此函数将在特定节点执行后,但在图形完成前调用。如果节点被排列成独立的集合,则回调的顺序是未指定的。由于数据依赖性,以串行方式排列的节点,按顺序执行回调。回调函数可以首先使用节点,引用从节点中提取参数,然后提取数据引用。调用回调时,具有回调的节点的数据输出应可用(通过Map/Unmap/Copy方法)。