Halide示例学习一

Halide简介 Halide是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全称领域专用语言。主要的作用为在软硬层面上(与算法本身的设计无关)实现对算法的底层加速,我们有必要对其有一定的了解。因为不论是 传统的图像处理方法亦或是深度学习应用 都使用到了halide的思想。 来自 https://www.codercto.com/a/67796.html ... 阅读详情

示例学习

基本变量和概念

// 使用Halide,我们只需要包含Halide.h这个头文件就可以了
#include "Halide.h"
#include <stdio.h>

int main(int argc, char **argv) {
    // Halide::Func代表了一个计算图,代表了每一个像素值需要进行的计算操作
    Halide::Func gradient;
    // Halide::Var代表了一个变量名,需要跟Func配合使用才有意义
    Halide::Var x, y;
    // Halide::Expr代表一个表达式,可由变量的数学表达式组合成
    Halide::Expr e = x + y;
    // 现在使用左值等式接口,再计算图上添加表达式
    gradient(x, y) = e;
    // 上述写法等同如下
    //
    //   gradient(x, y) = x + y;
    //
    // 上述只是在定义计算图,没有进行实际的运算
    // 以下的语句在实际运行计算图,同事得到结果保存在output中
    Halide::Buffer<int32_t> output = gradient.realize({800, 600});
    // 以下是检查代码
    for (int j = 0; j < output.height(); j++) {
        for (int i = 0; i < output.width(); i++) {
            if (output(i, j) != i + j) {
                printf("Something went wrong!\n"
                       "Pixel %d, %d was supposed to be %d, but instead it's %d\n",
                       i, j, i + j, output(i, j));
                return -1;
            }
        }
    }
    printf("Success!\n");
    return 0;
}
# 运行结果如下所示:
Success!

操控图片操作

#include "Halide.h"
// 为了能够加载png图片而引入的库
#include "halide_image_io.h"
using namespace Halide::Tools;

int main(int argc, char **argv) {

    // 该程序主要是进行图像的过曝操作,提高亮度
    // 加载图像
    Halide::Buffer<uint8_t> input = load_image("../../images/rgb.png");

    Halide::Func brighter;
    Halide::Var x, y, c; // 多维度的图像
    // 第一个表达式
    Halide::Expr value = input(x, y, c);
    // char--->fp32
    value = Halide::cast<float>(value);
    // 乘以1.5进行提高亮度
    value = value * 1.5f;
    // 然后截断在255以内
    value = Halide::min(value, 255.0f);
    // 最后fp32--->char
    value = Halide::cast<uint8_t>(value);
    // 最后组成计算图
    brighter(x, y, c) = value;
    // 以上操作也跟下面的语句同样的效果
    //
    // brighter(x, y, c) = Halide::cast<uint8_t>(min(input(x, y, c) * 1.5f, 255));
    //
    // 下述命令进行计算图的计算
    Halide::Buffer<uint8_t> output =
        brighter.realize({input.width(), input.height(), input.channels()});
    // 最后进行output的操作
    save_image(output, "../../result/lesson_02_brighter.png");
    printf("Success!\n");
    return 0;
}

输入图片如下所示:
在这里插入图片描述

输出图片如下所示:
在这里插入图片描述

debug操作1

#include "Halide.h"
#include <stdio.h>
using namespace Halide;

int main(int argc, char **argv) {

    // 为了能够进行更清晰的说明,这里使用string赋值给函数和变量
    Func gradient("gradient");
    Var x("x"), y("y");
    gradient(x, y) = x + y;
    Buffer<int> output = gradient.realize({8, 8});
    // 把计算图的编译过程使用了html来进行展示
    gradient.compile_to_lowered_stmt("../../result/gradient.html", {}, HTML);
    printf("Success!\n");
    return 0;
}

