对于最多 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)消除大小限制。
现在,我不确定最好的方法。这里的代码展示了如何使用“原始”PyCUDA 制作自定义的普通随机数生成器,以从 CPU 生成的统一随机数中执行 Box-Muller,但我认为使用 CURAND 会更有意义。但是,使用 PyCuda 的 CURAND 接口似乎给了我相同的大小限制(而且,我相信它会产生许多随机数生成器,这会导致高开销 - 这是来自 PyCUDA CURAND API 文档警告here。所以,我想一种可能性是使用PyCUDA 对底层 CURAND 的自定义调用。这都是猜测工作。
但是,我真正的问题是解决上述两个问题的最佳方法。
非常感谢示例、指针和建议。