[Cython] Upcoming cython/numpy breakage with stride checking

Sebastian Berg sebastian at sipsolutions.net
Mon Apr 8 09:59:23 CEST 2013


On Mon, 2013-04-08 at 08:42 +0200, Dag Sverre Seljebotn wrote:
> On 04/06/2013 04:19 PM, Nathaniel Smith wrote:
> > Hi all,
> >
> > If you build current numpy master with
> >    NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install
> > then Cython code using ndarrays starts blowing up, e.g.:
> >
> > # foo.pyx
> > def add_one(array):
> >      cdef double[::1] a = array
> >      a[0] += 1.
> >      return array
> >
> >>>> foo.add_one(np.ascontiguousarray(np.arange(10.)[::100]))
> > Traceback (most recent call last):
> >    File "<stdin>", line 1, in <module>
> >    File "foo.pyx", line 2, in foo.add_one (foo.c:1210)
> >      cdef double[::1] a = array
> > ValueError: Buffer and memoryview are not contiguous in the same dimension.
> >
> > The problem (as discussed before) is that Cython has an unnecessarily
> > strict definition of "contiguous", so NPY_RELAXED_STRIDES_CHECKING=1
> > pretty much breaks all existing compiled Cython modules.
> >
> > Our plan is to make NPY_RELAXED_STRIDES_CHECKING=1 into the default
> > sooner or later, and Cython is a major blocker on this plan. It may
> > become the default as soon as the 1.8 pre-releases (with the
> > expectation that we'll probably have to switch back again before the
> > actual release, but still).
> >
> > References:
> >
> > Previous thread:
> >    http://thread.gmane.org/gmane.comp.python.cython.devel/14634
> > Detailed discussion of the difference between numpy/cython's current
> > definition of "contiguity", and the correct definition:
> >    http://thread.gmane.org/gmane.comp.python.cython.devel/14634/focus=14640
> > The PR implementing NPY_RELAXED_STRIDES_CHECKING:
> >    https://github.com/numpy/numpy/pull/3162
> > Another test case:
> >    https://github.com/numpy/numpy/issues/2956
> >
> > We're hoping that Cython will also switch soon to the more accurate
> > check for contiguity. This shouldn't cause any backwards compatibility
> > problems -- it just means Cython code would make strictly fewer
> > copies, and error out due to lack of contiguity strictly less often,
> > even with older numpys. And it seems like a necessary step for getting
> > this untangled and minimizing user pain. What do you think?
> 
> I agree that we should follow NumPy here, but can't see myself having 
> time to do the change in near future. I don't know about Mark?
> 
> I think it is a fairly simple change though if any NumPyers would like 
> to do it, look at in Cython/Utility/MemoryView_C.c in the function
> 
> _pyx_memviewslice_is_contig
> 
> looks like it should just be to add a check for shape too.
> 
> I guess you have changed your implementation of PEP 3118 too slightly on 
> the NumPy side? Is this undefined in the PEP or are you now not in 
> strict adherence to it?
> 

Hi,

maybe I will have a look at that, but not sure if I will manage.  The
PEP 3118 is a point, but it does not seem to cover this (probably we
should try to get a clarification into 3118).  I am still wondering
whether for buffers that are requested contiguous numpy should set the
strides again, since it cannot hurt.  Would that make a difference for
Cython? I expected Cython just got any buffer and then checked the
strides instead of requesting the buffer contiguous and then double
checking.

Regards,

Sebastian

> Dag Sverre
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel
> 




More information about the cython-devel mailing list