构建自动优化工具Halide

构建自动优化工具Halide

随着人工智能,VR等领域的发展,我们对于高性能图像处理程序的需求 越来越大;当前编程工具开发的高性能图像处理程序牺牲了程序的可读 性,模块性,可移植性等;其主要原因是,当前程序将算法描述, 数据 存储以及计算糅杂在一起。同时手工编写高性能图像处理程序开发效率 较低,难以快速构建大量高性能图像处理代码。
在这样的背景下,MIT的研究人员专门为图像处理设计了一种程序语言—— Halide;Halide语言易于编写和修改,并且能够自动对代码进行优化, 使应用程序获得更好的执行效率。Halide设计的核心思想是将算法的内 容和算法的执行解耦,这样程序员可以根据不同的设备设置不同的优化 策略,获得更高质量的代码。目前halide支持的设备情况为:
CPU架构:X86, ARM, MIPS, Hexagon, PowerPC
操作系统:Linux, Windows, Mac OS X, Android, iOS, Qualcomm QuRT
GPU计算API:CUDA, OpenCL, OpenGL, OpenGL Compute Shaders, Apple Metal, Microsoft Direct X 12
当前知名的自动优化框架,除了halide还有寒武纪的TVM,TVM在设计上 借鉴了halide将算法内容和执行解耦的思路。本文主要主要内容如下:

  • LLVM安装
  • Halide编译
  • Halide程序构建

LLVM安装

首先下载LLVM源代码,源代码下载地址为:
http://releases.llvm.org/download.html#7.0.1
halide要求LLVM的版本为6.0以上,本文使用的是7.0.1版本;需要下载 一下几部分:

  • LLVM source code (.sig)
  • Clang source code (.sig)
  • compiler-rt source code (.sig)
  • libc++ source code (.sig)
  • libc++abi source code (.sig)
  • clang-tools-extra (.sig) (可选)

源码编译LLVM:

  • 创建源码目录
    mkdir LLVM                   
    tar xvf llvm-7.0.1.src.tar.xz                      
    mv llvm-7.0.1.src.tar.xz llvm-7.0.1                         
    cd llvm-7.0.1/tools/                     
    tar xvf cfe-7.0.1.src.tar.xz #clang的源代码包                     
    mv cfe-7.0.1.src clang                     
    cd ../projects/                 
    tar xvf compiler-rt-7.0.1.src.tar.xz                   
    tar xvf libcxx-7.0.1.src.tar.xz                            
    tar xvf libcxxabi-7.0.1.src.tar.xz                         
    mv libcxx-7.0.1.src libcxx                 
    mv libcxxabi-7.0.1.src libcxxabi               
    mv compiler-rt-7.0.1.src compiler-rt                       
复制代码

以上是目录构建的方法,注意需要自己将下载的源代码包拷贝到对应的目录下;可选包clang-tools-extra-7.0.1.src.tar.xz放到llvm-7.0.1/tools/clang/tools目录下,解压,重命名为extra;

  • build LLVM
    笔者在LLVM-7.0.1目录的同一级,创建LLVM-build目录;
cd LLVM-build             
cmake -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD="X86;ARM;NVPTX;AArch64;Mips;PowerPC" -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_BUILD_TYPE=Release ../LLVM-7.0.1/              
make -j4                
make install               
复制代码

其中,-DLLVM_TARGETS_TO_BUILD选项也可以根据需求设置,目前LLVM支持的架构包含:
AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430 NVPTX PowerPC Sparc SystemZ X86 XCore
也可以不使用make install,在编译Halide的时候使用export:
export LLVM_CONFIG=/build/bin/llvm-config
export CLANG=/build/bin/clang
以上是关于LLVM的编译。

Halide的编译安装

下载源码: git clone https://github.com/halide/Halide.git 进入Halide目录,设置环境变量:
export LLVM_CONFIG=/build/bin/llvm-config
export CLANG=/build/bin/clang
编译方法有很多种,这里采用cmake编译,方法如下:

mkdir build
cd build
cmake -DLLVM_DIR=/you/path/install/lib/cmake/llvm -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/you/install/path ../                             
make -j4                       
make install                            

复制代码

note:
如果编译失败,关注一下cmake命令执行的结果,查看缺少什么包,安装后重新编译即可;笔者在编译的过程中缺少,OpenBLAS,eign3, atlas;其中OpenBLAS采用的源码安装,下载源码:

git clone https://github.com/xianyi/OpenBLAS.git                   
cd OpenBLAS       
make -j4            
make PREFIX=/you/install/path/ install

复制代码

如果安装目录不是默认的/usr/local/,则需要指定环境变量;
其他两个库采用apt-get大法安装即可;

sudo apt-get install libeigen3-dev
sudo apt-get install libatlas-dev

复制代码

至此完成了Halid的安装编译;注意Halide也可以不安装,只要使用的时候正确链接库就OK。

Halide程序构建

demo如下:

// Halide.h包含了整个Halide, 只需要include这个头文件即可
#include "Halide.h"
//c头文件是为了使用c函数
#include <stdio.h>

int main(int argc, char **argv) {

    //定义函数
    Halide::Func gradient;
    //定义变量
    Halide::Var x, y;
    //定义计算
    Halide::Expr e = x + y;

    gradient(x, y) = e;
    //获取计算结果
    Halide::Buffer<int32_t> output = gradient.realize(800, 600);

    //验证计算结果
    for (int j = 0; j < output.height(); j++) {
        for (int i = 0; i < output.width(); i++) {
            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;
            }
        }
    }
    printf("Success!\n");
    return 0;
}

复制代码

编译方法:

g++ halide01.cpp -g -I /you/patn/include -L /you/path/bin -lHalide -lpthread -ldl -o halide01 -std=c++11
复制代码

编译完该文件以后,获取可执行文件;
执行该文件之前需要设置环境变量:

export LD_LIBRARY_PATH=/you/path/bin
复制代码

该目录包含Halide.so
至此Halide的demo构建结束;本文中只构建了简单的Halide的程序,能 够看到Halide语言中算法描述与计算解耦的设计方式;之后的文章中会 继续介绍Halide中关于优化策略等的设计,最终验证Halide自动优化代 码的性能。

欢迎关注公众号:计算机视觉与高性能计算(to_know)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值