在Cython和NOGIL中使用Fortran NumPy操作,Fortran库相当于NumPy的乘法是什么?

时间:2017-06-20 04:38:15

标签: python scipy fortran cython blas

所以我正在尝试帮助另一个SO用户,在这个过程中我无法创建一个Cython程序在NumPy之外做一些简单的事情,迫使我使用GIL。这使得使用OpenMP(多核)变得不可能。然后我遇到了一个有趣的帖子,你可以从SciPy将Fortran库直接导入到与NumPy一起安装的Cython代码(BLAS,LAPACK)中,在我的案例中是英特尔MKL等效函数。我所要做的就是将2个向量1000x1维度的另一个向量乘以转换的简单向量乘法,得到1000x1000矩阵。但是我找不到相关的Fortran例程(相当于NumPy乘法)。所有例程似乎都是矩阵乘法。所以现在SciPy的一个很酷的功能是将它添加到你的Cython模块:import scipy.linalg.cython_blas as blascimport scipy.linalg.cython_lapack as lapack然后在理论上我通过调用dgemm开始使用Fortran库blas.dgemm(options),但它执行矩阵产品而不仅仅是元素乘法。有没有人知道Fortan模块将进行2个1000x1向量的简单乘法,1个转置,产生1000x1000矩阵?如果你可以添加很棒的输入语法。我将C连续的内存视图传递给函数,即[:: 1] Cython NumPy向量。

1 个答案:

答案 0 :(得分:3)

您所描述的是名为"broadcasting"的纯NumPy功能。这些广播操作使用C(或Cython)代码完成。你总是可以通过Python C API(例如PyNumber_Multiply)在Cython中访问它们(尽管它们可能不会释放GIL)但是Cython中的正常乘法应该委托给那个函数,所以你通常不会这样做。需要直接调用(或导入)它。

BLAS / LAPACK主要用于线性代数的东西,即使你可以"使用"为此目的暴露在那里的功能它不会与NumPy使用(通常)相同。