easy jit
play

Easy::Jit Just-In-Time compilation for C++ codes Serge Guelton Juan - PowerPoint PPT Presentation

Easy::Jit Just-In-Time compilation for C++ codes Serge Guelton Juan Manuel Martinez Caamao (me) from Quarkslab Introduction Compiler-assisted library


  1. Easy::Jit Just-In-Time compilation for C++ codes Serge Guelton Juan Manuel Martinez Caamaño (me) from Quarkslab

  2. Introduction ✔ Compiler-assisted library for runtime code generation ● Easy to understand C++ wrapper around the LLVM ✘ An omniscient virtual machine ✘ Read-Eval-Print Loop ✘ Building blocks for a Just-in-Time compiler

  3. Easy::Jit: by example static void apply_filter( const char *mask, unsigned mask_size, unsigned mask_area, cv::Mat &image, cv::Mat *&out) { kernel(mask, mask_size, mask_area, image.ptr(0,0), out->ptr(0,0), image.rows, image.cols, image.channels()); }

  4. Easy::Jit: by example static void apply_filter( const char *mask, unsigned mask_size, unsigned mask_area, cv::Mat &image, cv::Mat *&out) { kernel( mask , mask_size , mask_area , image.ptr(0,0), out->ptr(0,0), image.rows, image.cols, image.channels()); }

  5. Easy::Jit: by example static void apply_filter( const char *mask, unsigned mask_size, unsigned mask_area, cv::Mat &image, cv::Mat *&out) { kernel(mask, mask_size, mask_area, image.ptr(0,0), out->ptr(0,0), image.rows , image.cols , image.channels() ); }

  6. Easy::Jit: by example #include <easy/jit.h> static void apply_filter( const char *mask, unsigned mask_size, unsigned mask_area, cv::Mat &image, cv::Mat *&out) { using namespace std::placeholder; auto callme = easy::jit(kernel, mask, mask_size, mask_area, _1, _2, image.rows, image.cols, image.channels()); callme(image.ptr(0,0), out->ptr(0,0)); }

  7. Easy::Jit: by example #include <easy/code_cache.h> static void apply_filter( const char *mask, unsigned mask_size, unsigned mask_area, cv::Mat &image, cv::Mat *&out) { using namespace std::placeholder; static easy::Cache<> cache; auto const& callme = cache.jit(kernel, mask, mask_size, mask_area, _1, _2, image.rows, image.cols, image.channels()); callme(image.ptr(0,0), out->ptr(0,0)); }

  8. How?

  9. Easy::Jit: Internals 1. Parse calls to easy::jit and embed bitcode

  10. Easy::Jit: Internals 2. Associate function pointers with bitcode

  11. Easy::Jit: Internals 3. Recover the bitcode using the function pointer, specialize, apply classical optimizations

  12. Easy::Jit: Internals 4. Generate code

  13. Easy::Jit: Internals 5. Wrap in an opaque object

  14. Easy::Jit: The numbers

  15. Final words

  16. Easy::Jit: Stuff not mentioned ● Serialization / Deserialization on standard streams ● Inlining of function ● Composition of generated code ● Devirtualization of virtual method calls

  17. Easy::Jit: Contribute! ● C API (work started) ● Cache: Threading + Persistency ● Member functions and function objects ● Partial Evaluation void eval(AST* ast, int variables[]); ... auto program = easy::jit(eval, my_ast, _1); program(var_values)

  18. Contribute! github.com/jmmartinez/easy-just-in-time Merci Quarkslab :)

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend