Generic Lightweight Druntime at DConf May 2017 Overview
Lucia Madalina Cojocaru from University POLITEHNICA of Bucharest presents about the motivation, idea, process, and first steps of optimizing Generic Lightweight Druntime at the DConf event in May 2017. They discuss simplifying the compiler, reducing TypeInfo usage, and more.
Download Presentation

Please find below an Image/Link to download the presentation.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.
E N D
Presentation Transcript
Generic Lightweight Druntime Lucia Madalina Cojocaru University POLITEHNICA of Bucharest lucia.mcojocaru@gmail.com
How? Witch hunt: compiler dark magic Lower to straight D code (in Druntime) Burn them at the stake! Refactor druntime to do their job Generic Lightweight Druntime - DConf - May 2017 3
Motivation DMD replaces certain code with calls to traditional untyped functions in the runtime library Call created during IR code gen phase TypeInfo inheritance chain Dynamically dispatched calls that are slow Generic Lightweight Druntime - DConf - May 2017 4
The Idea - Lowering Lower the code to calls to templates in Druntime Lowering happens during the semantic analysis phase Replace complex code generation in compiler and Druntime with simple templates Implementation focus shifts on Druntime Less duplication! Safety! Speedup! Generic Lightweight Druntime - DConf - May 2017 5
The Process if (__cmp(a, b)){ } int[2] a = [1, 2]; int __cmp(T)(const T[] lhs, const T[] rhs) if (__traits(isScalar, T)) { } int[2] b = [3, 4]; if (a > b){ } Compiler semantic Runtime template Generic Lightweight Druntime - DConf - May 2017 6
First Steps Identify some functions and replace them Array operations Compare Equals Assign Evaluate performance Generic Lightweight Druntime - DConf - May 2017 7
Pros [PRs] To Be Reviewed Generic Lightweight Druntime - DConf - May 2017 8
Pros Simplify the Compiler dmd/src/ddmd/e2ir.d Generic Lightweight Druntime - DConf - May 2017 9
Pros Reduce the Use of TypeInfo druntime/src/object.d Generic Lightweight Druntime - DConf - May 2017 10
Pros Templates Everywhere! Generic Compiled when necessary Richer type information (@nogc, nothrow, pure) Inlineable Performance increase! Generic Lightweight Druntime - DConf - May 2017 11
Pros Performance! (Before) druntime/src/object.d struct C { int i; int opCmp(C c) const { return i - c.i; } } druntime/src/adi.d druntime/src/object.d Generic Lightweight Druntime - DConf - May 2017 12
Pros Performance! (After) dmd/expression.d struct C { int i; int opCmp(C c) const { return i - c.i; } } druntime/src/object.d Generic Lightweight Druntime - DConf - May 2017 13
Cons object.d Bloating Code from druntime/src/rt/typeinfo moves into object.d Compare, equals, getHash All template overloads defined in object.d New modules in druntime: import tradeoff Generic Lightweight Druntime - DConf - May 2017 14
Cons Compilation Speed Simple projects - no difference Compilation speed may decrease Compile the templates several times Generic Lightweight Druntime - DConf - May 2017 15
Current State Array compare (__cmp) integrated in dmd and druntime Array equals in development (some dmd tests failing) Benchmarks Backburner: array assign, code cleanup Generic Lightweight Druntime - DConf - May 2017 16
Benchmarks bool fun(C[] array1, C[] array2) { return array1[] < array2[]; } void test(int size) { C[n] array1, array2; // create arrays of size n ... auto r = benchmark!({ fun(array1, array2); })(10_000); } Generic Lightweight Druntime - DConf - May 2017 17
Array Compare Speedup (1/2) 2.5 Speedup (TimeOld/ TimeNew) 2 1.5 1 0.5 0 10 100 1k 10k 100k Array Size (No. Elements) Objects Integers Floats Generic Lightweight Druntime - DConf - May 2017 18
Array Compare Speedup (2/2) 18 Speedup (TimeOld / TimeNew) 16 14 12 10 8 6 4 2 0 10 100 1k 10k 100k Array Size (No. Elements) Structs with opCmp Generic Lightweight Druntime - DConf - May 2017 19
Array Equals Speedup (1/2) 3.5 Speedup (TimeOld / TimeNew) 3 2.5 2 1.5 1 0.5 0 10 100 1k 10k 100k Array Size (No. Elements) Objects Structs Structs with opEq Floats Generic Lightweight Druntime - DConf - May 2017 20
Array Equals Speedup (2/2) 30 Speedup (TimeOld / TimeNew) 25 20 15 10 5 0 10 100 1k 10k 100k Array Size (No. Elements) Integers Generic Lightweight Druntime - DConf - May 2017 21
Hot Code! Integer and string comparisons happen often Lots of compile time string comparisons (equality) Several sorting algorithms in Phobos Generic Lightweight Druntime - DConf - May 2017 22
Further Work __equals, array assign Templates for non-array types Destructors, switch statements Code cleanup Generic Lightweight Druntime - DConf - May 2017 23
Conclusions Refactor druntime to use lowering and templates Simplify compiler logic and increases runtime performace Simplify the language implementation and make it more powerful Speedup between 1x and 30x Generic Lightweight Druntime - DConf - May 2017 24