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结构
内容太多,不在此一一列举,需要什么点链接上去查即可
http://halide-lang.org/docs/struct_halide_1_1_target.html#details
阅读全文
0 0
- Halide学习笔记----Halide tutorial源码阅读11
- Halide学习笔记----Halide tutorial源码阅读1
- Halide学习笔记----Halide tutorial源码阅读2
- Halide学习笔记----Halide tutorial源码阅读3
- Halide学习笔记----Halide tutorial源码阅读4
- Halide学习笔记----Halide tutorial源码阅读5
- Halide学习笔记----Halide tutorial源码阅读6
- Halide学习笔记----Halide tutorial源码阅读7
- Halide学习笔记----Halide tutorial源码阅读8
- Halide学习笔记----Halide tutorial源码阅读9
- Halide学习笔记----Halide tutorial源码阅读10
- Halide学习笔记----Halide tutorial源码阅读12
- Halide学习笔记----Halide tutorial源码阅读13
- Halide学习笔记----Halide tutorial源码阅读14
- Halide学习笔记----Halide tutorial源码阅读15
- Halide学习笔记----Halide tutorial源码阅读16
- Halide学习笔记----Halide tutorial源码阅读17
- Halide学习笔记----Halide tutorial源码阅读18
- java鬼混笔记:springboot之redis保存对象
- RecyclerView
- hadoop-hdfs简介(三)
- 简单可持久化数据结构总结
- ListView
- Halide学习笔记----Halide tutorial源码阅读11
- 01MTALAB绘制sigmoid函数图像
- win10+python3.6(anaconda3.6)+pycharm3.1+opencv3.3.1+Tensorflow
- python编程(类的使用)
- 知识学习——Java基础类库
- bzoj1015 luogu1197 JSOI2008
- HTML 五角星——— Cavnas 坐标滚动法
- 使用C重写jieba结巴分词库,大幅提速50%-60%
- 数组