对于最多100000(1M)的numDraws,我可以轻松地执行以下操作
def Simple_Elt(numDraws):
import numpy as np
gauss = np.random.normal
import pycuda.gpuarray as ga
from pycuda.cumath import exp as gaexp
import pycuda.autoinit
from pycuda.elementwise import ElementwiseKernel
npgausses = gauss(size=(numDraws,)).astype(np.float32)
gausses = ga.to_gpu(npgausses)
eltComp = """p[i] = exp(p[i]);"""
kernel = ElementwiseKernel("float *p", eltComp, "expnorm")
kernel(gausses)
sumEN = ga.sum(gausses).get()
Simple_Elt(1000000)
然而,对于N = 10000000(10M),当将随机值传输到GPU时,我的GPU内存耗尽。我想一次解决两个问题:(1)有效地使用GPU生成随机数,(2)删除大小限制。
现在,我不确定最好的方法。代码here显示了如何使用“原始”PyCUDA从CPU生成的统一random创建Box-Muller的自定义正常随机数生成器,但我认为使用CURAND会更有意义。然而,使用PyCuda的CURAND接口似乎给了我相同的大小限制(并且,我相信它会使许多随机数生成器导致高开销 - 来自PyCUDA CURAND API文档警告here。所以,我想,可能性是使用PyCUDA对基础CURAND的自定义调用。这都是猜测工作。
但是,我真正的问题是解决上述两个问题的最佳方法。
非常感谢示例,指针和建议。