[LLVMdev] Finding safe thread suspension points while JIT-ing (was: Add pass run listeners to the pass manager.)
Chandler Carruth
chandlerc at google.com
Thu May 15 09:59:50 PDT 2014
I generally like the API being proposed, especially structurally.
On Thu, May 15, 2014 at 10:50 AM, Philip Reames
<listmail at philipreames.com>wrote:
> Given the use case (user mode scheduling), I'm not going to oppose this
> proposal. I would like to see a couple of things clarified documentation
> wise:
> - When is this interface valid? (i.e. the single thread case)
> - If a context does have multiple threads, is this called once per
> thread? Or once per thread group after internal coordination? (you can
> write this out of scope if desired)
> - If we later introduce multiple threads, and this mechanism doesn't
> support it, what will happen? Will the function just not be called?
> - You hint at this already, but clarifying the state of the current
> context at a suspend point would be helpful.
>
+1, i think clarifying a lot of this context and getting it baked into the
docs is key.
>
> Here's a possible draft that includes the above:
> The may-suspend callback function may be called by LLVM to transfer
> control back to the client that invoked the LLVM compilation. This can be
> used to yield control of the thread, or perform periodic work needed by the
> client. There is no guaranteed frequency at which callbacks must occur; in
> fact, the client is not guaranteed to ever receive this callback. It is at
> the sole discretion of LLVM to do so and only if it can guarantee that
> suspending the thread won't block any forward progress in other LLVM
> contexts.
>
> At a suspend point, the state of the current LLVM context is intentionally
> undefined. No assumptions about it can or should be made. In particular,
> call backs into the context are not supported until the suspend function
> returns control to LLVM. Other LLVM contexts are unaffected.
>
> Currently, LLVM assumes one thread per LLVM context. If, or when, we
> introduce multiple threads, this interface will not be available for
> contexts which opt-in to the thread pool model. We may extend this
> interface at a later time to support thread pools, but for the moment, that
> use case is explicitly unsupported.
>
>
> p.s. Bikeshed wise, might "yield" be a better term than "suspend" here?
>
I have to say I like yield better. I'm not set on it.
I don't think we need the "may" prefix either way. Wether or not (or for
how long) a suspension happened is (necessarily) not something that LLVM
should be observing. I think the caller should be assuming that it *will*
happen, and so the API needn't be cagey about it.
>
> Philip
>
>
> On 05/13/2014 11:49 AM, Juergen Ributzka wrote:
>
> Sounds good. Lets get started by nailing down the C API and semantics for
> this first.
>
> I mirrored the C API for the LLVM context diagnostic handler and used
> Andy’s suggested name for the callback.
> The opaque handle was suggested by Duncan and can provide optional user
> specified information that is
> provided back during the callback (i.e. barrier, etc).
>
> Cheers,
> Juergen
>
> Core.h:
> typedef void (*LLVMMaySuspendCallback)(LLVMContextRef, void *);
>
> /**
> * Set the may-suspend callback function for this context.
> *
> * @see LLVMContext::setMaySuspendCallback()
> */
> void LLVMContextSetMaySuspendCallback(LLVMContextRef C,
> LLVMMaySuspendCallback Callback,
> void *OpaqueHandle);
>
> LLVMContext.h:
> /// \brief Registers a may-suspend callback with the context.
> ///
> /// The may-suspend callback function may be called by LLVM to transfer
> /// control back to the client that invoked the LLVM compilation. The
> client
> /// is not garantueed to ever receive this callback. It is at the sole
> /// discretion of LLVM to do so and only if it can guarantee that
> suspending
> /// the thread won't block any forward progress in other LLVM contexts.
> void setMaySuspendCallback(MaySuspendCallbackTy Callback, void
> *OpaqueHandle);
>
> /// \brief Calls the may-suspend callback (if applicable).
> ///
> /// This transfers control back to the client, which may suspend the
> current
> /// thread. Only call this method when LLVM doesn't hold any global mutex
> or
> /// cannot block the execution in another LLVM context.
> void callMaySuspendCallback();
>
> On May 12, 2014, at 5:26 PM, Nick Lewycky <nlewycky at google.com> wrote:
>
> Would you (or anyone) oppose a simple maySuspendContext() callback API?
>> It would mean nothing more than the thread(s) for a given LLVM context can
>> be suspended independent from other contexts.
>>
>
> I think this is the right approach. So a given thread hits a safe point,
> it optionally calls a "suspend check" or "i an safe to suspend right now"
> callback if set. It doesn't stop other threads, it doesn't continue until
> the function returns.
>
> If you want to stop all threads then the user callback may contain a
> barrier and count down how many threads have stopped until it sees all of
> them.
>
> Nick
>
>
>
>
> _______________________________________________
> LLVM Developers mailing listLLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140515/258008e3/attachment.html>
More information about the llvm-dev
mailing list