Halide 入门教程第1讲:熟悉Funcs,Vars和Exprs

2024-03-19 16:32

本文主要是介绍Halide 入门教程第1讲:熟悉Funcs,Vars和Exprs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

// Halide tutorial lesson 1: Getting started with Funcs, Vars, and Exprs
// Halide入门教程第一课:了解Funcs(函数),Vars(变量)和Exprs(表达式)
// This lesson demonstrates basic usage of Halide as a JIT compiler for imaging.
// 本课演示了Halide作为图像处理JIT compiler(即时编译器)的一些基本用法// On linux, you can compile and run it like so:
// 在linux操作系统上,你可以按照如下方式进行编译和运行
// g++ lesson_01*.cpp -g -I ../include -L ../bin -lHalide -lpthread -ldl -o lesson_01 -std=c++11
// LD_LIBRARY_PATH=../bin ./lesson_01// On os x:
// g++ lesson_01*.cpp -g -I ../include -L ../bin -lHalide -o lesson_01 -std=c++11
// DYLD_LIBRARY_PATH=../bin ./lesson_01// If you have the entire Halide source tree, you can also build it by running
// 如果你有整个Halide代码树,你可以按照如下方式进行编译
//    make tutorial_lesson_01_basics
// in a shell with the current directory at the top of the halide
// source tree.// The only Halide header file you need is Halide.h. It includes all of Halide.
// Halide.h包含了整个Halide, 只需要include这个头文件即可#include "Halide.h"// We'll also include stdio for printf.#include <stdio.h>int main(int argc, char **argv) {// This program defines a single-stage imaging pipeline that
// outputs a grayscale diagonal gradient.// A 'Func' object represents a pipeline stage. It's a pure function that defines what
// value each pixel should have. You can think of it as a computed image.
// Func对象表示了一个pipeline stage(一级流水线。一个较为完整的图像处理系统,可看成
//为一条流水线。流水线中的每一个处理模块,为一级流水线)。它是一个纯函数,定义了每
// 个像素点对应的值。可以理解为计算出的图像。Halide::Func gradient;// Var objects are names to use as variables in the definition of a Func.
// They have no meaning by themselves.
// Var对象是Func定义域中的变量名,或者说是Func的参数。它们本身没有意义。Var用来
//索引函数(图像)对应的像素点,如:Halide::Var x, y;// We typically use Vars named 'x' and 'y' to correspond to the x
// and y axes of an image, and we write them in that order. If
// you're used to thinking of images as having rows and columns,
// then x is the column index, and y is the row index.
// x和y分别对应着图像的x轴和y轴,x对应的是列索引,y对应着行索引
// -------------> x axes
// |
// |
// |
// v
// y axes// Funcs are defined at any integer coordinate of its variables as
// an Expr in terms of those variables and other functions.
// Here, we'll define an Expr which has the value x + y. Vars have
// appropriate operator overloading so that expressions like
// 'x + y' become 'Expr' objects.
// 函数定义在整数坐标处,函数值是变量和其他函数的表达式Expr的结果。
// 在此我们定义了一个 x + y的表达式。变量重载了算数运算符,使得变量运算的结果
// 为一个Expr对象,如Halide::Expr e = x + y;// Now we'll add a definition for the Func object. At pixel x, y,// the image will have the value of the Expr e. On the left hand// side we have the Func we're defining and some Vars. On the right// hand side we have some Expr object that uses those same Vars.// 现在我们将给函数对象一个定义的实现。在像素点坐标(x,y)处,图像的像素值
//为表达式e的值。
// 表达式左边是我们正在定义的函数对象和一些变量位于,表达式的右边是一些
//使用相同变量的Expr对象。// gradient(x, y) = e 相当于在(x,y)处的像素值是表达式x+y的运算结果。gradient(x, y) = e;// This is the same as writing:////   gradient(x, y) = x + y;//// which is the more common form, but we are showing the// intermediate Expr here for completeness.// That line of code defined the Func, but it didn't actually// compute the output image yet. At this stage it's just Funcs,// Exprs, and Vars in memory, representing the structure of our// imaging pipeline. We're meta-programming. This C++ program is// constructing a Halide program in memory. Actually computing// pixel data comes next.// 上述几行代码定义了Func,但实际上并没有计算输出图像。在这个阶段,它仅仅
//是代表我们的图像流水线级的内存中的函数、表达式和变量。
// 我们在进行元编程。C++程序正在内存中构造Halide程序。实际上进行像素数据
// 计算的在下一阶段进行。// Now we 'realize' the Func, which JIT compiles some code that// implements the pipeline we've defined, and then runs it.  We// also need to tell Halide the domain over which to evaluate the// Func, which determines the range of x and y above, and the// resolution of the output image. Halide.h also provides a basic// templatized image type we can use. We'll make an 800 x 600// image.// 在此,我们‘实现’(realize)前一个阶段定义的Func,即时编译器编译我们定义的实现流水线级的代码,然后运行。
// 我们需要告诉Halide在指定的图像域(domain)内进行Func计算(这里的域可以理解为一幅图像内指定的一个窗口)。domain决定了前面定义的x,y变量的范围,输出图像的分辨率等。
// Halide.h提供了可供使用的一些基本的图像类型模板。// 在此,我们将生成一幅800x600的图像。Halide::Buffer<int32_t> output = gradient.realize(800, 600);// Halide does type inference for you. Var objects represent// 32-bit integers, so the Expr object 'x + y' also represents a// 32-bit integer, and so 'gradient' defines a 32-bit image, and// so we got a 32-bit signed integer image out when we call// 'realize'. Halide types and type-casting rules are equivalent// to C.// Halide能够进行数据类型推断。Var对象为32位(有符号)整数,则Expr对象x+y也是32位整数(理论上应该是33位整数),// 因此,gradient定义了一幅32位的图像。在我们调用了realize之后,得到一幅32位有符号整数图像输出。// Halide的类型转换规则和C语言的类型转换一致。// Let's check everything worked, and we got the output we were expecting:for (int j = 0; j < output.height(); j++) {for (int i = 0; i < output.width(); i++) {// We can access a pixel of an Buffer object using similar// syntax to defining and using functions.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;}}}// Everything worked! We defined a Func, then called 'realize' on// it to generate and run machine code that produced a Buffer.printf("Success!\n");return 0;}

 

