【问题标题】:Using Fortran NumPy operations in Cython with NOGIL, what's the Fortran library equivalent to NumPy multiply?在带有 NOGIL 的 Cython 中使用 Fortran NumPy 操作,相当于 NumPy 乘法的 Fortran 库是什么?
【发布时间】: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 blascimport 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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2021-01-08
  • 2020-06-03
相关资源
最近更新 更多