Numbas并行矢量化函数

时间:2016-02-17 14:12:56

标签: python numpy parallel-processing numba

我目前正在尝试使用numba,尤其是vectorized函数,因此我创建了一个sum向量化函数(因为很容易将其与np.sum进行比较。< / p>

import numpy as np
import numba as nb

@nb.vectorize([nb.float64(nb.float64, nb.float64)])
def numba_sum(element1, element2):
    return element1 + element2

@nb.vectorize([nb.float64(nb.float64, nb.float64)], target='parallel')
def numba_sum_parallel(element1, element2):
    return element1 + element2

array = np.ones(elements)
np.testing.assert_almost_equal(numba_sum.reduce(array), np.sum(array))
np.testing.assert_almost_equal(numba_sum_parallel.reduce(array), np.sum(array))

根据elements的数量,并行代码不会返回与cpu目标代码相同的数字。我认为这是因为与通常的线程问题相关的事情(但为什么?这是Numba中的Bug还是在使用并行执行时才发生的事情?)。有趣的是,它有时会起作用,有时则不然。有时它会因elements=1000失败而有时会在elements=100000上失败。

例如:

AssertionError: 
Arrays are not almost equal to 7 decimals
 ACTUAL: 93238.0
 DESIRED: 100000.0

如果我再次运行

AssertionError: 
Arrays are not almost equal to 7 decimals
 ACTUAL: 83883.0
 DESIRED: 100000.0

我现在的问题是:为什么我想要一个并行矢量化函数?我的理解是vectorized函数的目的是提供numpy-ufunc种可能性,但我测试了reduceaccumulate并且它们停止了一些(可变)元素的工作谁想要一个不可靠的功能?

我正在使用numba 0.23.1numpy 1.10.1python 3.5.1

1 个答案:

答案 0 :(得分:0)

你问:

  

&#34; parallel&#34;矢量化函数有意义,因为它可能导致这样的问题

鉴于numba.vectorize(target='parallel')生成的ufuncs方法有reduce()个缺陷,问题是我们可以用它们做些什么呢?

在你的情况下,ufunc会添加。这个与target='parallel'的有用应用是逐个添加两个数组:

numba_sum(array, array)

这确实比单核解决方案更快,似乎不会受到导致reduce()和朋友瘫痪的错误的影响。