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多线程接口为例,查找OpenMPreduce
,这样做)。如果这样做,答案应该是可重复的(没错!).你确定你的算法在数值上是稳定的吗?是的,我也报告了这个问题