首页 > 其他分享 >OpenVX代码优化裁减简介

OpenVX代码优化裁减简介

时间:2024-05-19 09:11:44浏览次数:27  
标签:OpenVX addr stride 裁减 VX 代码优化 base vx id

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);

        }

标签:OpenVX,addr,stride,裁减,VX,代码优化,base,vx,id
From: https://www.cnblogs.com/wujianming-110117/p/18200021

相关文章

  • 关于内存泄漏和代码优化
    最近在用selenium对网页上的数据进行爬取时发现,通过pyinstaller打包成的.exe文件运行时速度越来越慢,通过查找任务管理器里的句柄数,发现可能存在内存泄漏的原因,记录一下关于内存泄漏的处理方法和代码优化1.内存泄漏如果您怀疑代码可能存在内存泄漏,可以尝试跟踪内存分配:这里我用......
  • ffmpeg对视频进行裁减crop
    ffmpeg-i input.mp4 -r 50 -vf crop=800:900:150:200 output.mp4input.mp4:你需要裁减的视频50:裁减之后的视频的帧率crop=800:900:150:200:150:200表示的是从视频的左上角(150,200)这个位置开始对视频进行裁减。其中800表示裁减后的视频的w是800,900表示h。out......
  • 每个程序员都应该了解的内存知识(五): 代码优化
    代码优化多线程优化尽量使用顺序读写因为分支预测的关系,顺序读写通常能够带来更好的性能.共享变量将只读变量和读写变量分离有可能因为缓存行的原因导致读写变量的更新影响到读变量,进而影响了运行速度提升数据的局部性,将一起使用的读写变量分组到一个结构中缓......
  • 计算机编程中的黑魔法编程是什么?如何求解一个浮点数的平方根倒数?计算机中的浮点数是如
    原视频:没有显卡的年代,这群程序员用4行代码优化游戏最原始的求解目标:(求一个浮点数的开方的导数)浮点数在计算机中的表示形式:对数的运算法则:A为a在计算机中的表示形式(二进制表示形式):求浮点数的平方根倒数的应用场景:这个情况,直白的说就......
  • 对CF1904C的代码优化
    https://www.luogu.com.cn/problem/CF1904C分讨,然后\(k=2\)的时候肯定要写暴力,但是我的暴力很不优雅。石山voidsolve(){intn,k;cin>>n>>k;vector<ll>a(n+1);for(inti=1;i<=n;i++)cin>>a[i];if(k>=3){......
  • 使用 Swift 代码优化项目编译速度
    引言软件的性能是评价一个软件质量的重要指标,尤其在今天这个时代,性能已成为大型项目不可或缺的考虑因素之一。对于用户量极大的软件,如网银系统、在线购物商城等,更是必须保证其高效稳定的性能。在这种背景下,优化项目的编译速度就显得尤为重要。本文将介绍如何使用Swift代码优化......
  • 代码优化
    1.搭建minio2.修改后端文件上传接口  在用户添加service中将avatar的值设置为修改上传接口 3.修改不能修改用户名 在添加用户的index.vue中添加账户绑定disable默认值为false,用来控制修改的不能修改用户名   4.上传文件优化把img的地址改为form.avatar......
  • django代码优化全局变量定义
    django代码优化全局变量定义需要根据不同年级的学生肺活量进行分数获取,在根据分数*权重得到最终分数。不同年级权重不同旧代码定义####肺活量,权重0.15calculate_lung_100=100*0.15calculate_lung_95=95*0.15calculate_lung_90=90*0.15calculate_lung_85=8......
  • 嵌入式代码优化技巧
    内存管理技巧1.C/C++工程应尽量避免深拷贝,尽量用浅拷贝(指针或者引用),如果指针需要频繁拷贝,用智能指针是一种不错的选择2.启用内存池管理线程的内存开销,事先在堆里边分配好,然后快速使用避免复杂的浮点运算1.复杂的浮点运算尽量避免,有些芯片是不支持硬件双精度浮点数的,比如全志T3,......
  • Go代码优化
    1、Go语言的if语句允许在条件之前传递一个语句。原始代码:f,contains:=factory[string(token)]ifcontains{//Dosomething}优化:(稍微提高了代码的可读性)iff,contains:=factory[sToken];contains{//Dosomething} ......