111qqz的小窝

老年咸鱼冲锋!

【试工中】 halide学习笔记

Halide is a programming language designed to make it easier to write high-performance image and array processing code on modern machines. 

halide有两个特性比较吸引人。一个是对于各种平台架构的支持。

  • CPU architectures: X86, ARM, MIPS, Hexagon, PowerPC
  • Operating systems: Linux, Windows, macOS, Android, iOS, Qualcomm QuRT
  • GPU Compute APIs: CUDA, OpenCL, OpenGL, OpenGL Compute Shaders, Apple Metal, Microsoft Direct X 12

另一个是把计算什么和怎么计算(何时计算)分离开来。

可以直接参考tutorials 来学习

 

下面是一段将Halide Buffer转化成opencv Mat的代码,用于调试。

 

 

 

优化学习笔记(1):Loop unrolling

迫于生计,最近要学习halide

先去学习/复习一下常见的编译优化技巧。

loop unrolling,也就是循环展开,顾名思义,就是把循环展开来写。

循环展开是一种优化,可以手动实现也可以编译器自动实现。

为什么要将循环展开?

  • 循环每次都需要判断终止条件,展开后可以消除这部分开销。
  • 减少分支预测开销。循环里的分支是指“跳出循环”还是“进行下一次迭代”
  • vectorization

    可以看到最里面一层循环被展开以实现向量化.向量化是一种优化计算的手段。该优化的实现基于SIMD 和Advanced_Vector_Extensions(AVX)指令集架构的支持。
  • 消除和loop counter(i)有关的除法计算。
  • 消除循环内部的分支。比如loop counter奇数和偶数时会进入不同的分支,那么将循环展开后,就消除了该分支。

有什么缺点?

  • 代码体积增加了。这对于嵌入式设备等往往是不可接受的。
  • 代码可读性变差了。
  • 单一指令可能会使用更多的寄存器,导致性能下降。
  • 如果循环内部包含函数调用,那么和函数的内联(inline)优化会有冲突。原因是,循环展开+函数展开…代码的体积会爆炸。

参考资料