OpenVX代码优化裁减简介

OpenVX代码优化裁减简介

 

在OpenVX中,裁减(Reduction)是一种操作,它对数组或图像中的元素执行聚合操作。这里的“裁减”是指将大型数组或图像减少到单一数值的过程。

OpenVX提供了几种不同的裁减操作,包括求和(Summation)、平均(Average)、最小值(Minimum)、最大值(Maximum)和累加器(Accumulator)。

以下是一个简单的例子,展示了如何在OpenVX中使用求和操作:

#include <VX/vx.h>

 

vx_status example_reduction(vx_context context) {

    // 创建图像

    vx_image src = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8);

 

    // 定义一个累加器来存储结果

    vx_scalar sum = vxCreateScalar(context, VX_TYPE_UINT32, &vx_false_value);

 

    // 创建裁减节点

    vx_reduction node_sum = vxCreateVirtualReduction(

        vxGetContext((vx_reference)src),

        VX_REDUCE_SUM, // 指定求和操作

        VX_TYPE_UINT32, // 指定输出数据类型

        vx_true_value); // 指定初始值,对于求和操作,通常设置为0

 

    // 添加图像和累加器作为裁减节点的输入和输出

    vxAddReductionNode(

        node_sum, // 裁减节点

        (vx_reference)src, // 输入图像

        NULL, // 可选的窗口和比例参数,这里不使用

        (vx_reference)sum // 输出累加器

    );

 

    // 运行图形,这里需要实现图形运行的逻辑

    // ...

 

    // 清理资源

    vxReleaseImage(&src);

    vxReleaseScalar(&sum);

    vxReleaseReduction(&node_sum);

 

    return VX_SUCCESS;

}

在这个例子中,我们创建了一个图像和一个累加器,然后定义了一个求和的裁减节点,并将它们加入到图形执行引擎中。注意,实际的图形执行需要更多的代码,这里只是展示了如何创建和配置裁减节点。

这只是一个简化的例子,实际的OpenVX图形执行需要更多的错误检查和资源管理。在应用程序中,通常需要调用vxStartvxWait来启动和等待图形的执行。

 


 

Matrix Access Example

    const vx_size columns = 3;

    const vx_size rows = 4;

    vx_matrix matrix = vxCreateMatrix(context, VX_TYPE_FLOAT32, columns, rows);

    vx_status status = vxGetStatus((vx_reference)matrix);

    if (status == VX_SUCCESS)

    {

        vx_int32 j, i;

#if defined(OPENVX_USE_C99)

        vx_float32 mat[rows][columns]; /* note: row major */

#else

        vx_float32 *mat = (vx_float32 *)malloc(rows*columns*sizeof(vx_float32));

#endif

        if (vxCopyMatrix(matrix, mat, VX_READ_ONLY, VX_MEMORY_TYPE_HOST) == VX_SUCCESS) {

            for (j = 0; j < (vx_int32)rows; j++)

                for (i = 0; i < (vx_int32)columns; i++)

#if defined(OPENVX_USE_C99)

                    mat[j][i] = (vx_float32)rand()/(vx_float32)RAND_MAX;

#else

                    mat[j*columns + i] = (vx_float32)rand()/(vx_float32)RAND_MAX;

#endif

            vxCopyMatrix(matrix, mat, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);

        }

#if !defined(OPENVX_USE_C99)

        free(mat);

#endif

    }

Image Access Example

Images and Array differ slightly in how they are accessed due to more complex memory layout requirements.

 

    vx_status status = VX_SUCCESS;

    void *base_ptr = NULL;

    vx_uint32 width = 640, height = 480, plane = 0;

    vx_image image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);

    vx_rectangle_t rect;

    vx_imagepatch_addressing_t addr;

    vx_map_id map_id;

    rect.start_x = rect.start_y = 0;

    rect.end_x = rect.end_y = PATCH_DIM;

    status = vxMapImagePatch(image, &rect, plane, &map_id,

                                &addr, &base_ptr,

                                VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);

    if (status == VX_SUCCESS)

    {

        vx_uint32 x,y,i,j;

        vx_uint8 pixel = 0;

        /* a couple addressing options */

        /* use linear addressing function/macro */

        for (i = 0; i < addr.dim_x*addr.dim_y; i++) {

            vx_uint8 *ptr2 = vxFormatImagePatchAddress1d(base_ptr,

                                                         i, &addr);

            *ptr2 = pixel;

        }

        /* 2d addressing option */

        for (y = 0; y < addr.dim_y; y+=addr.step_y) {

            for (x = 0; x < addr.dim_x; x+=addr.step_x) {

                vx_uint8 *ptr2 = vxFormatImagePatchAddress2d(base_ptr,

                                                             x, y, &addr);

                *ptr2 = pixel;

            }

        }

        /* direct addressing by client

         * for subsampled planes, scale will change

         */

        for (y = 0; y < addr.dim_y; y+=addr.step_y) {

            for (x = 0; x < addr.dim_x; x+=addr.step_x) {

                vx_uint8 *tmp = (vx_uint8 *)base_ptr;

                i = ((addr.stride_y*y*addr.scale_y) /

                      VX_SCALE_UNITY) +

                    ((addr.stride_x*x*addr.scale_x) /

                      VX_SCALE_UNITY);

                tmp[i] = pixel;

            }

        }

        /* more efficient direct addressing by client.

         * for subsampled planes, scale will change.

         */

        for (y = 0; y < addr.dim_y; y+=addr.step_y) {

            j = (addr.stride_y*y*addr.scale_y)/VX_SCALE_UNITY;

            for (x = 0; x < addr.dim_x; x+=addr.step_x) {

                vx_uint8 *tmp = (vx_uint8 *)base_ptr;

                i = j + (addr.stride_x*x*addr.scale_x) /

                    VX_SCALE_UNITY;

                tmp[i] = pixel;

            }

        }

        /* this commits the data back to the image.

         */

        status = vxUnmapImagePatch(image, map_id);

    }

    vxReleaseImage(&image);

