[llvm-dev] ORC JIT and multithreading
Christian Schafmeister via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 14 19:23:51 PST 2017
Hi Lang,
I’m excited to hear about an ORC refactor with improved threading support - I really like ORC.
I added multithreading to Clasp after I made the switch to ORC - so I don’t have any experience using MCJIT in a multithreaded environment.
Thank you for responding.
Best,
.Chris.
> On Nov 14, 2017, at 7:31 PM, Lang Hames <lhames at gmail.com> wrote:
>
> Hi Christian,
>
> ORC doesn't have any locks internally at the moment. Approach (1) is the recommended solution. I'm working on a refactor that should be out in a few weeks that will improve threading support, and I expect to put more effort into multi-threaded performance in the next few months.
>
> Out of interest, are you saying that approach (1) was a regression compared to MCJIT's behavior?
>
> Cheers,
> Lang.
>
>
> On Mon, Nov 6, 2017 at 12:28 PM, Christian Schafmeister via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
> How would I go about enabling the ORC JIT to compile code in multiple threads?
>
> Some background:
> I’ve switched Clasp (an implementation of Common Lisp that uses llvm as the backend - github.com/drmeister/clasp <http://github.com/drmeister/clasp>) over to using ORC as its JIT. I did this by following the Kaleidoscope tutorial. I have a ClaspJIT_O class that copies the KaleidoscopeJIT class.
> https://github.com/drmeister/clasp/blob/analyze/include/clasp/llvmo/llvmoExpose.h#L4370 <https://github.com/drmeister/clasp/blob/analyze/include/clasp/llvmo/llvmoExpose.h#L4370>
>
> Clasp is multithreaded and it needs to compile code in multiple threads because it uses the JIT to generate dispatch functions for multiple dispatch/generic functions. To make this possible, every thread gets its own LLVMContext and every type and llvm::Module that is linked into JITted code in each thread is initialized lazily and thread-locally. Despite this - I experience frequent, random crashes when I try to use the ORC JIT from multiple threads.
>
> Here’s what I’ve tried:
>
> (1) This works: wrap a lock/mutex around access to one ClaspJIT_O object, the calls to ClaspJIT_O::addModule and a call to jitFinalizeReplFunction are protected by the lock:
> https://github.com/drmeister/clasp/blob/dev/src/llvmo/llvmoExpose.cc#L3999 <https://github.com/drmeister/clasp/blob/dev/src/llvmo/llvmoExpose.cc#L3999>
>
> The Common Lisp code that does the lock and calls these functions:
> https://github.com/drmeister/clasp/blob/analyze/src/lisp/kernel/cmp/jit-setup.lsp#L598 <https://github.com/drmeister/clasp/blob/analyze/src/lisp/kernel/cmp/jit-setup.lsp#L598>
>
> This throttles the system and limits one thread at a time to add modules to the JIT and lookup symbols in the JIT. It’s not bad - I can live with it.
>
> (2) This fails: Keep a thread local copy of a ClaspJIT_O object that is lazily initialized as soon as any compilation happens in a thread.
>
> (3) This fails: Keep a thread local copy of a ClaspJIT_O object that is initialized as in #2 AND wrap a lock/mutex around ClaspJIT_O::addModule and a call to jitFinalizeReplFunction. What I thought I was testing here was if there was some global resource that ORC uses and despite having multiple thread-local ClaspJIT_O objects the different threads were trampling that common global resource.
>
> I can provide many more details on request.
>
> Christian Schafmeister
> Professor, Chemistry
> Temple University
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <http://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/20171114/f74d03f6/attachment.html>
More information about the llvm-dev
mailing list