前语

前几天又用到了TVM,想着是否能够间接替代TensorRT作为GPU服务器安顿的一个后端。TensorRT在自家的GPU上确实强大,也是老黄家要开源矿工点照料的”开源项目“。但TensorRT仍是有一点点小缺陷的:

  • 经过infer优化后源码怎样做成app软件的模型与特定GPU绑定,例如在1080TI上生成的模型在2080TI上无法运用
  • 高版其他TensorRT依赖于高版其他CUDA版别,而高版其他CUDA版别依赖于高版其他驱动
  • TensorRT尽管好用,但开源是什么意思推理优化infer仍是闭源的,像深度学习炼丹相同,也像个黑盒子,导入模型我缓存视频在手机哪里找们不供认能否顺利转化成功opencv教程。假定不成功,不能直接修改源码,总感觉缺陷什么

以上缺陷单纯吐槽(轻喷轻喷),其实这些问题都不是大问题,假定是自己捣鼓的话问题不大。可是假定放到出产环境中,上面的一些状况或许会构成一些小麻烦(害~毕竟出产环境的条条框框太多了),用起来不是那么得心应手。

不知道什么是TVM开源阅览app下载装置的,能够知乎搜一下,也能够看缓存视频怎样转入本地视频一下我之前写的两篇文章:

  • 一步一步解读神经网络编译器TVM算法规划与剖析(一)——一个简略的比如
  • 一步一步解读神经网络编译器TVM(二)——缓存运用TVM结束C++端的安顿

不过本文不是讨论TVM,除算法是什么了上述两文,也写了其他一些TVM的剖析(算是第三篇第四篇),但自缓存视频兼并app下载己懒加上时刻有时分不可用就没有拾掇,等等拾掇好再发。本文其实是想介绍下自己之前写的Halide一文,与TVM相关,借此机会引入一哈。

什么是Halide

Halide是用C++作为宿主言语的一个图画处理相关的DSL(Domain Specified La缓存视频怎样转入相册nguage)言语,全程范畴专用言语。首要的效果为在软硬层面上(算法剖析的意图是与算法自身的规划无关)结束对算法的底层加快,感觉有必要对其有一定的缓存的视频怎样保存到本地了解。因为不管是传统的图画处理方法亦或是深度学算法工程师习运用都或多或少运用到了hal开源ide的思维。

其间,在OpenCV(传统图画处理库)中部分算法运用了Halide后端,而TVM(神经网络编译器)也是用了Halide的思维去优化神经网络算子。

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

那么Halide到底是干嘛用的,算法是什么看上面那张图,相同的一个算法处理(部分拉普拉斯转化),运用直接的C++言语写出来算法速度很慢,Adobe公司运用3个月对这个算法进行了优化(手工优化)使opencv入门要学多久这个算法的速度快了10倍,可是假定你运用缓存视频怎样转入本地视频了Halide,只需求几行代码,就能够使这个算法比之前一般直接的算法快上20倍

一句话来说,Halide大大节省了咱们手动优opencv人脸辨认算法化底层算法的时刻,让咱们只需求注重算法的规划。

OpenCV算法与底层优化的的进程,Halide帮咱们做了。

Halide为什么能够优化算法

Halide的特征是其图画算法的核算的结束(Function和Exp源码之家ression)和这些核算在核算硬件单元开源阅览app下载装置上的调度(Scheduopencv图画辨认le)是分其他,其调度以Function为单位。最终将整个图画算法转化为高功率的多层for循环,for循环的缓存的视频怎样保存到本地分部数据规划差异和数据加载都是由Halide来结束的,并且能够结束数据的加载和算法核算的Overla开源节流是什么意思是什么y,掩盖数据加载导致的推迟。Halide的S源码本钱chedule能够由程序员来指定一些战略,指定硬件的buffer巨细,缓冲缓存和下载的差异线的相关设置,这样能够根据不同的核算硬件的特性来结束高功算法的时刻复杂度是指什么率的核算单元的调度,而图画算法的核算结束却不需求修改。

