On 07/03/2013 03:39 AM, Jakub Jelinek wrote:
> Hi!
> 
> This is the compiler side of the #pragma omp cancel and #pragma omp
> cancellation point support.  On the library side what is needed is:
> 1) GOMP_cancellation_point now returns a bool (whether the relevant
>    cancellation was observed)
> 2) GOMP_cancel now has two arguments instead of just one, and returns
>    bool like GOMP_cancellation_point.  If the second argument is false,
>    it acts just like GOMP_cancellation_point, if it is true, it cancels
>    the given construct.  For both these calls the first argument is
>    1 for parallel cancellation, 2 for loop cancellation, 4 for sections and
>    8 for taskgroup cancellation.
> 3) GOMP_barrier_cancel which is like GOMP_barrier, but should check
>    for pending parallel cancellation and if parallel is cancelled, should
>    return true
> 4) GOMP_sections_end_cancel and GOMP_loop_end_cancel variants to the
>    non-cancel libcalls for the cancellation checking implicit barriers
> 
> The still unsolved problems are that for firstprivate/lastprivate
> for, copyin_ref we add an implicit barrier that isn't really in the standard
> and similarly for #pragma omp single copyprivate we don't use one barrier
> mandated by the standard, but actually two barriers.  Not sure what exactly
> we want as the behavior for these.  As some subset of threads can be
> canceled before reaching the unofficial barrier (say one with #pragma omp
> cancel parallel before reaching the omp for or omp single copyprivate)
> and some others with #pragma omp cancellation point parallel, while some
> threads hit the unofficial barrier before the cancellation (and optionally
> some afterwards), do we want in the library to just arrange for all barriers
> to be awaken and not block until the final barrier at the end of parallel is
> hit, and for the unofficial barriers just not to return anything, while
> for the official barriers (*_cancel suffixed) return true to signal jump to
> end of region with running dtors?
> 
> Or perhaps keep track on how many threads in parallel have already observed
> the cancellation and wait on non-*_cancel barriers only for the rest of the
> threads that haven't observed it yet, and only on the *_cancel barriers
> observe it for all threads.
> 
> Another issue is what if the dtors executed on the way contain barriers,
> but that is probably ruled out by the restriction that 
> "A construct that may be subject to cancellation must not encounter an 
> orphaned
> cancellation point."
> 
> Queuing this patch until we have a library implementation.
I've committed the patch, so that I can more easily work on the library
implementation.  There was one minor patch conflict that needed resolving.


r~

Reply via email to