【发布时间】:2018-02-17 11:09:49
【问题描述】:
在这个(愚蠢的)示例中,我试图通过计算 (0, 1) x (0, 1) 中落入单位圆的随机选择点的数量来计算 pi。
@guvectorize(['void(float64[:], int32, float64[:])'], '(n),()->(n)', target='cuda')
def guvec_compute_pi(arr, iters, res):
n = arr.shape[0]
for t in range(n):
inside = 0
for i in range(iters):
x = np.random.random()
y = np.random.random()
if x ** 2 + y ** 2 <= 1.0:
inside += 1
res[t] = 4.0 * inside / iters
编译时弹出这个异常:
numba.errors.UntypedAttributeError: Failed at nopython (nopython frontend)
Unknown attribute 'random' of type Module(<module 'numpy.random' from '...'>)
File "scratch.py", line 34
[1] During: typing of get attribute at /.../scratch.py (34)
我天真地认为使用here 描述的 RNG 可以解决问题。我修改后的代码如下:
@guvectorize(['void(float64[:], int32, float64[:])'], '(n),()->(n)', target='cuda')
def guvec_compute_pi(arr, iters, res):
n = arr.shape[0]
rng = create_xoroshiro128p_states(n, seed=1)
for t in range(n):
inside = 0
for i in range(iters):
x = xoroshiro128p_uniform_float64(rng, t)
y = xoroshiro128p_uniform_float64(rng, t)
if x ** 2 + y ** 2 <= 1.0:
inside += 1
res[t] = 4.0 * inside / iters
但是会弹出类似的错误:
numba.errors.TypingError: Failed at nopython (nopython frontend)
Untyped global name 'create_xoroshiro128p_states': cannot determine Numba type of <class 'function'>
File "scratch.py", line 28
当我尝试更改为target='parallel' 时,使用numpy.random.random 的原始代码无论nopython=True 与否都可以正常工作。是什么导致了target='cuda' 的问题,有没有办法在@guvectorize-d 块中获取随机数?
【问题讨论】:
标签: numba