【发布时间】:2018-12-12 14:54:29
【问题描述】:
我正在使用 numba cuda 来计算一个函数。
代码只是简单地将所有值相加成一个结果,但 numba cuda 给我的结果与 numpy 不同。
数字代码
import math
def numba_example(number_of_maximum_loop,gs,ts,bs):
from numba import cuda
result = cuda.device_array([3,])
@cuda.jit(device=True)
def BesselJ0(x):
return math.sqrt(2/math.pi/x)
@cuda.jit
def cuda_kernel(number_of_maximum_loop,result,gs,ts,bs):
i = cuda.grid(1)
if i < number_of_maximum_loop:
result[0] += BesselJ0(i/100+gs)
result[1] += BesselJ0(i/100+ts)
result[2] += BesselJ0(i/100+bs)
# Configure the blocks
threadsperblock = 128
blockspergrid = (number_of_maximum_loop + (threadsperblock - 1)) // threadsperblock
# Start the kernel
cuda_kernel[blockspergrid, threadsperblock](number_of_maximum_loop,result,gs,ts,bs)
return result.copy_to_host()
numba_example(1000,20,20,20)
输出:
array([ 0.17770302, 0.34166728, 0.35132036])
numpy 代码
import math
def numpy_example(number_of_maximum_loop,gs,ts,bs):
import numpy as np
result = np.zeros([3,])
def BesselJ0(x):
return math.sqrt(2/math.pi/x)
for i in range(number_of_maximum_loop):
result[0] += BesselJ0(i/100+gs)
result[1] += BesselJ0(i/100+ts)
result[2] += BesselJ0(i/100+bs)
return result
numpy_example(1000,20,20,20)
输出:
array([ 160.40546935, 160.40546935, 160.40546935])
我不知道我哪里错了。我想我可能会使用减少。但是用一个 cuda 内核完成它似乎是不可能的。
【问题讨论】:
-
是的,需要适当的并行缩减。