[Cython] Cython 0.15rc2 and parallelization issue

mark florisson markflorisson88 at gmail.com
Wed Aug 3 14:23:07 CEST 2011


On 3 August 2011 14:18, Francesc Alted <faltet at pytables.org> wrote:
> Hi,
>
> I'm trying to take advantage of the exciting new parallelizing
> capabilities recently introduced in forthcoming 0.15 version, but I'm
> having a small difficulty.  When I try to compile a small demo routing
> (attached), I'm getting this error:
>
> $ cython -a mandel.pyx
>
> Error compiling Cython file:
> ------------------------------------------------------------
> ...
>    for pix in prange(num_pixels, nogil=True, schedule="dynamic"):
>        x = pix % width
>        y = pix // width
>        cr = begin_r + (x * span_r / (width + 1.0))
>        ci = begin_i + (y * span_i / (height + 1.0))
>        n = MandelbrotCalculate(cr, ci, maxiter)
>                              ^
> ------------------------------------------------------------
>
> mandel.pyx:50:31: Calling gil-requiring function not allowed without gil
>
> While trying to figure out why MandelbrotCalculate does require GIL, I
> replaced the "for  prange", by a trivial "for range", and the
> annotated HTML source reveals that the only line in (light) yellow in
> this function is
>
>    return n
>
> which is translated as:
>
>  /* "mandel.pyx":22
>  *         ti = 2*zr*zi + ci
>  *         zr, zi = tr, ti
>  *     return n             # <<<<<<<<<<<<<<
>  *
>  * @cython.boundscheck(False)
>  */
>  __pyx_r = __pyx_v_n;
>  goto __pyx_L0;
>
>  __pyx_r = 0;
>  __pyx_L0:;
>  __Pyx_RefNannyFinishContext();
>  return __pyx_r;
> }
>
> My guess is that this __Pyx_RefNannyFinishContext() call is preventing
> to call the routing from the parallel loop.  Is that a bug, a
> limitation of current implementation or it is just that I'm missing
> something?
>
> Thanks,
>
> --
> Francesc Alted
>
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel
>
>

Hey Francesc!

The problem is that you didn't declare MandelbrotCalculate 'nogil'.
You have to write

    cdef long MandelbrotCalculate(double cr, double ci, long maxiter) nogil:
        ...

That's all, and it will compile :)

Cheers,

Mark


More information about the cython-devel mailing list