Python 在Cython和NOGIL中使用Fortran NumPy操作,what';Fortran库相当于NumPy乘法吗?

Python 在Cython和NOGIL中使用Fortran NumPy操作,what';Fortran库相当于NumPy乘法吗?,python,scipy,fortran,cython,blas,Python,Scipy,Fortran,Cython,Blas,所以我试图帮助另一个So用户,在这个过程中,我不能创建一个Cython程序来做一些简单的NumPy之外的事情,这迫使我使用GIL。因此,不可能使用OpenMP(多核)。然后我看到了一篇有趣的文章,你可以从SciPy直接将Fortran库导入Cython代码(BLAS,LAPACK),这是与NumPy一起安装的,在我的例子中是与Intel MKL等效的函数。我所要做的就是把两个1000x1维的向量乘以另一个被转置的向量,得到一个1000x1000的矩阵。但是我找不到相关的Fortran例程(相当于

所以我试图帮助另一个So用户,在这个过程中,我不能创建一个Cython程序来做一些简单的NumPy之外的事情,这迫使我使用GIL。因此,不可能使用OpenMP(多核)。然后我看到了一篇有趣的文章,你可以从SciPy直接将Fortran库导入Cython代码(BLAS,LAPACK),这是与NumPy一起安装的,在我的例子中是与Intel MKL等效的函数。我所要做的就是把两个1000x1维的向量乘以另一个被转置的向量,得到一个1000x1000的矩阵。但是我找不到相关的Fortran例程(相当于NumPy乘法)来实现这个功能。所有的例程似乎都做矩阵乘法。因此,SciPy中现在的酷功能是将它添加到Cython模块中:
import SciPy.linalg.Cython_blas as blas

cimport scipy.linalg.cython_lapack作为lapack
然后在理论上我从Fortran库
dgemm
开始,通过调用
blas.dgemm(options)
,但它做矩阵积,而不仅仅是元素乘法。有人知道Fortan模块吗?它将对2个1000x1向量进行简单乘法,1个转置,得到一个1000x1000矩阵?如果你能添加输入语法,那就太好了。我将C连续内存视图传递给函数,即[::1]Cython NumPy vectors。

您所描述的是一个称为的纯NumPy特性。这些广播操作是使用C(或Cython)代码完成的。在Cython中,您始终可以通过Python C API访问这些函数,例如(尽管它们可能不会释放GIL),但Cython中的正常乘法无论如何都应该委托给该函数,因此您通常不需要直接调用(或导入)它


BLAS/LAPACK主要用于线性代数,即使您可以“使用”此处公开的函数,它也不会与NumPy使用的函数相同(通常)。

感谢您的阅读资料。我相信使用Hadamard乘积可以实现2个向量的元素相乘,但这仅限于MKL(也就是说,我在
scipy.linalg.cython_lapack
文件中没有看到定义),尽管如果您知道任何cython示例文件显示如何包含MKL库,这会让我开始学习,
vdmul
是库:您可能不需要这样做。您可以使用GIL:块将需要GIL的小部分包装在
中。乘法(可能)会在内部再次释放GIL,因此如果您希望这样做,则可以(可能)与其他代码并行运行。@DavidW如果您是对的,我不必这样做,但我想将其添加到我的Cython工具包中。。。我一直在使用Python,任何我能用OpenMP加速的东西都会更好。从这个意义上讲,将Fortan指针直接指向Scipy和Cython是非常有吸引力的。