使用PyCUDA + CURAND生成许多随机模拟

时间:2013-01-17 17:12:47

标签: pycuda

对于最多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的自定义调用。这都是猜测工作。

但是,我真正的问题是解决上述两个问题的最佳方法。

非常感谢示例,指针和建议。

0 个答案:

没有答案