halide 入门实战(1)
简介
MIT计算机科学和人工智能实验室(CSAIL)的研究人员开发了一门名为“ Hlaide”的新的编程语言,旨在更高效的编写高性能,可移植性强的图像或者向量处理语言。它是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全程领域专用语言。Halide设计的核心思想是将算法的内容和算法的执行耦,这样程序员可以根据不同的设备设置不同的优化策略,获得更高质量的代码。[英文教程](https://halide-lang.org/tutorials/tutorial_introduction.html)[API查询](https://halide-lang.org/docs/)[源码编译](https://github.com/halide/Halide)
特性
1.运行模式
JIT模式
JIT模式使用起来比较方便,可以直接将算法和Halide的代码生成generator封装成一个类,在程序的其他部分调用这个类即可。
AOT模式
在嵌入式环境和交叉编译环境下一般使用AOT模式,此时需要调用compiler函数将算法代码和Halide的代码生成generator编译位目标机器的代码,生成一个.o目标文件和.h头文件。然后在独立的目标机器的应用的工程的源代码中通过头文件调用算法实现的计算函数,并在build的时候链接上.o文件,这样就得到一个可以在目标机器上运行的用Halide实现算法的程序了。
2. 支持平台
- 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。
3. 功能实现
Halide将代码分为Algorithm和Schedule两部分。1. Algorithm部分仅仅描述算法的功能;2. Schedule部分指定算法在何时何处以某种方式进行计算。
4.优化方法
主要使用方法有Reorder(交换)、Split(拆分)、Fuse(融合)、Tile(平铺)、Vector(向量化)、展开(Unrolling)、并行(Parallelizing),集合这些方法可以实现缓存一致性强、并行度高、额外开销少的图像处理程序。
基本语法
Algorithm
Halide::Func 对应图像流水线处理中的一个步骤。这个func定义了一个图像中每一个像素应该是什么值。这里只是一个定义。eg. blur, brighten, harris.
Halide::Var 用于定义func的变量,该专用语言的抽象变量。eg. x, y, c.
Halide::Expr 用于定义一个算术表达式,可以包含Func和Var。包含标准的算术运算法和函数(+,-,*,/,**,sqrt, sin, cos,...)
Halide::cast 强制类型转换。
Halide::min
Halide::Buffer<T>用于定义缓存
Schedule
Reorder(交换)、Split(拆分)、Fuse(融合)、Tile(平铺)、Vector(向量化)、展开(Unrolling)、并行(Parallelizing)。
Debug方式
_.compile_to_lowered_stmt("_.html", {}, HTML): 中间结果生成html预览;trace_stores: 跟踪执行过程;print, print_when:打印变量值;_.print_loop_nest(): 将调度的伪代码打印出来;[更多debug方式](https://halide-lang.org/tutorials/tutorial_lesson_04_debugging_2.html)
实战—示例
void blur3x3_with_halide(const std::string& src_path, const std::string& dst_path)
{//loadHalide::Buffer<uint8_t> input = Halide::Tools::load_image(src_path);const int src_w = input.width();const int src_h = input.height();//checkHalide::Func src_image;src_image = Halide::BoundaryConditions::repeat_edge(input);Func blur_x("blur_x"), blur_y("blur_y");Var x, y, xi, yi;Func src_image_16;src_image_16(x, y) = cast<uint16_t>(src_image(x, y));// The algorithm - no storage or orderblur_x(x, y) = (src_image_16(x - 1, y) + src_image_16(x, y) + src_image_16(x + 1, y));blur_y(x, y) = ((blur_x(x, y - 1) + blur_x(x, y) + blur_x(x, y + 1)) / 9);Func output("output");output(x, y) = cast<uint8_t>(blur_y(x, y));Halide::Buffer<uint8_t> result{ src_w, src_h};// The schedule - defines order, locality; implies storage//result.set_min(1, 1);blur_y.compute_root();blur_y.tile(x, y, xi, yi, 256, 32).vectorize(xi, 8).parallel(y);blur_x.compute_at(blur_y, x).vectorize(x, 8);for (int i = 0; i < 50; i++){int64 start = cv::getTickCount();output.realize(result);std::cout << (cv::getTickCount() - start) * 1000 /(cv::getTickFrequency()) << "[ms]" << std::endl;}Halide::Tools::save(result, dst_path);
}注意:1. Halide::Tools,要使用第三方库等。2. 使用JIT模式,第一次运行耗时较长。
参考文献:
1.https://halide-lang.org/
2.https://zhuanlan.zhihu.com/p/346468141
3.https://www.jianshu.com/p/295351839a2b
4.https://www.freesion.com/article/27311335364/
halide 入门实战(1)相关推荐
- Fastlane 入门实战教程从打包到上传iTunes connect
有关神器 Fastlane 持续集成\部署的文章网上挺多,本文定位是入门教程,针对 iOS 应用的持续部署,只需一条命令就可实现从 Xcode 项目到 编译\打包\构建\提交审核 文章稍微有点长,涵盖 ...
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1 运行环境说明 1.1.1 硬软件环境 l 主机操作系统:Windows 64位, ...
- Gerrit代码Review入门实战
代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略.在实践中,给大家推荐一款免费.开放源代码的代码审查软件Gerri ...
- Spark入门实战系列--5.Hive(下)--Hive实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.Hive操作演示 1.1 内部表 1.1.1 创建表并加载数据 第一步 启动HDFS ...
- python入门新手项目-Python入门实战项目有哪些适合新手?
Python入门实战项目有哪些适合新手?目前市面上有很多适合新手的Python入门练手项目,Python入门需要理论与实践相结合,前面夯实基础知识,后面通过实战项目帮助你更好的运用这些Python知识 ...
- 干货 | 架构师入门实战视频课程(一)
2018-04-04 码农章为忠 <架构师入门实战视频课程> 废话不多说,直接上干货吧 这次先整理了比较初级的视频教程,后续视频会慢慢整理出来. 关注微信公众号,回复相关代码,即可获得相关 ...
- Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫)
Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫) https://blog.csdn.net/u012662731/article/details/78537432 出 ...
- PyTorch 入门实战
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36556893/article/ ...
- Java 定时任务调度(8)--ElasticJob 入门实战(ElasticJob-Lite使用)
ElasticJob 是一个分布式调度解决方案,由 2 个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成.本文主要介绍 ElasticJob-Lite 的 ...
最新文章
- 这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。
- 如何找到文件的家-打开文件对话框openFileDialog
- SAP系统安装技术要求
- HGsoft-downloader
- gpio库_斗牛犬:出奇的快速GPIO库
- 支持向量机SVM的学习笔记
- 关于消息推送,你可以知道这个
- 深度学习中常用的学习率衰减策略及tensorflow实现
- xmind 免费模板链接
- mysql 求和_mysql分组求和
- vbs教程《变量类型》
- jwplayer html插件,jwplayer进阶HTML5
- 别花时间抠图了,赶紧试试这几个免抠图的PNG图片网站!
- 解决onenote同步速度慢问题
- mysql 关闭防火墙 命令_CentOS7关闭防火墙命令
- Linux下切换capslock和control键
- OSSIM开源安全信息管理系统(六)
- 安裝打印機或者掃描器驅動時,出現「unknown device」(不明裝置)的提示,怎麼辦?...
- 神经网络系统理论与实践,神经网络系统理论基础
- 培训班出身的程序员,和科班程序员有什么区别?