我一直试图将我的C++/CUDA
代码移植到Python/Numba/CUDA
,但是(在GeForce GPU上)产生的性能非常糟糕。这样做的原因是,如果没有另外说明,Numba
将执行float64
中的所有计算。我猜这是有道理的,因为Python
中的所有浮点都是64位。但是,float64
数学中的商用GPU的性能非常糟糕。因此,为了提高代码的性能,我需要将其很多部分手动转换为numba.float32
。这严重污染了我的代码,达到了无法接受的程度。
例如,以下代码:
@numba.cuda.jit(device=True)
def gauss_1d_pdf(x, x0, s):
a = 1 / (s * math.sqrt(2 * math.pi))
return a * math.exp(- (x - x0) * (x - x0) / (2 * s * s))
必须转换为:
@numba.cuda.jit('float32(float32, float32, float32)', device=True)
def gauss_1d_pdf(x, x0, s):
a = numba.float32(1) / (s * math.sqrt(numba.float32(2) * numba.float32(math.pi)))
return a * math.exp(- (x - x0) * (x - x0) / (numba.float32(2) * s * s))
这绝对是不能接受的。
是否有一种方法可以告诉Numba以单精度进行所有操作而不必到处发送垃圾邮件numba.float32(foo)
?