openvx 6: 高级框架API

本文详细介绍了OpenVX的高级API,包括Node Callbacks、Performance Measurement、Log、User Kernels和Graph Parameters。Node Callbacks允许在节点执行后调用回调函数,Performance Measurement提供了性能测试接口,Log用于调试日志,User Kernels支持用户自定义内核,而Graph Parameters则涉及图参数的设置。文章还探讨了这些功能的工作原理和使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是一些被认为是高级操作的api介绍,包括:

1 Framework:Node Callbacks(节点回调)

允许在特定节点执行完毕后去调用回调函数;无法保证节点完成后立即执行回调,回调旨在使用返回值为视觉图创建简单的提前退出条件;设置回调的示例如下:

vx_graph graph = vxCreateGraph(context);
status = vxGetStatus((vx_reference)graph);
if (status == VX_SUCCESS) {
    vx_uint8 lmin = 0, lmax = 0;
    vx_uint32 minCount = 0, maxCount = 0;
    vx_scalar scalars[] = {
        vxCreateScalar(context, VX_TYPE_UINT8, &lmin),
        vxCreateScalar(context, VX_TYPE_UINT8, &lmax),
        vxCreateScalar(context, VX_TYPE_UINT32, &minCount),
        vxCreateScalar(context, VX_TYPE_UINT32, &maxCount),
    };
    vx_array arrays[] = {
        vxCreateArray(context, VX_TYPE_COORDINATES2D, 1),
        vxCreateArray(context, VX_TYPE_COORDINATES2D, 1)
    };
    vx_node nodes[] = {
        vxMinMaxLocNode(graph, input, scalars[0], scalars[1], arrays[0], arrays[1], scalars[2], scalars[3]),
        /// other nodes
    };
    status = vxAssignNodeCallback(nodes[0], &analyze_brightness);
    // do other
}

若像上面这样建图时注册了回调,那么回调函数将会在图执行期间被调用。

#define MY_DESIRED_THRESHOLD (10)
vx_action analyze_brightness(vx_node node) {
    // extract the max value
    vx_action action = VX_ACTION_ABANDON;
    vx_parameter pmax = vxGetParameterByIndex(node, 2); // Max Value
    if (pmax) {
        vx_scalar smax = 0;
        vxQueryParameter(pmax, VX_PARAMETER_REF, &smax, sizeof(smax));
        if (smax) {
            vx_uint8 value = 0u;
            vxCopyScalar(smax, &value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
            if (value >= MY_DESIRED_THRESHOLD) {
                action = VX_ACTION_CONTINUE;
            }
            vxReleaseScalar(&smax);
        }
        vxReleaseParameter(&pmax);
    }
    return action;
}

回调必须返回一个vx_action,图会依据此返回值进行相应的操作:

  • 如果VX_ACTION_CONTINUE返回,则图将无任何变换的继续执行

  • 如果VX_ACTION_ABANDON返回,然后停止图的执行。仅执行将该节点作为支配者的节点(原文为:“execution is unspecified for all nodes for which this node is a dominator. Nodes that are dominators of this node will have executed. Execution of any other node is
    unspecified.” 感觉像是仅继续执行这个node的copy)

带回调的执行序列如图:

 很明显看到,就是特定节点执行之后会调用回调,只有回调执行完毕之后,才会依据返回值的类型继续执行图;

相关的枚举:

enum vx_action_e {
    //继续执行
    VX_ACTION_CONTINUE = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x0,
    
    //停止图执行
    VX_ACTION_ABANDON = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x1,
};

相关函数:

vx_status vxAssignNodeCallback(
                                        vx_node node,
                                        vx_nodecomplete_f callback);
将回调函数分配特定的节点,若已经有回调,返回错误;可以通过传递NULL清除已分配的回调
vx_nodecomplete_f vxRetrieveNodeCallback(
                                        vx_node node);
检索当前在节点上设置的回调函数的指针

必须回调执行完毕之后才能继续执行图,图的性能可能会受到影响,所以必须谨慎的使用回调。

2 Framework: Performance Measurement(性能评估)

用来进行性能测试和报告的接口;在openvx中,vx_graph和vx_node对象都有对应的性能信息,可以通过查询函数来获得vx_per_t中的任意一个性能:

vx_perf_t perf;
vxQueryNode(node, VX_NODE_PERFORMANCE, &perf, sizeof(perf));

统计的性能包含:

typedef struct _vx_perf_t {
    //最后一次测量时间
    vx_uint64    tmp;

    //一组测量中的开始时间
    vx_uint64    beg;

    //一组测量中的结束时间
    vx_uint64    end;

    //执行时间的总和
    vx_uint64    sum;

    //执行时间的平
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值