Rajesh S R via llvm-dev
2019-Jul-03 22:43 UTC
[llvm-dev] Using bytecode version of std::sort for JIT generated data type
Hi LLVM devs, The performance of C++ std::sort comes from being able to inline the comparator. For a JIT generated data type, using the comparator as a function call from std::sort may not be ideal. So, i was wondering how can we make a JIT-sort which is as good as statically compiled std::sort with comparator inlined. What is the recommended way to pass a an existing function like std::sort into JIT so that it can optimize the whole program? For example, how do we generate the bytecode for existing function (say some external tools) and give to JIT runtime. Is there some code sample? The alternative is to rollout my own Sort function inside JIT, but i don't want to do that and want to take this as an opportunity to learn the general approach of passing existing function definitions into JIT to do whole program optimization like inlining. I found this stackoverflow question <https://stackoverflow.com/questions/10587250/fast-to-compile-efficient-sort-algorithm-for-jit-compilation>which is related to what I am asking for, but I don't see any final conclusion on this beyond incurring a function call for each comparison. Thanks! Rajesh S R -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190703/23c44b64/attachment.html>
David Blaikie via llvm-dev
2019-Jul-03 22:55 UTC
[llvm-dev] Using bytecode version of std::sort for JIT generated data type
If you consider how std::sort works - it doesn't exist in the machine (or even LLVM IR) level without a specific type - so if you were to support something like std::sort in your language (JITed or not), it means some form of specialization of your types/functions based on other types. So, yes, something like "own Sort function inside JIT" - if your language doesn't support a way to write this in the language itself (if it doesn't have anything like C++ templates or an equivalent generic thing). Otherwise you can do something like qsort (which uses a function pointer to parameterize the comparison) & perhaps force or encourage the optimizer to inline and collapse away this indirection. On Wed, Jul 3, 2019 at 3:43 PM Rajesh S R via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi LLVM devs, > The performance of C++ std::sort comes from being able to inline the > comparator. For a JIT generated data type, using the comparator as a > function call from std::sort may not be ideal. So, i was wondering how can > we make a JIT-sort which is as good as statically compiled std::sort with > comparator inlined. > > What is the recommended way to pass a an existing function like std::sort > into JIT so that it can optimize the whole program? For example, how do we > generate the bytecode for existing function (say some external tools) and > give to JIT runtime. Is there some code sample? > > The alternative is to rollout my own Sort function inside JIT, but i don't > want to do that and want to take this as an opportunity to learn the > general approach of passing existing function definitions into JIT to do > whole program optimization like inlining. > > I found this stackoverflow question > <https://stackoverflow.com/questions/10587250/fast-to-compile-efficient-sort-algorithm-for-jit-compilation>which > is related to what I am asking for, but I don't see any final conclusion on > this beyond incurring a function call for each comparison. > > Thanks! > > Rajesh S R > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190703/0b7cd830/attachment.html>
Rajesh S R via llvm-dev
2019-Jul-03 23:22 UTC
[llvm-dev] Using bytecode version of std::sort for JIT generated data type
Thanks David! I understand that std::sort doesn't exist without types especially at bytecode layer. What I was thinking was something like the following: Compile std::sort with a thunk function Compare(void*, void*) {rerturn false} into bytecode with an option say noinline and always make the function call or even a simple unoptimized bytecode which guarantees that Compare exists as a function without any inlining. At run time implement a new Compare function for your type and replace the Compare function with the new Compare implemented with JIT. Now the JIT runtime has whole program in bytecode which it can aggressively optimize. A good way to realize this "thunking" into LLVM JIT can enable lots of optimized algorithms to be ported into JIT without having to re-invent them for each JIT runtime. Thoughts? On Wed, Jul 3, 2019 at 3:56 PM David Blaikie <dblaikie at gmail.com> wrote:> If you consider how std::sort works - it doesn't exist in the machine (or > even LLVM IR) level without a specific type - so if you were to support > something like std::sort in your language (JITed or not), it means some > form of specialization of your types/functions based on other types. > > So, yes, something like "own Sort function inside JIT" - if your language > doesn't support a way to write this in the language itself (if it doesn't > have anything like C++ templates or an equivalent generic thing). > > Otherwise you can do something like qsort (which uses a function pointer > to parameterize the comparison) & perhaps force or encourage the optimizer > to inline and collapse away this indirection. > > On Wed, Jul 3, 2019 at 3:43 PM Rajesh S R via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hi LLVM devs, >> The performance of C++ std::sort comes from being able to inline the >> comparator. For a JIT generated data type, using the comparator as a >> function call from std::sort may not be ideal. So, i was wondering how can >> we make a JIT-sort which is as good as statically compiled std::sort with >> comparator inlined. >> >> What is the recommended way to pass a an existing function like std::sort >> into JIT so that it can optimize the whole program? For example, how do we >> generate the bytecode for existing function (say some external tools) and >> give to JIT runtime. Is there some code sample? >> >> The alternative is to rollout my own Sort function inside JIT, but i >> don't want to do that and want to take this as an opportunity to learn the >> general approach of passing existing function definitions into JIT to do >> whole program optimization like inlining. >> >> I found this stackoverflow question >> <https://stackoverflow.com/questions/10587250/fast-to-compile-efficient-sort-algorithm-for-jit-compilation>which >> is related to what I am asking for, but I don't see any final conclusion on >> this beyond incurring a function call for each comparison. >> >> Thanks! >> >> Rajesh S R >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190703/4ea81ac9/attachment.html>
Possibly Parallel Threads
- Using bytecode version of std::sort for JIT generated data type
- Using bytecode version of std::sort for JIT generated data type
- Using bytecode version of std::sort for JIT generated data type
- Using bytecode version of std::sort for JIT generated data type
- "Freeing" functions generated with SimpleORC for JIT use-case