前言halide是用c++++作为宿主语言的一个图像处理相关的dsl(domain specified language)语言,
前言
halide是用c++++作为宿主语言的一个图像处理相关的dsl(domain specified language)语言,全称领域专用语言。主要的作用为在软硬层面上(与算法本身的设计无关)实现对算法的底层加速,我们有必要对其有一定的了解。因为不论是传统的图像处理方法亦或是深度学习应用都使用到了halide的思想。
其中,在OpenCV(传统图像处理库)中部分算法使用了Halide后端,而TVM(神经网络编译器)也是用了Halide的思想去优化神经网络算子。
那么Halide到底是干嘛用的,看上面那张图,同样的一个算法处理(局部拉普拉斯变换),使用直接的C++语言写出来算法速度很慢,Adobe公司使用3个月对这个算法进行了优化(手工优化)使这个算法的速度快了10倍,但是如果你使用了Halide,只需要几行代码,就可以使这个算法比之前普通直接的算法快上20倍。
一句话来说,Halide大大节省了我们手动优化底层算法的时间,让我们只需要关心算法的设计。
Halide为什么可以优化算法Halide的特点是其图像算法的计算的实现(Function和Expression)和这些计算在计算硬件单元上的调度(Schedule)是分离的,其调度以Function为单位。最终将整个图像算法转换为高效率的多层for循环,for循环的分部数据范围划分和数据加载都是由Halide来完成的,而且可以实现数据的加载和算法计算的Overlay,掩盖数据加载导致的延迟。Halide的Schedule可以由程序员来指定一些策略,指定硬件的buffer大小,缓冲线的相关设置,这样可以根据不同的计算硬件的特性来实现高效率的计算单元的调度,而图像算法的计算实现却不需要修改。
决定算法在某个硬件平台上执行时性能的“三角力量”如下。
其中,算法本身的设计是一方面,一个好的算法往往效率会高很多。而另外一个方面就是算法中计算顺序的组织,而Halide可以改变的就是我们算法在某个硬件平台上的计算顺序:
其中Halide可以在硬件平台上为算法实现并行和良好的缓存一致性:
举个例子我们以Halide中的经典模糊化(blurred)图像的例子来演示一下(以下代码也可以在自己的电脑上测试观察结果),这里用OpenCV来对图像进行操作进行演示:
首先我们设计一个可以对图像进行模糊的操作函数:
代码语言:javascript代码运行次数:0运行复制// in为输入原始图像 blury为输出模糊后的图像void box_filter_3x3(const Mat &in, Mat &blury){ Mat blurx(in.size(), in.type()); for(int x = 1; x (y, x) = static_cast登录后复制( (in.at (y, x-1) + in.at (y, x) + in.at (y, x+1)) / 3); for(int x = 0; x (y, x) = static_cast ( (blurx.at (y-1, x) + blurx.at (y, x) + blurx.at (y+1, x)) / 3);}
菜鸟下载发布此文仅为传递信息,不代表菜鸟下载认同其观点或证实其描述。
版权投诉请发邮件到 cn486com#outlook.com (把#改成@),我们会尽快处理
Copyright © 2019-2020 菜鸟下载(www.cn486.com).All Reserved | 备案号:湘ICP备2022003375号-1
本站资源均收集整理于互联网,其著作权归原作者所有,如有侵犯你的版权,请来信告知,我们将及时下架删除相应资源