Python Numbas并行向量化函数

Python Numbas并行向量化函数,python,numpy,parallel-processing,numba,Python,Numpy,Parallel Processing,Numba,我目前正在试验numba,尤其是vectoriad函数,因此我创建了一个sum矢量化函数(因为很容易将其与np.sum进行比较) 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(n

我目前正在试验
numba
,尤其是
vectoriad
函数,因此我创建了一个
sum
矢量化函数(因为很容易将其与
np.sum
进行比较)

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))
根据
元素的数量
并行代码不会返回与
cpu
目标代码相同的数字。我认为这是因为与常见的线程问题有关(但为什么?这是Numba中的错误还是使用并行执行时发生的事情?)。有趣的是,它有时有效,有时无效。有时在
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
我现在的问题是:为什么我会想要一个并行向量化函数?我的理解是
向量化
函数的目的是提供可能性,但我测试了
减少
累积
,它们在某些(可变)数量的元素上停止工作,谁想要一个不可靠的函数

我正在使用
numba 0.23.1
numpy 1.10.1
python 3.5.1
,你问:

考虑到“并行”矢量化函数可能导致此类问题,它在哪里有意义

鉴于
numba.vectorize(target='parallel')
产生的UFUNC有缺陷的
reduce()
方法,问题是我们能用它们做些什么

在您的例子中,ufunc进行加法运算。这在
target='parallel'
中的一个有用应用是两个数组的元素加法:

numba_sum(array, array)

这确实比单核解决方案快,而且似乎不会受到削弱
reduce()
和朋友的bug的影响。

我怀疑你会更幸运地将它作为bug归档,而不是发布在这里。我的问题实际上不是关于bug,而是关于“并行”的位置矢量化函数可能会导致这样的问题。啊-我明白了。理想情况下,它会在每个线程中保留一个单独的计数器,并将它们添加到一起(以C/Fortran多线程接口为例,查找OpenMP
reduce
,这样做)。如果这样做,答案应该是可重复的(没错!).你确定你的算法在数值上是稳定的吗?是的,我也报告了这个问题