这篇关于Halide 入门教程第1讲:熟悉Funcs,Vars和Exprs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826603

相关文章

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

Weex入门教程之3,使用 Vue 开发 Weex 页面

环境安装 在这里简略地介绍下,详细看官方教程 Node.js 环境 Node.js官网 通常,安装了 Node.js 环境,npm 包管理工具也随之安装了。因此,直接使用 npm 来安装 weex-toolkit。 npm 是一个 JavaScript 包管理工具,它可以让开发者轻松共享和重用代码。Weex 很多依赖来自社区,同样,Weex 也将很多工具发布到社区方便开发者使用。

Weex入门教程之2,Android Studio安装Weex插件

插件位置及描述 https://plugins.jetbrains.com/idea/plugin/8460-weex 貌似对windows还不是很支持,先放着吧。 安装 插件功能 先预览下都有什么功能 安装完成Weex插件后,如果在main toolbar找不到这些功能图标,那么就需要手动添加到main toolbar 添加到main toolbar 红框内就是

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

Python简单入门教程helloworld

Python 学习资源 推荐书籍: Python核心编程(第二版) (强烈推荐,建议有一定基础的看,或者看完简明Python教程再看) Python 基础教程 第二版 (入门,没有核心编程好,但也不错) 编写高质量代码:改善Python程序的91个建议 (进阶,有一定基础再看) 书籍下载: Python 教程(部分内容来源于网络, 历时一年多总结整理的,给刚刚入门的

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片 卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据 全连接层 —进行分类 输出层 —输出分类概率 4、基于LeNet

【2024最新】Python入门教程(非常详细)从零基础入门到精通,看完这一篇就够了!

前言 本文罗列了了python零基础入门到精通的详细教程,内容均以知识目录的形式展开。 第一章:python基础之markdown Typora软件下载Typora基本使用Typora补充说明编程与编程语言计算机的本质计算机五大组成部分计算机三大核心硬件操作系统 第二章:编程语言的发展史和第一个Python程序 文件的概念计算机内部数据原理编程语言发展史编程语言的分类python解释器版

TestNG 入门教程

阅读目录 TestNG介绍在Eclipse中在线安装TestNG在Eclipse中离线安装TestngTestNG最简单的测试TestNG的基本注解TestNG中如何执行测试使用testtng.xml 文件执行 case TestNG按顺序执行CaseTestNG异常测试TestNG组测试TestNG参数化测试TestNG忽略测试TestNG 依赖测试TestNG测试结果报告   Test

Weex入门教程之,关注weex-toolkit命令变更

由于weex的版本处于快速迭代中,我们需要时刻关注其变动,因为weex可能修复了某些bug或新增了一些功能。 关注链接:  原码链接:https://github.com/weexteam/weex-toolkit  发布链接:https://www.npmjs.com/package/weex-toolkit 或者使用帮助命令查看 Microsoft Windows [版本 10.0.10

神仙级AI大模型入门教程(非常详细),从零基础入门到精通,从看这篇开始!

一.初聊大模型 1.为什么要学习大模型? 在学习大模型之前,你不必担心自己缺乏相关知识或认为这太难。我坚信,只要你有学习的意愿并付出努力,你就能够掌握大模型,并能够用它们完成许多有意义的事情。在这个快速变化的时代,虽然新技术和概念不断涌现,但希望你能静下心来,踏实地学习。一旦你精通了某项技术,你就能够用它来实现自己的目标,甚至可能找到理想的工作或完成具有挑战性的项目。 在众多的技术中,大模型