<html><head></head><body dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><meta http-equiv="Content-Type" content="text/html charset=utf-8"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" 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" 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" class="">https://github.com/drmeister/clasp/blob/analyze/include/clasp/llvmo/llvmoExpose.h#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" class="">https://github.com/drmeister/clasp/blob/dev/src/llvmo/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" class="">https://github.com/drmeister/clasp/blob/analyze/src/lisp/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="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">Professor, Chemistry</div><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">Temple University</div>
</div>
<br class=""></div></body></html>