【问题标题】:Multithreaded summation of arrays in PythonPython中数组的多线程求和
【发布时间】:2016-01-13 19:12:15
【问题描述】:

我有两个大小为n1 X n2 的数组,我希望将它们并行相加。我有一个启用了PythonopenMP 构建,但是当我在执行之前在bash shell 中设置export OMP_NUM_THREADS=4 时,我看不到我的代码是多线程的。是否可以多线程方式执行arr = arr + tarr

#!/usr/bin/env python

import numpy as np

n1 = 20000
n2 = 20000

arr = np.random.random_sample((n1,n2))

for i in range(10):
    tarr = np.random.random_sample((n1,n2))
    arr = arr+tarr

【问题讨论】:

  • 你的标题是关于“矢量化”的,但文字是关于“线程化”的。这些是不同的问题。
  • numpy 和/或其库(BLAS 等)使用openMP 构建的吗?
  • 我不认为简单的数组添加是用 BLAS 完成的。点积或方程求解之类的操作是否获得了多线程?
  • 是的,关于矢量化和线程化你是对的。我有两个版本——一个带有 AVX 特定编译,一个没有。 AVX 编译没有得到加速,也没有使用多线程,所以我说两者但没有具体说明区别。道歉。
  • 是的,我使用的版本是使用 Intel MKL 编译的。

标签: python multithreading performance numpy


【解决方案1】:

您的 BLAS 链接仅与线性代数运算(矩阵乘积、求解线性系统等)相关。 numpy 本身不会对数组进行多线程基本元素算术运算(例如加法、非矩阵乘法、求幂等)。

计算多线程的最简单选项之一是使用numexpr

In [1]: import numpy as np

In [2]: import numexpr as ne

In [3]: n1, n2 = 5000, 5000

In [4]: x = np.random.randn(n1, n2)

In [5]: %%timeit y = np.random.randn(n1, n2)
   ...: x + y
   ...: 
1 loops, best of 3: 245 ms per loop

In [6]: %%timeit y = np.random.randn(n1, n2)
   ...: ne.evaluate('x + y')
   ...: 
10 loops, best of 3: 83.6 ms per loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多