上面这部分截取于知乎:www.zhihu.com/ques开源是什么意思tion/29…opencv-python

决议算法在某个硬件平台上实施时功用的“三角力气”如下算法剖析的意图是

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

其间,算法自身的规划是一方面,一个好的算法往往功率会高许多。而其他一个方面便是算法中核算次序的组织,而Halide能够改动的便是咱们算法在某个硬件平台上的核算次序:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

其间Halide能够开源矿工在硬件平台上源码为算开源节流法结束并行和出色的缓存一致性:

举个比如

咱们以Halide中的经典模糊化(blurred)图画的比如来演示一源码下(以下代码也能够在源码之家自己的电脑上检验调查效果),这儿用OpenCV来对图画进行操作进行演示:

首要咱们规划一个能够对图画进行模糊的操作函数:源码怎样做成app软件

// in为输入原始图画 blury为输出算法剖析的意图是模糊后的图画
void box_filter_3x3(const Mat &in, Maopencv装置教程t &blury)
{
Mat算法 bopencv是干什么的lurx(in.size(), in.type());
for(int x = 1; x < in.cols-1; x ++)
for(int y = 0 ; y < in.rows; y ++)
blurx.at<uint8_t &gt缓存;(y, x) = static_cast<uint8_t>(
(in.at<uint8_t >(y, x-1) + in.at<uint8_t >(y, x) + in.at<uint8_t >(y, x+1)) / 3);opencv入门要学多久
for(int x = 0; xopencv装置教程 < in.cols; x ++)
for(int y = 1 ; y < in.rows-1;opencv库 y ++)
blury.at<uint8_t >(y, x) = static算法_cast<uint8_t>(
(blurx.算法剖析的意图是at<ui缓存的视频怎样保存到本地nt8_t >(y-1, x) +opencv是干什么的 blurx.at<uint8_t &gopencv-pythont;(y, x) + blurx.at<uint8_t >(y+1, x)) / 3);
}

对图画模糊操作很简略,咱们首要在x轴上缓存文件在哪里对每个像素点以及周围的两个点进行求和均匀,然后再到y轴进步行算法工程师相同的操作,这样相当于一个3×3均匀卷积核对整个图画进行操作,这儿就不进行具体描绘了。

咱们准备一张(1920,1080)的图画,对其进行100次上述操作opencv-python,并记载时刻,发现Time uopencv装置教程sed:4521.72 ms

然后咱们简略改动一下实施次序,将上述循环嵌套中的x和y的次序改动一下:

Mat blurx(in.开源我国size(), in.type());
// 这儿进行了嵌套的转化
for(int y = 0 ; y < in.rows; y ++)
for(int x = 1; x < in.cols-1; x ++)
blurx.at<uint8_t >(y, x) = static_cast<uint8_t>(
(in.at<uint8_t &g缓存的视频怎样保存到本地t;(y, x-1) + in.at开源&l算法的有穷性是指t;uint8_t >(y, x) + in.at<uint8_t >(y, x+1)) / 3)源码超市;
// 这儿进行了嵌套的转化
for(int y = 1 ; y < in.rows-1; y ++)
for(int算法是什么 x = 0; x < in.cols; x ++源码本钱)
bl开源我国ury.at<uOpenCVint8_t >源码超市(y, x) = static_cast<uint8_t>(
(blopencv是干什么的urx.at<uint8_t >(缓存视频变成本地视频y-1, x) + bl开源urx.at<uint8_t >(y, x) + blurx.a开源矿工t<uint8_t >(y+1, x)) / 3);
}

相同,咱们实施100次并记载缓存的视频怎样保存到本地时刻:发现Time used:3992.35 ms,能够发现下面的模糊操作实施的速度比上面的快一些。当然咱们或许会想,这也没快多少啊。当然这只是一副示例图画, 假定这张图画的长宽距离比较大(例如1:10)、亦或是咱们要某一个时刻处理几万次源码编辑器这样的操作,一旦量级起来,那么这两者的距离就不是一点半算法的时刻复杂度是指什么了。

硬件层面的原理

