<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Lang,<div class=""><br class=""></div><div class="">I’m excited to hear about an ORC refactor with improved threading support - I really like ORC.</div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">Thank you for responding.</div><div class=""><br class=""></div><div class="">Best,</div><div class=""><br class=""></div><div class="">.Chris.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">On Nov 14, 2017, at 7:31 PM, Lang Hames <<a href="mailto:lhames@gmail.com" class="">lhames@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi Christian,<div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">Out of interest, are you saying that approach (1) was a regression compared to MCJIT's behavior?</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Lang.</div><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Nov 6, 2017 at 12:28 PM, Christian Schafmeister via llvm-dev <span dir="ltr" class=""><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto" style="word-wrap:break-word" class=""><div style="word-wrap:break-word" class=""><div class=""><br class=""></div><div class="">How would I go about enabling the ORC JIT to compile code in multiple threads?</div><div class=""><br class=""></div><div class="">Some background:</div><div class="">I’ve switched Clasp (an implementation of Common Lisp that uses llvm as the backend - <a href="http://github.com/drmeister/clasp" target="_blank" class="">github.com/drmeister/clasp</a>) 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.</div><div class=""><a href="https://github.com/drmeister/clasp/blob/analyze/include/clasp/llvmo/llvmoExpose.h#L4370" target="_blank" class="">https://github.com/drmeister/<wbr class="">clasp/blob/analyze/include/<wbr class="">clasp/llvmo/llvmoExpose.h#<wbr class="">L4370</a></div><div class=""><br class=""></div><div class="">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.  </div><div class=""><br class=""></div><div class="">Here’s what I’ve tried:</div><div class=""><br class=""></div><div class="">(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:</div><div class=""><a href="https://github.com/drmeister/clasp/blob/dev/src/llvmo/llvmoExpose.cc#L3999" target="_blank" class="">https://github.com/drmeister/<wbr class="">clasp/blob/dev/src/llvmo/<wbr class="">llvmoExpose.cc#L3999</a></div><div class=""><br class=""></div><div class="">The Common Lisp code that does the lock and calls these functions:</div><div class=""><a href="https://github.com/drmeister/clasp/blob/analyze/src/lisp/kernel/cmp/jit-setup.lsp#L598" target="_blank" class="">https://github.com/drmeister/<wbr class="">clasp/blob/analyze/src/lisp/<wbr class="">kernel/cmp/jit-setup.lsp#L598</a></div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">(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.</div><div class=""><br class=""></div><div class="">(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.</div><div class=""><br class=""></div><div class="">I can provide many more details on request.</div><div class=""><br class=""></div><div class="">Christian Schafmeister</div><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="">Professor, Chemistry</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;" class="">Temple University</div>
</div>
<br class=""></div></div><br class="">______________________________<wbr class="">_________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-dev</a><br class="">
<br class=""></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></body></html>