module name=gradient, target=x86-64-linux-avx-avx2-avx512-avx512_skylake-f16c-fma-sse41 {
func gradient(gradient) {
// 判断不是空buffer
assert((reinterpret(gradient.buffer) != (uint64)0), halide_error_buffer_argument_is_null("gradient"))
// 获取主机buffer
let gradient = _halide_buffer_get_host(gradient.buffer)
// 获取buffer类型
let gradient.type = _halide_buffer_get_type(gradient.buffer)
// 获取设备buffer
let gradient.device_dirty = _halide_buffer_get_device_dirty(gradient.buffer)
// 获取buffer维度
let gradient.dimensions = _halide_buffer_get_dimensions(gradient.buffer)
// 获取buffer第0维度的起点
let gradient.min.0 = _halide_buffer_get_min(gradient.buffer, 0)
// 获取buffer第0维度的终点
let gradient.extent.0 = _halide_buffer_get_extent(gradient.buffer, 0)
// 获取buffer第0维度的步长
let gradient.stride.0 = _halide_buffer_get_stride(gradient.buffer, 0)

let gradient.min.1 = _halide_buffer_get_min(gradient.buffer, 1)

let gradient.extent.1 = _halide_buffer_get_extent(gradient.buffer, 1)

let gradient.stride.1 = _halide_buffer_get_stride(gradient.buffer, 1)
// 查看是否在边界
if (_halide_buffer_is_bounds_query(gradient.buffer)) {
_halide_buffer_init(gradient.buffer, _halide_buffer_get_shape(gradient.buffer), reinterpret((uint64)0), (uint64)0, reinterpret((uint64)0), 0, 32, 2, make_struct(gradient.min.0, gradient.extent.0, 1, 0, gradient.min.1, gradient.extent.1, gradient.extent.0, 0), (uint64)0)
}
if (!_halide_buffer_is_bounds_query(gradient.buffer)) {
assert((gradient.type == (uint32)73728), halide_error_bad_type("Output buffer gradient", gradient.type, (uint32)73728))
assert((gradient.dimensions == 2), halide_error_bad_dimensions("Output buffer gradient", gradient.dimensions, 2))
assert((0 <= gradient.extent.0), halide_error_buffer_extents_negative("Output buffer gradient", 0, gradient.extent.0))
assert((0 <= gradient.extent.1), halide_error_buffer_extents_negative("Output buffer gradient", 1, gradient.extent.1))
assert((gradient.stride.0 == 1), halide_error_constraint_violated("gradient.stride.0", gradient.stride.0, "1", 1))
let gradient.total_extent.1 = (int64(gradient.extent.1) * int64(gradient.extent.0))

assert((uint64(gradient.extent.0) <= (uint64)2147483647), halide_error_buffer_allocation_too_large("gradient", uint64(gradient.extent.0), (uint64)2147483647))
assert((abs((int64(gradient.extent.1) * int64(gradient.stride.1))) <= (uint64)2147483647), halide_error_buffer_allocation_too_large("gradient", abs((int64(gradient.extent.1) * int64(gradient.stride.1))), (uint64)2147483647))
assert((gradient.total_extent.1 <= (int64)2147483647), halide_error_buffer_extents_too_large("gradient", gradient.total_extent.1, (int64)2147483647))
assert(!gradient.device_dirty, halide_error_device_dirty_with_no_device_support("Output buffer gradient"))
assert((gradient != reinterpret((uint64)0)), halide_error_host_is_null("Output buffer gradient"))
produce gradient {
    // greadient(x,y)=x+y的计算图的代码构成如下所示
    let t7 = (0 - (gradient.min.1 * gradient.stride.1))

    let t6 = (gradient.min.0 + gradient.min.1)

    for (gradient.s0.y.rebased, 0, gradient.extent.1) {
        let t9 = (((gradient.min.1 + gradient.s0.y.rebased) * gradient.stride.1) + t7)

        let t8 = (gradient.s0.y.rebased + t6)

        for (gradient.s0.x.rebased, 0, gradient.extent.0) {
        gradient[(gradient.s0.x.rebased + t9)] = (gradient.s0.x.rebased + t8)
        }
    }
    //假设是C++代码,那么可以描述如下所示
    /*
    int x_len = 100;
    int y_len = 44;
    int gradient[x_len*y_len] = {};
    int t7 = 0 - 0 * 1;
    int t6 = 0 + 0;
    for(int y_rebased = 0; y_rebased < y_len; y_rebased++){
        int t9 = (0+y_rebased)*1 + t7;//y_rebased
        int t8 = (y_rebased + t6);//y_rebased
        for(int x_rebased = 0; x_rebased < x_len; x_rebased++){
            gradient[x_rebased + t9] = x_rebased + t8;//gradient[x_rebased+y_rebased] = x_rebased+y_rebased
        }
    }
    */
}
}
}
}

Halide编译安装与基本数据结构 Overview Halide是为了在现代计算机上编写更高性能的图像处理代码而设计的一种编程语言。目前只吃的目标为: CPU架构:X86, ARM, MIPS, Hexagon, PowerPC 操作系统:Linux, Windows, macOS, Andriod, IOS, Qualcomm QuRT GPU计算API: CUDA,OpenGL, OpenCL, Apple Metal, Microsoft Direction X 12 Halide不是独立的一种编程语言,而是嵌入在C++中,这 阅读详情

相关推荐

Halide代码优化思想简述

Halide是一种编程语言,主要在图片处理和矩阵计算时具有方便快捷高性能的特点。它不是一种独立语言,而是基于C++的DSL(Domain Specified Language),主要应用在算法的底层加...

csdndevpress0035的博客 518

halide 入门实战(1)

halide 入门实战

czwcc的博客 855

Halide 构建

hello halide 随着人工智能,VR等领域的发展,我们对于高性能图像处理程序的需求越来越大;当前编程工具开发的高性能图像处理程序牺牲了程序的可读性,模块性,可移植性等;其主要原因是,当前程序将算法描述, 数据存储以及计算糅杂在一起。同时手工编写高性能图像处理程序开发效率较低,难以快速构建大量高性能图像处理代码。 在这样的背景下,MIT的研究人员专门为图像处理设计了一种程序语言——Halid...

2Know的博客 1765

快速入门Halide

Halide代码流程: 声明函数,变量,表达式 用变量、表达式等实现算法 使用调度策略对算法进行调度调优 调用函数的realize成员函数,对函数进行实现 写出数据 example 1: Halide::Func gradient; // Func对象表示了一个pipeline阶段。它是一个纯函数,定义了每个像素点对应的值。 Halide::Var x, y; // Var对象是Func的定义域,或者说是Func的参数。它们本身没有任何意义。Var用来索引 Halide::Expr e = x

Time_remember的专栏 1290

windows安装Halide

https://github.com/halide/Halide/releases 下载Halide压缩包,解压 添加环境变量,C:\Opencv3.4\halide\Debug;C:\Opencv3.4\halide\Release ①Linker>general>Adiditional Library Directories release C:\lib\halide\Releas...

勉強 1711

使用Halide后端提高OpenCV效率的方法

通过上述步骤,我们成功地在OpenCV中启用了Halide后端,并使用Halide后端进行了高斯滤波操作。通过上述步骤,我们成功地在OpenCV中启用了Halide后端,并使用Halide后端进行了高斯滤波操作。通过使用Halide后端,你可以进一步优化和并行化你的图像处理算法,以实现更高的性能。通过使用Halide后端,你可以进一步优化和并行化你的图像处理算法,以实现更高的性能。要启用OpenCV的Halide后端,首先确保已经正确安装了OpenCV和Halide,并配置了正确的编译环境。

PixelNovaO的博客 314

halide编程技术指南(连载一)

本文已同步至公众号,欢迎关注。 Halide是一种编程语言,使得在现代机器上编写高性能图像和数组处理代码更加容易。Halide支持如下的平台: CPU体系结构:X86,ARM,MIPS,Hexagon,PowerPC 操作系统:Linux,Windows,macOS,Android,iOS,Qualcomm QuRT GPU计算API:CUDA,OpenCL,OpenGL,...

Aoulun的博客 2105

OpenCV如何启用Halide后端以提高效率

OpenCV如何启用Halide后端以提高效率如何启用Halide后端以提高效率介绍要求LLVM编译器Halide语言使用Halide后端构建OpenCV将Halide设置为首选后端 如何启用Halide后端以提高效率 介绍 本教程指导如何使用Halide语言后端在OpenCV深度学习模块中运行模型。Halide是一个开源项目,可以让我们以易于阅读的格式编写图像处理算法,根据特定设备安排计算时间,并以相当高的效率对其进行评估。 要求 LLVM编译器 LLVM编译可能需要很长时间。 从http://relea

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1006