为什么会这样呢,上述两种操作实施的算法功用是相同的,可是速度为什么会有不同。究其原因,这不同和算法自身没什么联络,而与硬件的规划是有巨大联络,例如并行性和部分性。

咱们能够看到下面是Adobe工程师对上述的算法在硬件层面上极致优化效果,比之前的算法快了10倍,其间用到了SIMD(单指令多数据流)、源码编辑器编程猫下载以及平铺(Tiling)、翻开(Unrolling)和向量化(Vectorizaopencv入门要学多久tion)等常用技能。充分运用了硬件的功用,然后不改动算法自身规划的前提下最大化提高程序实施的速度。

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

官方示例

Halide作为一个DSL,咱们很简单就能够运用它,这儿咱们将其源码下下来并进行编译。结束之后咱们就能够运用它了(这儿省掉编译进程,可自行在官网查阅):

首要咱们引证Halide头文件以及其他的文件。

#include "Halide.h"
#include <stdio.h>
#include <源码编程algorithm&gt算法剖析的两个首要方面是;
using namespace Halide;

初度运算法工程师用Halide之前,首要需求知道halopencv是干什么的ide中的一些语法:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

然后咱们运用Halide界说两个变量,这两个变量源码独自运用时没源码编辑器有任何意义,一起咱们用字符串xy为两个变量起了姓名:开源代码网站github

Var x("x"), y("y");

然后运用Fu源码超市nc 界说一个待实施的function,并起名为gradient

Func gradient("gradient");

这时咱们界说fu源码年代nction中每个点的实施逻辑,关于(x,y)这个算法规划与剖析点实施的逻辑为x + y
其间x和y都是Var,而x + y这个操作在源码本钱赋予给gradi算法的五个特性ent的时分会主动转化为Expr类型,这儿能够理解为将x + y这个代数表达式的逻辑赋予了grad开源阅览app下载装置ient,最终,经过realize函数来实施整个逻辑:

gradient(x, y) = x + y;
// re源码编辑器编程猫下载alize 即为算法导论结束这个操作 到了这一步才会对上述的操作进行编译并实施
Buffer<int> output = gradient.realize(4, 4);

这个逻辑咱们源码年代用C++来标明即为:

for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
printf("Evaluat算法剖析的意图是ing at x = %d, y = %缓存视频兼并d: %dn", x, y, x + y);
}
}

而上述结束的Halide伪代码为:

produce gradient:
for y:
for x:
gradient(...) = ...

Halide默许的核算次序是行优先的,也便是x代表每一行的元素方位,y代表每一列的元素方位:算法的时刻复杂度取决于

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

假定咱们将其间y和x的核算次序换一下:

// 将y的次序提到x之前
gradient.reorder(y, x);

最终的核算进程就为列优先:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

相应的伪代码为:

produce gra源码共享网dient_col_major:
for x:
for y:
gradiopencv库ent_col_major(...) = ...

拆分 Split

咱们能够对每个维度进行拆分,假定咱们依然是行优先核算,可是咱们对x轴进行拆分,开源是什么意思将其拆成一个外循环一个里循环,y轴不进行改变:

Var x_outer, x_inner;
gradient.split(x, x_outer, x_inner, 2);源码之家

这时对应的C++代码结束为:

for (int y = 0; y < 4; y++)开源阅览app下载装置 {
for (int x_outer = 0; x_outer < 2缓存的视频怎样保存到本地; x_outer++) {
for (int x_in缓存视频在手机哪里找ner = 0; x_inner < 2; x_inner++) {
int x = x_outer缓存和下载的差异 * 2 + x_opencv人脸辨认算法inner开源阅览app下载装置;
printf("Evaluating at x = %d, y = %d: %dn", x, y, x + y);
}
}
}

交融 fuse

或许咱们不进行拆分,对开源阅览x和y两个轴进行交融:

Var fused;
gradiopencv是干什么的ent.fuse(x, y, fused);

此时对应的C++结束代码为:

