Language-side Foreign Function Interfaces with NativeBoost IWST 2013 Camillo Bruni, Luc Fabresse, Stéphane Ducasse, Igor Stasenko
Outline 1. Context 2. Existing Solutions 3. NativeBoost 4. Speed Comparison of NativeBoost with other FFIs 5. NativeBoost Internals 6. Conclusion & Future Work IWST ¡2013 ¡@ ¡Annecy 2
Context Cairo Language Chipmunk OpenGL Virtual Machine (VM) LibC ... IWST ¡2013 ¡@ ¡Annecy 3
Context Cairo Language Chipmunk OpenGL Virtual Machine (VM) LibC ... How to interact with external libraries? IWST ¡2013 ¡@ ¡Annecy 4
Existing Solutions Language-side Library VM Extension VM Plugin Foreign Function Interface VM-level Language-level IWST ¡2013 ¡@ ¡Annecy 5
Existing Solutions costly Language-side Library VM Extension VM Plugin Foreign Function Interface VM-level Language-level IWST ¡2013 ¡@ ¡Annecy 6
Existing Solutions costly Language-side Library VM Extension low-level VM Plugin Foreign Function Interface VM-level Language-level IWST ¡2013 ¡@ ¡Annecy 7
Existing Solutions costly Language-side Library VM Extension low-level VM Plugin Foreign Function Interface fast VM-level slow Language-level IWST ¡2013 ¡@ ¡Annecy 8
NativeBoost A language-side and fast FFI implementation IWST ¡2013 ¡@ ¡Annecy 9
Language-side • Extensible • Easy to use • no VM code needed • no low-level code (C wrapper) needed IWST ¡2013 ¡@ ¡Annecy 10
Fast Transparent generation of Assembly code from the language-side IWST ¡2013 ¡@ ¡Annecy 11
NativeBoost Example char* getenv(const char*) IWST ¡2013 ¡@ ¡Annecy 12
NativeBoost Example char* getenv(const char*) IWST ¡2013 ¡@ ¡Annecy 13
NativeBoost Example Regular Smalltalk method with one argument IWST ¡2013 ¡@ ¡Annecy 14
NativeBoost Example A pragma indicating that #primitiveNativeCall of #NativeBoost plugin should be executed when this method is executed IWST ¡2013 ¡@ ¡Annecy 15
NativeBoost Example IWST ¡2013 ¡@ ¡Annecy 16
NativeBoost Example char* getenv(const char*) types annotation used to generate marshalling code IWST ¡2013 ¡@ ¡Annecy 17
NativeBoost Example the value to be passed when calling out IWST ¡2013 ¡@ ¡Annecy 18
NativeBoost Example the external library address in which the function is looked up IWST ¡2013 ¡@ ¡Annecy 19
Speed Comparisons • NativeBoost • Callouts • Alien FFI • Marshalling • C-FFI • Callbacks • LuaJIT IWST ¡2013 ¡@ ¡Annecy 20
Callout Evaluation Average time calling out uint clock(void) 150% slower 100% faster 50% 0% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 21
Marshalling int int abs(int) 300% 200% 100% 0% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 22
Marshalling char*/String int printf(char*,int,int) 400% 300% 200% 100% 0% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 23
Marshalling char*/String char* getenv( char* ) 1000% 300% 100% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 24
Marshalling char*/String char* getenv( char* ) 1000% 300% 100% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 25
Marshalling structs void cairo_matrix_multiply ( cairo_matrix_t *result, cairo_matrix_t *a, cairo_matrix_t *b) 1000% 400% 100% NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 26
Callbacks Evaluation void qsort ( void *base, size_t nel, size_t width, int (*compare)(const void*, const void*)) 100% d e t r o p p u 30% s t o n NativeBoost Alien C-FFI LuaJIT IWST ¡2013 ¡@ ¡Annecy 27
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ IWST ¡2013 ¡@ ¡Annecy 28
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ IWST ¡2013 ¡@ ¡Annecy 29
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ NativeBoost Plugin Virtual Machine (VM) IWST ¡2013 ¡@ ¡Annecy 30
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ NativeBoost Plugin Virtual Machine (VM) Fail if no native code associated with #getenv: IWST ¡2013 ¡@ ¡Annecy 31
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ NativeBoost Plugin Virtual Machine (VM) 1. generate native code for marshalling, ... 2. associate it with #getenv: 3. restart the method execution IWST ¡2013 ¡@ ¡Annecy 32
Insights into NativeBoost Internals NBExample getenv: ‘PATH’ NativeBoost Plugin Virtual Machine (VM) activate the native code associated with #getenv: IWST ¡2013 ¡@ ¡Annecy 33
Conclusion • NativeBoost-FFI is: • Language-side: extensible, high-level code only • Fast compared to other Smalltalk FFI • Needs optimizations on Callbacks but that would require strong VM support IWST ¡2013 ¡@ ¡Annecy 34
Future Work • Improve NativeBoost Callback performance • Reuse Alien’s VM Callback support? • Better integration of NativeBoost with the JIT • Do not leave JIT -mode when activating a NB method IWST ¡2013 ¡@ ¡Annecy 35
Language-side Foreign Function Interfaces with NativeBoost IWST 2013 Camillo Bruni, Luc Fabresse, Stéphane Ducasse, Igor Stasenko
Recommend
More recommend