Halide学习

目的:在现代机器上完成高性能的图像处理。 编译器目标:x86/SSE, ARM V7/NEON, CUDA, Native Client, OpenCL, and Metal. 大致流程:用Halide::Var, Halide::Expr, Halide::Func类型的对象完成c++程序,然后调用Halide::Func::compile_to_file来生成对象文件和头文件。或者调用Halide::Func::realize即时编译(JIT)并即刻运行整套pipeline,这有利于测试小的程序。

u011994454的博客 742

Unity URP项目里Post Processing死活没效果?别慌,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果失效的五大常见问题,包括渲染管线配置冲突、Volume作用域误判、摄像机参数漏配、Layer层级冲突和Profile引用异常。通过实际项目案例和代码示例,提供专业级解决方案,帮助开发者快速排查并修复后处理效果不生效的问题。

weixin_33721427的博客 333

ODrive0.5.5源码分析(1) ADC的处理

odrive 0.5.5 ADC

danger的博客 4307

为Halide安装opencl支持

打开TargetOpenCL开关,我们可以看到使用opencl进行推理的时候,计算时调用的openclapi是如何的。展示的测速结果如下所示,这里可以看出来,虽然都是使用了cpu进行计算,但是还是intel-cpu-opencl速度更快些。compile_jit进行处理操作。查看主机平台支持的设备平台。设置kernel参数。...

Pengcode的博客 715

CAN总线BusOff恢复机制详解:快慢恢复策略在车载网络中的实战应用

本文深入解析了CAN总线BusOff恢复机制,重点阐述了快慢恢复策略在车载网络中的工程应用。通过对比NXP S32K与STM32平台的实现代码,并结合CANoe仿真与参数优化方法,为工程师提供了从理论到实战的完整解决方案,旨在提升车载网络的可靠性与功能安全。

7up55的博客 614

Halide示例学习二

Halide的调度实操以及说明

Pengcode的博客 587

别再手动填序号了!用Python脚本在Arcgis属性表里实现分组自动编号(附完整代码)

本文详细介绍了如何利用Python脚本在Arcgis属性表中实现分组自动编号,告别低效的手工操作。通过核心代码解析和实战教程,帮助GIS工程师快速掌握自动化编号技术,提升工作效率并降低错误率。特别适合城市规划、国土调查等需要处理大量分组数据的场景。

weixin_42532473的博客 307

SAP SLT DMIS 2018_1_752 究竟是什么意思?

把读懂,并不需要背太多编号。你只要记住:它就是DMIS 2018发行线里、面向的那一档组件版本,承载SLT 3.0的功能集。面向项目落地,要点就是三件事:看清平台基线、对齐DMIS支持包、走官方安装与补丁路径。如此,S/4到HANA,抑或S/4到BigQuery的复制链路,都会变得既稳定又可维护。DMIS 2018是新技术发行,基于,覆盖SLT全场景(SAP Learning)。DMIS_2018的安装与下载路径、通过SAINT安装的官方步骤(Installation Guide PDF)。源系统与。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

Halide示例学习四

Halide示例学习四多阶段计算图多计算图组合示例compute_at使用方法store_root配合compute_at使用方法tile配合compute_at使用方法compute_at和store_at以及之前的混合技使用方法 多阶段计算图 #include "Halide.h" #include <stdio.h> using namespace Halide; int main(int argc, char **argv) { Var x("x"), y("y");

Pengcode的博客 437

下载猫 —— 会员体系安全分析与加固方案

下载猫的会员验证体系完全失效,破解不需要任何工具链、不需要写代码、不需要改文件。已验证的成功攻击路径:攻击者启动软件时加一个参数,然后用 3 行 JavaScript 即可将会员状态改为"有效期至 2099 年",全部功能闸门放行。等价于普通用户按F12打开控制台输入 3 行代码,全程不到 10 秒。项目结论破解难度⭐ 极低(会按 F12 即可,无需任何破解工具)是否修改文件否(重启软件自动恢复)是否需要服务器否是否影响其他用户单人即可完成,可复制分发修复所需工作量。