for (int fuse开源众包d = 0; fused < 4*4; fused++) {
int y = f缓存的视频怎样保存到本地used / 4;
int x = fused % 4;
printf("Evaluating at x = %d, y = %d: %dn"源码年代, x, y, x开源阅览app下载装置 + y);
}

可是要知道,上述拆分和交融操作只是对Halide所能进开源是什么意思行的操作进行一下演示而是,这种操作方法并没有实践用处,也便是说实践中的核算次序并没有改动

平铺 tile

这一步中就要算法的时刻复杂度是指什么进入Halide中比较重要的部分了,这一步中咱们将x和y轴以4为因子距离进行差异,并且从头对核算的途径进行重排序:

Var x_outer, x_inner, y_outer, y_inner;
gradient.split(x算法工程师, x_outer开源节流是什么意思是什么, x_inner, 4);
gradient.split(y, y_outer, y_inner, 4);
gradient.reorder(x_inner, y_inner, x_outer, y_outer);
// 上面的进程其实能够简化成
g算法的有穷性是指radient.tile(x, y, x_outer, y_outer,开源矿工 x_inner开源节流, y_inner, 4, 4)算法的五个特性;

对应的C++核算代码为:

for (int y_outer = 0; y_outer &lt算法; 2; y_源码编程outer++) {
for (int x_outer = 0; x_outer < 2; x_outer++) {
foropencv人脸辨认算法 (int y_inner = 0; y_inner < 4; y_inner++) {
for (i开源代码网站githubnt x_inner = 0; x_inner < 4; x_inner++) {
int x = x_outer * 4 + x_inner;
int y = y_outer * 4 + y_inner;
printf("Evaluating at x = %d, y =算法 %d: %dn", x, y, x + y);
}
}
}
}

可视化一下便是这个姿态(留神这儿的示例巨细为(8,8)):

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

这种平铺的优点是能够充分运用相邻的像素,例如模糊操作,咱们会运用堆叠的输入数据(也便是存在一个元素运用两次的状况),假定选用这种核算方法开源众包源码编辑器能够大大加快核算功用。

向量化 vector

向量化即咱们运算法的时刻复杂度是指什么用cpu中的SIMD技能,一次性源码编程核算多个数据,充分运源码怎样做成app软件用硬件的特征,例如在x86中咱们能够运用SSE技能来结束这开源阅览个功用。

在Halide中,咱们首要将x轴的循环嵌套依照,内侧循环因子4的方法,拆分为两个(也便是内侧循环x实施四次,外侧根据总数进行核算,下例是2*4=8),然后将内侧的x循环转化为向量的方法:

Var缓存视频变成本地视频 x_开源outer, x_inner;
gradient.split(x, x_outer, x_inner, 4);
gradient.vectorize(x_inner);

用C++来标明即为:

for (int y = 0; y < 4; y++) {
for (算法是什么int x_outer = 0; x_outer < 2; x_outer++) {
// The loop over x_inner has gone away开源阅览, and has been
// rep算法的时刻复杂度取决于laced by a vectorized version of the
// expression. On x86 processors, Halide generates SSE
// for all of this.
int x_vec[] = {x_outer *opencv是干什么的 4 + 0,
x_outer * 4 + 1,
x_outer * 4 + 2,
x_outer * 4 + 3};
int val[] = {x_vec[0] + y,
x_vec[1] + y,
x_vec[2] + y缓存视频兼并,
x_vec[3] + y};
printf("Evaluating at <%d, %d, %d,opencv装置教程 %d>, <%算法导论d, %d, %d, %d>:"
" <%d, %d, %d, %算法的有穷性是指d>n",
x_veopencv教程c[0], x_v算法剖析的两个首要方面是ec[1], x_vec[2opencv入门要学多久], x_vec[3],
y, y, y,源码编辑器手机版下载 y,
val[0], val[1], val[2], val[3]);
}
}

可视化后就比较明显了,外部x每一行实施两次,内侧x变为向量的方法,一个指令opencv调用摄像头集就能够实施结束:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

翻开 unrolling

假定在图画中多个像素一起同享有堆叠的数据,opencv入门要学多久这个时分咱们就能够将循环翻开,然后使那些能够同享运用的数据只核算一次亦或是只加载一次。

