本文是halide编程技术指南第一更,作为引子。后面的章节会陆续更新。

公众号:麻瓜智能

Halide是一种编程语言,使得在现代机器上编写高性能图像和数组处理代码更加容易。Halide支持如下的平台:

CPU体系结构:X86,ARM,MIPS,Hexagon,PowerPC

操作系统:Linux,Windows,macOS,Android,iOS,Qualcomm QuRT

GPU计算API:CUDA,OpenCL,OpenGL,OpenGL计算着色器,Apple Metal,Microsoft Direct X 12

Halide并不是独立的编程语言,而是嵌入在C ++中。 这意味可以像编写c++代码一样编写halide代码,然后,可以将该表示形式编译为目标文件,或对其进行JIT编译并在同一过程中运行。

如果你想用普通的CPU做加速,又不想去优化算法,那么halide将是非常优秀的选择。唯一要做的,就是把算法用halide重写一遍即可。而且,halide重写的算法,就跟你正常理解的是完全一样的,不需要拐弯抹角。这在图像处理中非常有用。

笔者使用halide已经一年有余了,觉得很有必要对其做个介绍,尤其是使用方法的介绍。Halide的英文教程可以参考:

https://halide-lang.org/tutorials/tutorial_introduction.html

API可以参考:

https://halide-lang.org/docs/

但是,对于初学者来说,知道怎么用,然后去看API才是重点。

笔者针对官方教程做定向翻译,难懂的地方再加标注。最后手把手教你写一个图像高斯模糊的halide程序。如果你觉得中文的就是垃圾,可以去参考英文的原版。

第一章 基本定义

如果想用halide,只需要包含<halide.h>这个头文件即可。

#include "Halide.h"

当然,在halide中,也可以包含C语言的头文件。例如包含<stdio.h>,使用printf函数

#include <stdio.h>

我们用一个main函数来展开。

int main(int argc, char **argv) {// 这个主函数定义了一个图像处理通道,用于获得灰度图像的对角梯度// 'Func'对象代表一个处理管道,它规定了每个像素因该是怎么样的数据,可以理解为就是一幅处理后的图。例如opencv中的cv::matHalide::Func gradient;// ‘Var’对象实际上就是类型,就像我们常说的int,float等。它本身是没有任何含义的。Halide::Var x, y;// 我们用x和y来表示图像的x轴和y轴,按照我们处理图像的惯常思维,x就是图像列的索引,y就是图像行的索引。// 就这些变量和其他函数而言,Func在其变量的任何整数坐标处定义为Expr。 在这里,我们将定义一个Expr,其值为x + y。 Var具有适当的运算符重载,因此“ x + y”之类的表达式成为“ Expr”对象。可以理解为表达式,或数学函数。Halide::Expr e = x + y;// 现在我们为’Func’对象gradient进行定义。在x,y像素处,图像的像素值是Expr e的值。在等式的左边,就是我们定义的Func gradient对象和Vars变量x,y,在等式的右边就是用相同的Vars x,y定义的Expr e对象,gradient(x, y) = e;// 同样可以写为://   gradient(x, y) = x + y;// 这是更为一般的形式,但是为了完整起见,在此显示中间量Expr e。// 该行代码定义了Func,但实际上并没有计算输出图像。在此阶段,内存中只有Funcs,Exprs和Vars,代表了我们成像管道的结构。我们正在元编程。这个C ++程序正在内存中构造一个Halide程序。而真正的像素数据计算紧随其后。// 现在我们“实现” Func,JIT编译一些代码以实现我们定义的管道,然后运行它。我们还需要告诉Halide评估Func的域,该域确定上述x和y的范围以及输出图像的分辨率。Halide.h还提供了我们可以使用的基本模板图像类型。例如,我们生成一个800 x 600的图像,就需要定义一个域,也就是一个模板buffer<int32_t>。Halide::Buffer<int32_t> output = gradient.realize(800, 600);// Halide确实为您键入推断。Var对象代表32位整数,因此Expr对象'x + y'也代表32位整数,因此'gradient'定义了32位图像,因此当出现以下情况时,我们得到了32位有符号整数图像 我们称之为“实现”。halide类型和类型转换规则等效于C。// 下面这个是验证程序,以期上面的结果跟下面展开的结果是一样的。for (int j = 0; j < output.height(); j++) {for (int i = 0; i < output.width(); i++) {// 我们可以使用类似的语法来定义和使用函数,来访问Buffer对象的像素。if (output(i, j) != i + j) {printf("Something went wrong!n""Pixel %d, %d was supposed to be %d, but instead it's %dn",i, j, i+j, output(i, j));return -1;}}}// 一切正常! 我们定义了一个Func,然后在其上调用“ realize”以生成并运行产生Buffer的机器代码。(暂且不说)printf("Success!n");return 0;
}

