| Intro to Halide codegeneration pattern (based on Halide documentation) | |
| =========================================================================== | |
| functionName: | |
| ============ | |
| Functions generated by Halide are regular functions with a user chosen name and arguments. | |
| These functions are considered to be the public methods called by external programs. | |
| The body checks the correctness of its arguments, then calls the function | |
| that contains the actual computation. This function is called "__functionName". | |
| __functionName: | |
| ============= | |
| Actual function as defined by the Halide programmer. | |
| These are considered to be private functions, called through the above public function. | |
| functionName_argv: | |
| ================= | |
| If the function is externally visible, Halide also creates an argv wrapper. | |
| This is useful for calling from JIT and other machine interfaces. | |
| The wrapper calls the function with an array of pointer arguments. | |
| This is easier for the JIT to call than a function with an unknown | |
| (at compile time) argument list. | |
| E.g. The unit tests "simd_ops" contain functions called "test_op" and "scalar_test_op" | |
| HOW TO: Halide bitcode generation and creating of tests and benchmarks | |
| ======================================================================= | |
| The Halide tests in test-suite/Bitcode were generated using Halide ToT at: | |
| https://github.com/halide/Halide | |
| Creating a test or an application from bitcode generated code requires these stages: | |
| 1. Define a Halide pipeline | |
| 2. Generate a bitcode file with the Halide pipeline as a method, along with a header for the method prototype. | |
| 3. Create a C driver that calls the method generated, times it, compares against reference etc. | |
| 4. Link the C driver, bitcode file and Halide runtime (an already generated bitcode file found in test-suite/Bitcode) | |
| into an executable. | |
| 1. To create a Halide pipeline/application, please visit the Halide tutorial: | |
| http://halide-lang.org/tutorials/tutorial_introduction.html | |
| The tests and benchmarks in test-suite/Bitcode were generated from: | |
| https://github.com/halide/Halide/blob/master/test/correctness/simd_op_check.cpp | |
| and | |
| https://github.com/halide/Halide/tree/master/apps | |
| 2. Each Halide function (Func) and pipeline (Pipeline) have the following methods: | |
| compile_to_file: generates a header and object files | |
| compile_to_header: generates just a header file | |
| compile_to_object: generates just an object file | |
| compile_to_bitcode: generates a bitcode file | |
| compile_to_llvm_assembly: generates a disassembled bitcode file (.ll) | |
| These method provide the interface to chose a function name and file name for the Func/Pipeline. | |
| An example from the Halide correctness tests: | |
| https://github.com/halide/Halide/blob/master/test/correctness/simd_op_check.cpp#L166 | |
| 3. The methods in the bitcode files generated for the test at 2. are invoked by the following driver: | |
| https://github.com/halide/Halide/blob/master/apps/simd_op_check/driver.cpp | |
| 4. Typical build command for a Halide application: | |
| clang++ test.bc driver.cpp halide_runtime.bc -lpthread -ldl | |