在下面中咱们将x轴拆分为内侧和外侧,因为每次内侧的数值增加都是从0到1,假定咱们将内测循环的x轴翻算法导论开,就不缓存视频怎样转入本地视频需求每次循环到这儿再读取内测循环的x的值了:

Var x_outer, x_inner;
gradient.split(x, x_outer, x_inner, 2);
gradopencv装置教程ient.unroll(x_inner);

相应的C++代码为:

printf("Equivalent C:n");
for (int y = 0; y < 4; y++) {算法剖析的意图是
for (int x_outer = 0; x_outer < 2; x_outer++) {
// Instead of a for l缓存视频oop over x_inner, we get two
// copies of the innermost statement.
{
int x_inner = 0;
int x = x_outer * 2 + x_缓存inner;
prin缓存视频在手机哪里找tf("Evaluating at x = %d, y = %d: %dn", x, y, x + y);
}
{
int x_inner = 1;
int x = x_outer * 2 + x_inner;
printf("Evaluating at x = %d, y = %d: %dn", x, y, x + y);
}
}
}

交融、平铺、并行 Fusing, tiling, and parallelizing

这一步中,咱们将交融、平铺和并行操作都交融到一起,来对一个8×8的图画进行操作。首要,咱们将x轴和y轴都依照4因子进行平铺操作。随后我开源是什么意思们将外侧的y和外侧的x轴循环进行交融(2+2=4),再将这个交融后的操作进行并行操作,也就算法导论是一起实施这四个缓存视频兼并(2+2=4)操作:

Var x_outer, y_oute算法的五个特性r, x_inner, y_inner, tile_index;
gradient.源码编辑器编程猫下载tile(x, y, x_outer, y_outer, x_inner, y_inner, 4, 4);
gradient.f源码本钱use(x_oute算法导论r, y_outer, tile_index);
gradient.parallel(tile_index);

相应的C++代码为:

// This outermost loop should be a parallel fopencv装置or loop, but that's hard in C.
foropencv库 (int t算法规划与剖析ile_index = 0; tile_index < 4; tile_index++开源节流是什么意思是什么) {
int y_outer = tile_i开源众包ndex / 2;
int x_outer = tile_index % 2;
for (int y_inner = 0; y_inner < 4; y_inner++) {
for (int x_inner = 0; x_inner < 4; x_inne开源阅览app下载装置r++) {
int y =算法的五个特性 y_outer * 4 +源码共享网 y_inneropencv人脸辨认算法;
int x = x_outer * 4 + x_inner;
printf("Evaluating at x = %d, y = %d: %dn", x, y, x + y);
}
}
}

可视化后的效果,能够看到8×8中左上、左下、右上、右下四个区域是简直一起进行的(tile_index),而每个缓存视频怎样转入本地视频区域和之前tile那源码本钱一节的核算方法是相同的,只不过这次换成了并行核算:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

整合

这次来点大点的图画,咱们输入的图源码怎样做成app软件像巨细为350 x 250,对其进行最优化源码编程的操作:缓存

首要咱们将其依照64算法规划与剖析 x 64的因子进行平铺,其次交融y轴和x轴外侧的循环操作数,最终对其进行并行操作
(这儿留神下,咱们能够看到350或算法许250并不能被64整除,这个不用忧虑,Halide会主动处理剩余或许不算法的五个特性可的部分)。

Var x_outer, y_outer,缓存视频怎样转入本地视频 x_inn开源er, y_inner, tile_in源码编辑器dex;
gradient_fast
.tile(x, y, x_outer, y_outer, x_inner, y_inne源码编辑器手机版下载r, 64, 64)
.fuse(x_outer, y_ou源码编辑器编程猫下载ter, tile_index)
.parall开源代码网站githubel(算法规划与剖析tile_index);
// 能够这样接连运用.写,因为政策函数回来源码年代的是政策自身的开源节流引证

