【问题标题】:Are numpy's basic operations vectorized, i.e. do they use SIMD operations?numpy 的基本操作是否矢量化,即它们是否使用 SIMD 操作?
【发布时间】:2017-12-10 04:38:00
【问题描述】:

我正在做一些性能分析,我想知道,当数据类型已知 (double) 时,numpy 是否对其标准数组操作进行矢量化。

a, b = (some numpy arrays)
c = a + b #Is this vectorized?

编辑: 此操作是否矢量化,即计算是否包含 SIMD 操作?

【问题讨论】:

  • 嗯...是吗?为什么你会不这么认为?
  • “矢量化”在什么意义上?如果您正在考虑硬件级 SIMD 操作,那么在 NumPy 上下文中使用该词的通常含义可能不是您所想的。

标签: python python-3.x numpy


【解决方案1】:

我注意到 Quazi Irfan 对 henrikstroem 的回答发表了评论,其中说 numpy 没有利用矢量化,并引用了作者通过实验做出“证明”的博客。

所以我浏览了博客,发现存在差距可能会得出不同的结论:对于numpy-array a和b,算术a * b与np.dot(a,b)不同。算术(a *b) 博客作者测试的只是标量乘法,不是矩阵乘法(np.dot(a,b)),甚至不是向量内积。但作者仍然使用a*b与原始实验进行比较运行 np.dot(a,b)。这两个算术的复杂度差别太大了!

numpy 肯定会利用 SIMD 和 BLAS 向量化,可以在其源代码中找到。官方的 numpy 发行版支持一组并行操作(如 np.dot),但不是每个函数(如 np.where、np. mean).博客作者可能会选择一个不合适的函数(一个未向量化的函数)进行比较。

我们还可以看到,关于多核 CPU 使用率。在执行 numpy.dot() 时,所有内核都在执行高使用率。因此 numpy 必须已矢量化(通过 BLAS)以避免仅使用单个内核因为 CPython 的 GIL 限制。

【讨论】:

  • 1) 你能提供这篇博文吗? 2)线程级并行与指令级并行无关。
【解决方案2】:

是的,他们是。

/*
 * This file is for the definitions of simd vectorized operations.
 *
 * Currently contains sse2 functions that are built on amd64, x32 or
 * non-generic builds (CFLAGS=-march=...)
 * In future it may contain other instruction sets like AVX or NEON     detected
 * at runtime in which case it needs to be included indirectly via a file
 * compiled with special options (or use gcc target attributes) so the binary
 * stays portable.
 */

链接:Numpy simd.inc.src on github.

【讨论】:

  • 实际上,NumPy 没有。 Here 是一篇通过 NumPy 代码并通过矩阵乘法演示的文章。
  • @QuaziIrfan 文章的标题是“向量化”,但实际上只寻找“并行化”,并且唯一的结论是:“它没有利用并行化”。所以它对 SIMD 没有任何意义。
  • 这是否意味着只有 float16 或 float32 才能从 x86 架构上的 SIMD 中受益?
【解决方案3】:

看一下基本示例

import numpy as np

x = np.array([1, 2, 3], np.int32)
print (type(x))
y = np.array([6, 7, 8], np.int32)
print (type(y))

现在我们将这两个数组相加

z=x+y
print (z)
print (type(z))

结果我们有

<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
[ 7  9 11]
<class 'numpy.ndarray'>

向量化,是的。但是术语向量在数学和物理中具有不同的含义,我们使用数组作为数学抽象。

【讨论】:

  • 我没有投反对票,但我不明白这个答案实际上是如何解决 OP 的问题的。
  • @EJoshuaS-ReinstateMonica 检查问题的编辑,这个答案是针对原始问题发布的,它没有说明它询问的是 SIMD 矢量化,所以这个答案在编辑之前是有效的。
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多