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
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to