这样还不可,上面咱们现已将整个图画平铺为6*4个部分,而这一步中对每个平铺后的部分再进行一次平铺操作,这次将每个小块依照4×2的方法平铺为,其间y_inner_outer分红两个(每个为y_pairs),x_inner_outer分红算法规划与剖析四个(每个为x_vectors),然后将每个x_vecto开源rs并行化,将y_pairs翻开。

Var x_inner_outeropencv装置, y_inner_outer, x_vectors, y_pairs;算法的时刻复杂度是指什么
gradient_fast
.tile(x_inner, y_inne源码r, x_inner_outer, y_inner_out缓存视频变成本地视频er, x_vectors, y_pairs, 4, 2)
.vectorize(x_vectors)
.unroll(y缓存和下载的差异_pairs);

以下可视化的效果为:

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

对应的c++展现代码为:

for (i缓存视频变成本地视频nt tile_index = 0; tile_index < 6 * 4; tile_index++) {
int y_outer = tile_index / 4;
int x_outer = tile_index % 4;
for (int y_inner_outer = 0; y_inner_outer &开源我国lt; 64/2; y_inner_outer++) {
for (int x_inner_outer = 0; x_inner_outer < 64/4;opencv调用摄像头 x_inner_o源码本钱uter++) {
// We're vectorized across x
int x = std::min(x_outer * 64, 350-64) + x_inner_outer*4;
int x_vec[4] = {x + 0,
x + 1,
x + 2,
x + 3};
// And we unopencv-pythonrolled across y算法工程师
int y_base = std::min(y_outer * 64, 250-64) + y_算法是什么inner_outer*缓存视频变成本地视频2;
{
// y_pairs = 0
int y = y_base + 0;缓存
int y_vec[4] = {y, y, y,算法 y};
int val[4] = {x_vec[0] + y_vec[0],
x_vec[1] + y_vec[1],
x_vec[2] + y_vec[2],
x_vec[3] + y_vec[3]};
// Check the result.
for (int i = 0; i < 4; i++)算法的有穷性是指 {
if (result(x_vopencv装置教程ec[i], y_vec[i]) != val[i]) {
printf("There was an error at %d %d!n",
x_vec[源码年代i], y_vec[i]);
return -1;
}
}
}
{
// y_pairs = 1
int y = y_base + 1;
int y_vec[4] = {开源矿工y, y, y, y};
int val[4] = {x_vec[0] + y_vec[0],
x_vec[1] + y_vec[1],
x_vec[2] + y_vec[2],
x_vec[3] + y_vec[3]};
// Check the result.
for (int i = 0; i < 4; i++) {
if (result(x_vec[i], y_vec[i]) != val[i]) {
printf("开源软件There was an error at %d %d!n",
x_vec[i], y_v算法导论ec[i]);
return -1;
}
}
}
}
}
}

到这儿Hal算法规划与剖析ide中的基本操作就介绍结束了。

还有一点

哦,对了,假定用Halide来写opencv教程文章一开始描绘的模糊(blur)算法的话,会是这个姿态算法的时刻复杂度是指什么

Func blur_3x3(Func input) {
Func blur_x, blur_y;
Var x, y, xi, yi;
// The algorithm - no storage or order
blu源码怎样做成app软件r_x(x, y) = (iopencv装置nput(x-1, y) + input(x, y) + input(x+1, y))/3;
b源码怎样做成app软件lur_y(x, y) = (b算法lur_x(x, y-1) + blur_x(缓存文件在哪里x, y) + blur_x(x, y+1))/3;
// The schedule - defines order, locality; im算法剖析的意图是plies storage
blur_y.tile(x, y, xi, yi, 256, 32)
.vectorize(xi, 8).parallel(y);
blur_x.compute_at(开源节流是什么意思是什么blur_y, x).vectorize(OpenCVx, 8);
return blur_y;
}

这段出名的代源码编辑器手机版下载码一起就在官方的主页上挂开源着,算是一个比较好的示例。

Halide的特征

Halide这个底层优化库有几个比较亮眼的特征:

Explicit programmer control

The compiler does exactly what you say.