猫敷雪 42

Halide示例学习五

Halide示例学习四函数重定义操作RDom下标使用使用RDom计算直方图调度函数更新多阶段重定义操作使用归化函数进行模糊操作内置的归化函数sum使用归约函数的一个复杂例子 函数重定义操作 #include "Halide.h" #include <stdio.h> using namespace Halide; int main(int argc, char **argv) { Var x("x"), y("y"); Buffer<uint8_t> input

Pengcode的博客 520

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1717

【二.图像处理核心技术】【5.形态学操作:腐蚀/膨胀/开闭运算】

想象一下,你拍了一张布满雪花点的老照片,或者扫描了字迹断裂的文档,这时候形态学操作就是你的像素整形师!它们能让模糊的边界变清晰,把断裂的笔画连起来,甚至从X光片里揪出癌细胞。今天我们要聊的,是计算机视觉界的"广场舞双雄"——腐蚀和膨胀。这俩操作就像给像素点们请了个健身教练,要么集体减肥(腐蚀),要么组团增肌(膨胀)。下次当你用美颜相机时,不妨会心一笑——这看似魔法的背后,正是形态学在默默耕耘。腐蚀的规则很简单:如果一个像素点周围的邻居不全白,它就"狗带"(变黑)。:先用砂纸打磨(腐蚀),再喷漆填补(膨胀)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 425

Halide示例学习三

Halide示例学习三改变维度遍历起点多计算图组合示例 改变维度遍历起点 #include "Halide.h" #include <stdio.h> using namespace Halide; int main(int argc, char **argv) { Func gradient("gradient"); Var x("x"), y("y"); gradient(x, y) = x + y; gradient.trace_stores();

Pengcode的博客 296

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何为 Halide 后端安排网络

介绍我们使用的每台设备都是一样的卤化物代码。但是为了达到令人满意的效率,我们应该正确地安排计算。在本教程中,我们将介绍在 OpenCV 深度学习模块中使用 Halide 后端调度网络的方法。为了更好地理解 Halide 调度,您可能需要阅读教程 @。如果这是你第一次在 OpenCV 中与 Halide 会面,我们建议从开始。配置文件您可以通过编写文本配置文件来计划卤化物管道的计算。这意味着您可以轻松地矢量化、并行化和管理层计算的循环顺序。

2301_81888214的博客 927

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

(深度学习优化大师)TVM的前辈,介绍下什么是HALIDE

在开始学习之前推荐大家可以多在FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。 前言 前几天又用到了TVM,想着是否能够间接替代TensorRT作为GPU服务器部署的一个后端。TensorRT在自家的GPU上确实强大,也是老黄家重点关照的”开源项目“。但TensorRT还是有一点点小缺点的: 经过infer优化后的模型与特定GPU绑定,...

iFlyAI的博客 3284

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Halide源码编译

Halide源码编译Halide为何要源码编译?源码编译LLVM库源码编译Halide测试Halide是否编译成功生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Halide   Halide 算是一种编程模式,主要用于在现代机器上来进行高性能的图像和数组处理。其寄生在C++编程语言中,作为DSL编程语言(特定域语言)来实现高

Pengcode的博客 1942

Halide编程

免责申明:本文所用的材料来自于网络,仅供个人学习和交流之用。如果用作其他用途,那么请自行承担法律负责。 Halide是一种特定领域的编程语言(DSL),专门用于加速图像处理,当前已支持x86 SSE,ARM v7 NEON,CUDA,OpenCL等。Halide的主要特点在于分开算法描述和调度描述。一个算法的Halide算法描述不依赖于硬件,其调度描述使用并行化、向量化(SIMD指令)和处理本地化(block)等函数(为便于表述,本文使用了原语),通过这些原语的某种特定组合,使得算法描述可在选定的硬件计算平

serpentine的博客 633
上一篇: Unix进程的学习
下一篇: Halide示例学习二
慷仔
博客等级 码龄9年 88粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值