编程指南_halide编程技术指南(连载一)相关推荐

  1. Go 开发关键技术指南 | Go 面向失败编程 (内含超全知识大图)

    作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注"阿里巴巴云原生"公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的 ...

  2. 超实用编程技术指南!为什么你还学不会一门编程语言?

    还在继续开发Growth(Github: https://github.com/phodal/growth)的路上,很多功能似乎已经趋于完善,有些功能也让我百玩不厌--如最近添加的规则引擎.接着我开始 ...

  3. XML编程经验――LIBXML2库使用指南

    C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...

  4. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书."    ...

  5. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!...

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书." -- ...

  6. Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)

    作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 Go 开发关键技术指南文章目录: 为什么你要选择 Go? Go 面向失败编程 带着服务器编程金刚经走进 2020 年 敢问路在何方? Go 开发指南大图 ...

  7. 树莓派 cuda加速_【技术指南】 UL for Linux 树莓派数据采集

    简介 树莓派®是一款基于Linux®内核操作系统的单片计算机,可轻松连接至外部设备,包括显示器.鼠标.键盘以及MCC数据采集设备.低于人民币300元的树莓派提供了一种注重性价比的数据采集方案.通过使用 ...

  8. 网内计算:可编程数据平面和技术特定应用综述

    网内计算:可编程数据平面和技术特定应用综述 摘要--与云计算相比,边缘计算提供了更靠近终端设备的处理,降低了用户体验的延迟.最新的In-Network Computing范例采用可编程网络元素在数据达 ...

  9. TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书

    作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...

最新文章

  1. 奖学金申请 | 2019年清华-青岛数据科学研究院​“RONG”奖学金申请通知
  2. [实变函数]4.4 依测度收敛
  3. DevOps简单介绍
  4. 前端学习(1881)vue之电商管理系统电商系统之双层for循环渲染数据
  5. oracle 时间集合,oracle 日期函数集合(集中版本)第2/2页
  6. oracle mysql分页语句怎么写,sqlserver ,mysql,oracle 语句实现分页
  7. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和
  8. Windows下Apache架站务实
  9. NoSQL数据库之国产开源产品:SequoiaDB 分析前言
  10. 比较两个字符串相同的个数,并输出
  11. 欧姆龙cp1h指令讲解_OMRON CP1H脉冲指令说明总结
  12. 高等数学学习笔记——第五十七讲——平面与直线的位置关系
  13. 深度学习 个人理解使用余弦相似度对人脸图片识别的过程
  14. Latex 图像、表格标题(题注)加脚注
  15. 正交试验法生成测试用例工具PICT
  16. 重装系统win10步骤和教程,win10怎么自己重装系统
  17. 格鲁夫给经理人的第一节课读书笔记
  18. 麦氏细菌浊度分析仪的校准物质选择
  19. matlab a律非均匀量化,均匀量化和A律PCM非均匀量化实验.doc
  20. 浅谈Attention机制

热门文章

  1. 本地项目推送到码云私有仓库
  2. 【360开源】Quicksql——更简单,更安全,更快速的跨数据源统一SQL查询引擎
  3. 一个快速排序 和 直接插入排序 的简单 c程序
  4. elasticsearch集群选举源码解析
  5. jstree中文api文档_还在用 Swagger(丝袜哥)生成接口文档?我推荐你试试它。。。...
  6. 分布式锁 分布式系统
  7. Lucene 与 Elastic
  8. go项目中使用makefile文件
  9. 阿里云centos镜像地址以及个发行版本说明
  10. PHP CURL模拟POST提交XML数据