[Cython] OpenMP support
Dag Sverre Seljebotn
d.s.seljebotn at astro.uio.no
Tue Mar 8 16:28:12 CET 2011
On 03/08/2011 11:34 AM, mark florisson wrote:
> I'd like to implement OpenMP support for Cython. Looking at
Great news! It looks like this will be a topic on the coming workshop,
with Francesc coming as well (but nothing wrong with getting started
before then).
(And please speak up if you are in the right group for a GSoC.)
> http://wiki.cython.org/enhancements/openmp I agree a close
> 1:1 mapping would be nice. It would probably make sense to start with
> support for 'nogil' sections because GIL-holding
> sections would be hard to deal with considering all the 'goto's that
> are generated (because you may not leave the
> OpenMP block). See this thread
> http://comments.gmane.org/gmane.comp.python.cython.devel/8695 for a
> previous discussion.
>
> Looking also at http://wiki.cython.org/enhancements/parallel , for the
> 'parallel for' support I think the best syntax would
> be to introduce a fake 'cython.openmp' module as Dag suggested. I
> propose to start with the following syntax:
>
> from python (c)import openmp
>
> with nogil:
> with openmp.parallel('sections'):
> with openmp.section():
I've changed my opinion a little bit since that thread; I'm now rather
undecided.
Pros:
- Easy to get results fast (nothing wrong about Sturla's approach, but
realistically it *will* take longer to make it work)
- OpenMP already has significant mindshare. Saying "Cython supports
OpenMP" will sound soothing to scientific Fortran and C programmers,
even if it is technically inferior to other solutions we could find.
Cons:
- Like Sturla says, closures maps this better in the Cython language
(having "private=('a', 'b')" as a syntax for referring to the local
variables a and b is rather ugly)
- The goto restriction that makes exception handling harder
I think that long-term we must find some middle ground that sits between
just having the GIL and not having it. E.g., find some way of raising an
exception from a nogil block, and also allow more simple code to "get
more data to work on" within the context of a single thread. So what
you're saying about goto's making me lean against OpenMP.
But, perfect is the enemy of good. I certainly won't vote against having
this implemented -- because *anything* is better than nothing, and
nothing prevents us from building something better in addition to or on
top of an initial OpenMP implementation.
BTW, I found this framework interesting ... it cites some other
frameworks as well (cilk, OpenMP, Intel Threading Blocks), which it
beats in a specific situation.
http://calvados.di.unipi.it/dokuwiki/doku.php?id=ffnamespace:about
I'm NOT saying we should "support FastFlow instead". What I'm thinking
is that perhaps the place to start is to ask ourselves: What are the
current obstacles to using parallelization frameworks written for C or
C++ with Cython? How would one use Cython with these, and do it in a
practical way (i.e. not just C code in a nogil block without even
exception handling).
I.e. what I'd like to tackle first (and perhaps on the workshop) is how
to even make it a somewhat pleasant experience to use pthreads or Python
threading. Set signal handlers for SIGTERM and friends, implement some
form of "delayed" exception creation so that we first pop the stack,
acquire the GIL, and *then* construct the exception object...
But this is perhaps orthogonal to an OpenMP effort.
Dag Sverre
More information about the cython-devel
mailing list