Halide示例学习一

  • 示例学习
    • 基本变量和概念
    • 操控图片操作
    • debug操作1

示例学习

基本变量和概念

// 使用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--->fp32value = Halide::cast<float>(value);// 乘以1.5进行提高亮度value = value * 1.5f;// 然后截断在255以内value = Halide::min(value, 255.0f);// 最后fp32--->charvalue = 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_rebasedint t8 = (y_rebased + t6);//y_rebasedfor(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示例学习一相关推荐

  1. Halide示例学习五

    Halide示例学习五 函数重定义操作 RDom下标使用 使用RDom计算直方图 调度函数更新 多阶段重定义操作 使用归化函数进行模糊操作 内置的归化函数sum 使用归约函数的一个复杂例子 函数重定义 ...

  2. webpack 占位符_通过示例学习Webpack:占位符图像模糊

    webpack 占位符 by Kalalau Cantrell 通过Kalalau Cantrell 通过示例了解Webpack:占位符图像模糊 (Learn Webpack by Example: ...

  3. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)

    作者:CHAITANYA SINGH 来源:通过示例学习Java编程(14):Java中的构造函数-方家话题 构造函数是用来初始化新创建的对象的代码块.构造函数类似于java中的实例方法(Instan ...

  4. @value 静态变量_Java中的变量——通过示例学习Java编程(4)

    作者:CHAITANYA SINGH 来源: 通过示例学习Java编程(4):Java中的变量-方家话题​www.koofun.com 变量是用来存放可以更改的值的容器.例如,当我写int i = 1 ...

  5. OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize()

    OpenCV示例学习(七):离散傅里变换(DFT)算子:getOptimalDFTSize(),copyMakeBorder(),magnitude(),log(),normalize() #incl ...

  6. OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse()

    OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse() #include <opencv2/opencv.hpp>usi ...

  7. 多示例学习 MIL(multiple instance learning) 理解

    多示例学习举例:假如一段视频由很多张图组成,假如10000张,那么我们要判断视频里是否包含某一物体,比如气球.单张标注每一帧是否有气球太耗时,通常人们看一遍说这个视频里是否有气球,就得到了多示例学习的 ...

  8. 大道至简----多示例学习与注意力机制的巧妙结合

    大道至简----多示例学习与注意力机制的巧妙结合 谈谈<Attention-based deep multiple instance learning> ICML 2018 分享一篇十分简 ...

  9. 多示例学习(Multi Instance Learning)和 弱监督学习(Weakly Supervised Learning)

    目录 弱监督: 多示例学习: 弱监督: 1. 弱在缺标签:标签是不完全的,有的有标签,有的无标签 2. 弱在标签不准确:有的标签正确,有的标签错误 3. 弱在标签不精准: 标签不是在样本上,而是在更高 ...

最新文章

  1. 更改VMWare 虚拟机的硬件设置
  2. HDFS伪分布式环境搭建
  3. Struts2依赖的JAR包
  4. 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
  5. Spring Boot————简介与Spring时代的承接
  6. Linux-Ubuntu下设置ufw防火墙
  7. python保持登录状态_Python-保持登录状态进行接口测试
  8. [POJ2096] Collecting bugs
  9. 系统测试(学习笔记)
  10. biostarhandboo(三)|本体论和功能分析
  11. 信息奥赛一本通1196:踩方格
  12. C# .NET实现扫描识别图片中的文字
  13. android短信接收器的实现,可以实现自动填写短信验证码功能
  14. 写的不错的家庭关系的文章,转自天涯。《2》
  15. WPFLoading遮层罩
  16. 硬件大厂技术一面题目
  17. SkyWalking调研与初步实践
  18. (四)u-boot2013.01.01 for s5pv210:《mkconfig分析》
  19. 云计算机服务英文翻译,基于云的服务,Cloud Based Service,音标,读音,翻译,英文例句,英语词典...
  20. android日历信息获取错误,flutter对android的日历数据相关操作

热门文章

  1. 新AlphaGo首度揭秘:单机运行,4个TPU,算法更强
  2. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略
  3. 医学图像分割之Attention U-Net
  4. uIP中国的协议文件:Ch01
  5. JAVA常见面试题(下)
  6. QQ浏览器X5内核问题汇总 转
  7. UBUNTU 16.04无线网卡驱动
  8. IOS单例模式及单例模式的优缺点
  9. ls一1测距仪说明书_生产力小工具 篇一:激光测距靠谱吗?杜克LS-1激光测距仪开箱测评...
  10. karaf常用命令纪录