【问题标题】:Is it possible to know which SciPy / NumPy functions run on multiple cores?是否有可能知道哪些 SciPy / NumPy 函数在多个内核上运行?
【发布时间】:2011-08-04 12:33:02
【问题描述】:

我试图明确地弄清楚 SciPy/NumPy 中的哪些函数在多个处理器上运行。我可以例如在 SciPy 参考手册中阅读 SciPy 使用它,但我更感兴趣的是哪些函数确实运行并行计算,因为并非所有函数都这样做。理想的情况当然是在您键入 help(SciPy.foo) 时包含它,但情况似乎并非如此。

任何帮助将不胜感激。

最好的,

马蒂亚斯

【问题讨论】:

  • 这有点难以回答,因为在某种程度上它取决于 BLAS/LAPACK 库而不是 numpy/scipy。例如,MKL (software.intel.com/en-us/articles/intel-mkl) 可能会使用多个内核,而其他库可能不会。
  • 您是否想到了某种类型的功能?
  • @aix 我在考虑一般的 SciPy,但可能更关注线性代数函数。我看到了,例如scipy.linalg.solve 使用多个核心(只需检查我的系统监视器以查看核心的活动)。

标签: python multiprocess


【解决方案1】:

我认为这个问题最好解决您使用的 BLAS/LAPACK 库而不是 SciPy/NumPy。

一些 BLAS/LAPACK 库,例如 MKL,在其他实现可能不使用的情况下本机使用多个内核。

scipy.linalg.solve为例,下面是它的源代码(为清楚起见省略了一些错误处理代码):

def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0,
          debug = 0):
    if sym_pos:
        posv, = get_lapack_funcs(('posv',),(a1,b1))
        c,x,info = posv(a1,b1,
                        lower = lower,
                        overwrite_a=overwrite_a,
                        overwrite_b=overwrite_b)
    else:
        gesv, = get_lapack_funcs(('gesv',),(a1,b1))
        lu,piv,x,info = gesv(a1,b1,
                             overwrite_a=overwrite_a,
                             overwrite_b=overwrite_b)

    if info==0:
        return x
    if info>0:
        raise LinAlgError, "singular matrix"
    raise ValueError,\
          'illegal value in %-th argument of internal gesv|posv'%(-info)

如您所见,它只是两个 LAPACK 函数系列(例如 DPOSVDGESV)的薄包装。

在 SciPy 级别上没有并行性,但您可以在系统上使用多个内核观察该功能。唯一可能的解释是您的 LAPACK 库能够使用多个内核,无需 NumPy/SciPy 做任何事情来实现这一点

【讨论】:

  • 感谢您提供有用的答案。我有使用 MKL 的 Enthoughts 2.7.1 python,所以我的状态很好。
  • 我们如何找出哪些 BLAS/LAPACK 函数并行运行?
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2021-02-22
  • 2016-08-19
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多