Re: [Numpy-discussion] Fwd: Re: Calling BLAS functions from Python

Jens Jørgen Mortensen <[email protected]> Fri, 30 Aug 2019 10:19:48 +0200
Newsgroups gmane.comp.python.scientific.user
Message-ID <[email protected]>
On 8/27/19 8:04 PM, Ilhan Polat wrote:
> The inplace overwriting is done if f2py can forward the original array 
> down to the low level.
> 
> When it is not contiguous then it has to somehow marshall the view into 
> a compatible array and that is when the inbetween array is formed. And 
> also that array can also be overwritten but that would not be the 
> original view you started with. Hence it is kind of a convenience cost 
> you pay.
> 
> Cython might be a better option for you such that you can pass things 
> around via memory views and cython wrappers of BLAS.

Thanks - I'll look into that.

Jens Jørgen

> On Tue, Aug 27, 2019, 16:40 Jens Jørgen Mortensen <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>     Sorry!  Stupid me, asking scipy questions on numpy-discussion.  Now
>     continuing on scipy-user.  Any help is much appreciated.  See short
>     numpy-discussion thread here:
>     https://mail.python.org/pipermail/numpy-discussion/2019-August/079945.html
> 
> 
>     Hi!
> 
>     I'm trying to use dgemm, zgemm and friends from scipy.linalg.blas to
>     multiply matrices efficiently.  As an example, I'd like to do:
> 
>           c += a.dot(b)
> 
>     using whatever BLAS scipy is linked to and I want to avoid copies of
>     large matrices.  This works the way I want it:
> 
>       >>> import numpy as np
>       >>> from scipy.linalg.blas import dgemm
>       >>> a = np.ones((2, 3), order='F')
>       >>> b = np.ones((3, 4), order='F')
>       >>> c = np.zeros((2, 4), order='F')
>       >>> dgemm(1.0, a, b, 1.0, c, 0, 0, 1)
>     array([[3., 3., 3., 3.],
>              [3., 3., 3., 3.]])
>       >>> print(c)
>     [[3. 3. 3. 3.]
>        [3. 3. 3. 3.]]
> 
>     but if c is not contiguous, then c is not overwritten:
> 
>       >>> c = np.zeros((7, 4), order='F')[:2, :]
>       >>> dgemm(1.0, a, b, 1.0, c, 0, 0, 1)
>     array([[3., 3., 3., 3.],
>              [3., 3., 3., 3.]])
>       >>> print(c)
>     [[0. 0. 0. 0.]
>        [0. 0. 0. 0.]]
> 
>     Which is also what the docs say, but I think the raw BLAS function
>     dgemm
>     could do the update of c in-place by setting LDC=7.  See here:
> 
>     http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html
> 
>     Is there a way to call the raw BLAS function from Python?
> 
>     I found this capsule thing, but I don't know if there is a way to call
>     that (maybe using ctypes):
> 
>       >>> from scipy.linalg import cython_blas
>       >>> cython_blas.__pyx_capi__['dgemm']
>     <capsule object "void (char *, char *, int *, int *, int *,
>     __pyx_t_5scipy_6linalg_11cython_blas_d *,
>     __pyx_t_5scipy_6linalg_11cython_blas_d *, int *,
>     __pyx_t_5scipy_6linalg_11cython_blas_d *, int *,
>     __pyx_t_5scipy_6linalg_11cython_blas_d *,
>     __pyx_t_5scipy_6linalg_11cython_blas_d *, int *)" at 0x7f06fe1d2ba0>
> 
>     Best,
>     Jens Jørgen
>     _______________________________________________
>     NumPy-Discussion mailing list
>     [email protected] <mailto:[email protected]>
>     https://mail.python.org/mailman/listinfo/numpy-discussion
> 
> 
> _______________________________________________
> SciPy-User mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/scipy-user
> 

_______________________________________________
SciPy-User mailing list
[email protected]
https://mail.python.org/mailman/listinfo/scipy-user