PyCUDA文档对于我们这些“非古鲁”类的例子来说有点轻描淡写,但我想知道gpuarray上的数组操作可用的操作,即如果我想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

但是我看不出有什么简单的方法来处理这个问题,除了编写一个定制的元素内核之外,即使是这个问题,在内核中也必须有循环结构,在这个复杂点上,我可能只需要编写我自己的完整的源代码内核。
有人能告诉我吗?

最佳答案

用你自己的内核可能做得最好。虽然PyCUDA的gpuarray类是一个非常方便的GPU内存抽象,可以与numpy数组互换使用,但是除了封闭的线性代数和并行归约操作之外,不需要为GPU编写任何代码。
也就是说,它是一个非常微不足道的小内核。如此琐碎以至于内存带宽受限——您可能想看看是否可以将一些类似的操作“融合”在一起,从而稍微提高触发器与内存事务的比率。
如果您需要一些关于内核的帮助,请插入一个注释,我可以将答案扩展为包含一个粗略的原型。

关于python - PyCUDA GPUArray基于切片的操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5708319/

10-12 22:10
查看更多