Array Access Example

Arrays only require a single value, the stride, instead of the entire addressing structure that images need.

 

        vx_size i, stride = sizeof(vx_size);

        void *base = NULL;

        vx_map_id map_id;

        /* access entire array at once */

        vxMapArrayRange(array, 0, num_items, &map_id, &stride, &base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);

        for (i = 0; i < num_items; i++)

        {

            vxArrayItem(mystruct, base, i, stride).some_uint += i;

            vxArrayItem(mystruct, base, i, stride).some_double = 3.14f;

        }

        vxUnmapArrayRange(array, map_id);

Map/Unmap pairs can also be called on individual elements of array using a method similar to this:

 

        /* access each array item individually */

        for (i = 0; i < num_items; i++)

        {

            mystruct *myptr = NULL;

            vxMapArrayRange(array, i, i+1, &map_id, &stride, (void **)&myptr, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);

            myptr->some_uint += 1;

            myptr->some_double = 3.14f;

            vxUnmapArrayRange(array, map_id);

        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708580.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IMX6ULL Linux内核网络驱动修改

IMX6ULL 网络驱动修改 主要修改arch/arm/boot/dts/imx6ul-14x14-evk.dtsi设备树文件即可,修改方式和u-boot的设备树修改一致。 硬件电路设备树修改 需要修改的设备树位置:arch/arm/boot/dts/imx6ul-14x14-evk.dtsi 增加复位引脚信息 从上面的原理图可知网口1使用的复位引脚是G…

SpringCloud(1)-Eureka相关配置

1.新建Module-注册中心作为注册中心 1.1配置 pom.xml <!-- 引入 eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>1…

FPGA笔记[2]-拨码开关控制LED灯

使用四个拨码开关的异或逻辑亮灯控制LED灯亮灭.摘要 使用四个拨码开关的异或逻辑亮灯控制LED灯亮灭. 关键信息系统macOS 14.4.1,Apple Silicon M2 开发板:Sipeed-Tang-Primer-20k FPGA芯片:GW2A-LV18PG256C8/I7(GW2A-18C-PBGA256) 工具链:YosysHQ/oss-cad-suite原理简介 LUT4简…

stm32f103c8t6 HAL库更改中断向量表(app部分)

打开HAL库工程的system_stm32f1xx.c文件 /* 注意:以下向量表地址必须与链接器一致定义配置。*//*!< 如果需要重新定位向量表,请取消注释以下行 在 Flash 或 Sram 中的任何位置,否则向量表将保持在自动状态 重新映射选择的启动地址 *//* #define USER_VECT_TAB_…

向web服务器下载文件

web服务器向客户端发送文件 Web服务器读取一个文件的二进制数据,把这组二进制数据发送个客户端,服务器发送给客户端的HTML文档的本质也是二进制。客户端使用以下代码读文件 response = urllib.request.urlopen(url + "?" + urllib.parse.quote(fileName)) data = …

Delphi TMSMQTT使用笔记

服务端用的是 mosquitto ,下载地址https://mosquitto.org/download/ 安装完成后需要配置 找到安装目录:mosquitto.conf,打开后修改 allow_anonymous false(禁止匿名登录),password_file D:\Program Files\mosquitto\pwfile.example(密码存放位置) 创建新用户,安装目录…

沪锡

沪锡要想牛市 必须要突破这里286700 要不然就是ABC反弹结束了。 小周期 反弹还有最后一个3-5 然后迎来回调 然后等待看是什么级别的回调。

产业园区开发运营及盈利模式分析

摘 要:产业园区一般由政府或企业开发建设,是区域经济和产业发展的重要空间载体,具有显著的资源集聚能力和产业规模效益,承担着产业要素集聚、新型产业培育、经济高质量发展和新型城镇化建设等重要使命。然而,当前国内部分产业园区因前期开发投入规模大、后期招商及运营管理…

使用Github Actions + Watchtower 实现项目CI/CD

使用Github Actions + Watchtower 实现项目CI/CD 前言 对于我们这种个人开发者,将程序部署在服务器上一般都是通过宝塔部署来确保服务能够一直存活,但是对于一个经常改来改去的项目,这是一个非常头疼的事情,需要重复地本地编译-->打开宝塔-->输入账号密码(甚至安全模…

Atcoder 题目选做(三)

Atcoder 题目选做(三)(20/20)推荐阅读:#5、#7、#11、#13、#15、#18、#19\(\text{By DaiRuiChen007}\)1. [ARC152E] Xor Annihilation Problem Link给 \(2^n-1\) 个动点,权值为 \(1\sim 2^n-1\) 的排列,对于每个点,设其左右两边所有点权异或和分别为 \(L,R\),那么他会向…

铁矿石 短线

周初要关注893一线阻力 ABC调整结构会出现 30分钟周期: