【发布时间】:2017-11-22 11:01:27
【问题描述】:
所以我正在尝试帮助另一个 SO 用户,在此过程中,我无法创建 Cython 程序来在 NumPy 之外做一些简单的事情,这迫使我使用 GIL。所以这使得使用 OpenMP(多核)成为不可能。然后我遇到了一篇有趣的帖子,而您可以从 SciPy 将 Fortran 库直接导入与 NumPy 一起安装的 Cython 代码(BLAS、LAPACK),在我的例子中是 Intel MKL 等效函数。我要做的只是将 2 个 1000x1 维度的向量与另一个向量相乘,然后再进行转置,得到一个 1000x1000 的矩阵。但我找不到可以解决问题的相关 Fortran 例程(相当于 NumPy 乘法)。所有的例程似乎都在做矩阵乘法。所以现在 SciPy 中很酷的功能是将其添加到您的 Cython 模块中:import scipy.linalg.cython_blas as blas 和
cimport scipy.linalg.cython_lapack as lapack 然后理论上我通过调用 blas.dgemm(options) 从 Fortran 库 dgemm 开始,但它执行矩阵乘积,而不仅仅是逐元素乘法。有谁知道 Fortan 模块,它将做 2 个 1000x1 向量的简单乘法,1 个转置,得到一个 1000x1000 矩阵?如果您可以添加输入语法,那就太好了。我将 C 连续内存视图传递给函数,即 [::1] Cython NumPy 向量。
【问题讨论】:
-
您可能不需要这样做。您可以将需要小 GIL 的部分包装在
with gil:块中。乘法(可能)会在内部再次释放 GIL,因此如果您希望这样做,则可以(可能)与其他代码大部分并行运行。 -
@DavidW 你说得对,我不必这样做,但我想将它添加到我的 Cython 工具包中......我一直在使用 Python 和任何我可以加速的东西使用 OpenMP 效果更好。从这个意义上说,让 Fortan 指针直接指向 Scipy 和 Cython 非常有吸引力。
标签: python scipy fortran cython blas