2

PyCUDA 文档对我们这些“非大师”类中的示例有点轻,但我想知道 gpuarrays 上的数组操作可用的操作,即。如果我想 gpuarray 这个循环;

m=np.random.random((K,N,N))
a=np.zeros_like(m)
b=np.random.random(N) #example
for k in range(K):
    for x in range(N):
        for y in range(N):
            a[k,x,y]=m[k,x,y]*b[y]

为此,常规的第一站 python 减少将类似于

for k in range(K):
    for x in range(N):
        a[k,x,:]=m[k,x,:]*b

但是我看不到使用 GPUArray 执行此操作的任何简单方法,除了编写自定义元素内核之外,即使遇到这个问题,内核中也必须有循环结构,在那个复杂点上,我可能会更好只写我自己成熟的 SourceModule 内核。

任何人都可以提示我吗?

4

2 回答 2

2

这可能最好用你自己的内核来完成。虽然 PyCUDA 的 gpuarray 类是一种非常方便的 GPU 内存抽象,可以与 numpy 数组互换使用,但除了固定线性代数和并行归约操作之外,无需为 GPU 编写任何代码。

也就是说,这是一个非常简单的小内核。如此微不足道,它将受到内存带宽的限制——您可能想看看是否可以将一些类似的操作“融合”在一起,以稍微提高 FLOPS 与内存事务的比率。

如果您在内核方面需要一些帮助,请发表评论,我可以扩展答案以包含一个粗略的原型。

于 2011-04-18T20:23:17.947 回答
2

您还可以使用memcpy_dtod()gpuarrays 的方法和切片功能。奇怪的是正常分配不起作用。set()不起作用,因为它假定主机到设备传输(使用memcpy_htod())。

    for k in range(K):
        for x in range(N):
            pycuda.driver.memcpy_dtod(a[k,x,:].gpudata, (m[k,x,:]*b).gpudata, a[k,x,:].nbytes)
于 2013-08-01T13:50:41.630 回答