我目前正在尝试使用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种可能性,但我测试了reduce
和accumulate
并且它们停止了一些(可变)元素的工作谁想要一个不可靠的功能?
我正在使用numba 0.23.1
,numpy 1.10.1
和python 3.5.1
。
答案 0 :(得分:0)
你问:
&#34; parallel&#34;矢量化函数有意义,因为它可能导致这样的问题
鉴于numba.vectorize(target='parallel')
生成的ufuncs方法有reduce()
个缺陷,问题是我们可以用它们做些什么呢?
在你的情况下,ufunc会添加。这个与target='parallel'
的有用应用是逐个添加两个数组:
numba_sum(array, array)
这确实比单核解决方案更快,似乎不会受到导致reduce()
和朋友瘫痪的错误的影响。