Schedules cann开源节流ot i缓存视频兼并nfluence correctness.
Exploration is fast and easy.

明晰的程序控制,也便是说,咱们怎样依照这个核算的次序(与算法自身无关)是供认的opencv装置教程,一旦咱们现已设定好就不缓存的视频怎样保存到本地会再改动。

Stochastic search (autotuning)

Pick your favorite high-dimensional sea缓存文件在哪里rch.

而主动查找则是每个具有查找空间的优化器都算法的时刻复杂度是指什么能够运用的,因为每次进行优化操作的时分,优化的因缓存视频在手机哪里找子都是不供认的,关于不同的硬件来说,不开源我国同的配备或opencv装置许导致的实施速度也不相同。因而主动随机查找空间因子是有必要的。

元编程

Halide的思维与元编程有opencv图画辨认着接近的联络,不仅是其规划思路或许是其实施算法导论思路,都遵照了元编程的思维,也便是代码在编译之前并没有明晰的实施逻辑,只需编源码年代译往后,才会构成实施逻辑。

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

其他相关

halide已然作为与算法无关的底层优化器,与当今大伙的深度学习的结合运用肯定也是十分多的。OpenCV库就运用了halide去优化底层的神经网络算子,相应的benchmark结论在这儿,可是咱们发现运用了halide的神经网络作业的速度竟然不如一般的C++结束版。原因不供认是否ha开源是什么意思lide自身的规划有关,仍是与halide优化和神算法是什么经网络算子的兼容性有关,总之,假定想要运用halide真实的结束加快仍是需求等候一段时刻(等了良久仍是用到TVM上了)。

(深度学习优化大师)TVM的长辈,介绍下什么是HALIDE吧~

相关提问:

sta缓存视频兼并ckoveropencv人脸辨认算法fl开源是什么意思ow.com/q缓存视频在手机哪里找uestions/4…

其他提一下,Halide的作业有两种方法,一种是JIT的方法,另一种是AOT的方法。JIT方法运用起来opencv教程比较便当,能够直接将算法和Halide的代码生成generator封装成一个类,在程序的其他部分调用这个类,然后再编译运用。

而在嵌入式环境或交叉编译环境下一般运用AOT方法,此时需求调用compiler函数将算法代码和Halide的代码缓存视频生成generator编译位政策机器的代码,提早生成一个.o政策文件和.h头文缓存视频怎样转入本地视频件。然后在独立的政策机器的运用的工程的源代码中经过头文开源件调用算法结束的核算函数,并在build的时分链接上.o文件,这样就得到一个能够在算法导论政策机器上作业的用Halide结束算法的程序了。

后记

本文只是简略介绍了Halide的基本知识,关于想要深化理解Halide的童鞋能够看官方的教程或许阅览源码,不管咱们是设核算法的算法工程师亦或是在相关硬件平台上结束移植功用的底层工程师,Ha开源众包lide的思维都是值得咱们去学习和回味的。

Halide的运用缓存视频在手机哪里找规划很广,我之所以想要了解下Halide是因为运用了TVM库,TVM凭借了Halide的思维去结束神经网络算子的优化并且取得了不错的效果。源码共享网TVM也能够经过这种方法结束自己的一些算法,算是兼容了halide并且更好用,仍是主张咱们入坑的。

之后还会写一些TVM的文章…努力复习中。假定不对的地方,咱们轻喷呀。

参考资料:

上述所选用的图画部分来历于此缓存视频怎样转入本地视频

  • s源码编程tellar.mit.edu/S/course/6/…
  • Halide的官网:halide-lang.org/

撩我吧

  • 假定你与我情投意合于此,老潘很愿意与你沟通;
  • 假定你喜欢老潘的内容,欢迎注重和支持。
  • 假定你喜欢我的文章,期望点赞 保藏 谈论 三连一下~

想知道老潘是怎样学习踩坑的,想与我沟通问题~请注重缓存视频兼并群众号「oldpan博客」。
老潘也源码本钱会拾掇一些自己的私藏,期望能协助到咱们,点击奥秘传送门获取。