Halide学习笔记----Halide tutorial源码阅读11

来源:互联网 发布:网络歌曲飘雪 编辑:程序博客网 时间:2024/06/05 23:51

Halide入门教程11

// Halide tutorial lesson 11: Cross-compilation// Halide教程第十一课:跨平台编译// This lesson demonstrates how to use Halide as a cross-compiler to// generate code for any platform from any platform.// 本科展示了如何用Halide来充当跨平台编译器来生成不同平台的代码// On linux, you can compile and run it like so:// g++ lesson_11*.cpp -g -std=c++11 -I ../include -L ../bin -lHalide -lpthread -ldl -o lesson_11// LD_LIBRARY_PATH=../bin ./lesson_11#include "Halide.h"#include <stdio.h>using namespace Halide;int main(int argc, char **argv) {    // We'll define the simple one-stage pipeline that we used in lesson 10.    Func brighter;    Var x, y;    // Declare the arguments.    Param<uint8_t> offset;    ImageParam input(type_of<uint8_t>(), 2);    std::vector<Argument> args(2);    args[0] = input;    args[1] = offset;    // Define the Func.    brighter(x, y) = input(x, y) + offset;    // Schedule it.    brighter.vectorize(x, 16).parallel(y);    // The following line is what we did in lesson 10. It compiles an    // object file suitable for the system that you're running this    // program on.  For example, if you compile and run this file on    // 64-bit linux on an x86 cpu with sse4.1, then the generated code    // will be suitable for 64-bit linux on x86 with sse4.1.    // 下面这一行做的事情和第十课类似。它编译出一个适应与你当前工作平的object文件。    // 例如你当前工作在代sse4.1指令的x86 cpu的64位linux系统,它生成适应你平台的object文件    brighter.compile_to_file("lesson_11_host", args, "brighter");    // We can also compile object files suitable for other cpus and    // operating systems. You do this with an optional third argument    // to compile_to_file which specifies the target to compile for.    // 也可以编译处适合其他cpu和操作系统平台的object文件。在compile_to_file的target变量中制定    // 特定的编译目标平台即可    // Let's use this to compile a 32-bit arm android version of this code:    // 如下是一个制定安卓os和arm cpu的例子    Target target;    target.os = Target::Android; // The operating system    target.arch = Target::ARM;   // The CPU architecture    target.bits = 32;            // The bit-width of the architecture    std::vector<Target::Feature> arm_features; // A list of features to set    target.set_features(arm_features);    // We then pass the target as the last argument to compile_to_file.    // 只需在compile_to_file的最后一个target变量中制定编译的目标平台即可    brighter.compile_to_file("lesson_11_arm_32_android", args, "brighter", target);    // And now a Windows object file for 64-bit x86 with AVX and SSE 4.1:    // windows也类似    target.os = Target::Windows;    target.arch = Target::X86;    target.bits = 64;    std::vector<Target::Feature> x86_features;    x86_features.push_back(Target::AVX);    x86_features.push_back(Target::SSE41);    target.set_features(x86_features);    brighter.compile_to_file("lesson_11_x86_64_windows", args, "brighter", target);    // And finally an iOS mach-o object file for one of Apple's 32-bit    // ARM processors - the A6. It's used in the iPhone 5. The A6 uses    // a slightly modified ARM architecture called ARMv7s. We specify    // this using the target features field.  Support for Apple's    // 64-bit ARM processors is very new in llvm, and still somewhat    // flaky.    // arm/ios也类似    target.os = Target::IOS;    target.arch = Target::ARM;    target.bits = 32;    std::vector<Target::Feature> armv7s_features;    armv7s_features.push_back(Target::ARMv7s);    target.set_features(armv7s_features);    brighter.compile_to_file("lesson_11_arm_32_ios", args, "brighter", target);    // Now let's check these files are what they claim, by examining    // their first few bytes.    // 下面是通过代码验证编译粗来的object文件是否符合对应文件格式的要求    // 32-arm android object files start with the magic bytes:    uint8_t arm_32_android_magic[] = {0x7f, 'E', 'L', 'F', // ELF format                                      1,       // 32-bit                                      1,       // 2's complement little-endian                                      1};      // Current version of elf    FILE *f = fopen("lesson_11_arm_32_android.o", "rb");    uint8_t header[32];    if (!f || fread(header, 32, 1, f) != 1) {        printf("Object file not generated\n");        return -1;    }    fclose(f);    if (memcmp(header, arm_32_android_magic, sizeof(arm_32_android_magic))) {        printf("Unexpected header bytes in 32-bit arm object file.\n");        return -1;    }    // 64-bit windows object files start with the magic 16-bit value 0x8664    // (presumably referring to x86-64)    uint8_t win_64_magic[] = {0x64, 0x86};    f = fopen("lesson_11_x86_64_windows.obj", "rb");    if (!f || fread(header, 32, 1, f) != 1) {        printf("Object file not generated\n");        return -1;    }    fclose(f);    if (memcmp(header, win_64_magic, sizeof(win_64_magic))) {        printf("Unexpected header bytes in 64-bit windows object file.\n");        return -1;    }    // 32-bit arm iOS mach-o files start with the following magic bytes:    uint32_t arm_32_ios_magic[] = {0xfeedface, // Mach-o magic bytes                                   12,  // CPU type is ARM                                   11,  // CPU subtype is ARMv7s                                   1};  // It's a relocatable object file.    f = fopen("lesson_11_arm_32_ios.o", "rb");    if (!f || fread(header, 32, 1, f) != 1) {        printf("Object file not generated\n");        return -1;    }    fclose(f);    if (memcmp(header, arm_32_ios_magic, sizeof(arm_32_ios_magic))) {        printf("Unexpected header bytes in 32-bit arm ios object file.\n");        return -1;    }    // It looks like the object files we produced are plausible for    // those targets. We'll count that as a success for the purposes    // of this tutorial. For a real application you'd then need to    // figure out how to integrate Halide into your cross-compilation    // toolchain. There are several small examples of this in the    // Halide repository under the apps folder. See HelloAndroid and    // HelloiOS here:    // https://github.com/halide/Halide/tree/master/apps/    // 经过上面的验证,halide针对那些目标平台生成的目标文件貌似可信。但是对于一个实际的引用,还必须指出如何    // 将Halide集成到跨平台的工具链道中。在Halide的github的app中有对应的例子,具体情况参见链接    printf("Success!\n");    return 0;}

在终端中编译和运行代码:

$ g++ lesson_11*.cpp -g -std=c++11 -I ../include -L ../bin -lHalide -lpthread -ldl -o lesson_11$ ./lesson_11

结果
这里写图片描述

补充说明:(更具体的情况点链接,去官网文档上看吧,比这里详细)

1.compile_to_file函数

EXPORT void Halide::Func::compile_to_file(const std::string & filename_prefix,                    // 文件名前缀const std::vector< Argument > & args,                   // 参数列表const std::string & fn_name = "",                       // 函数名const Target &  target = get_target_from_environment()  // 目标平台)   

2.Target结构

OS Arch OSUnknown ArchUnknown Linux X86 Windows ARM OSX MIPS Android Hexagon IOS POWERPC QuRT NoOS

内容太多,不在此一一列举,需要什么点链接上去查即可

http://halide-lang.org/docs/struct_halide_1_1_target.html#details

原创粉丝点击