PyCUDA GPUArray基于切片的操作

时间:2011-04-18 20:11:47

标签: python multidimensional-array cuda gpu pycuda

PyCUDA文档对于我们这些'Non-Guru'类的例子有点了解,但是我想知道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。

有人能告诉我吗?

2 个答案:

答案 0 :(得分:2)

最好用自己的内核完成。虽然PyCUDA的gpuarray类是一个非常方便的GPU内存抽象,可以与numpy数组互换使用,但是没有必要为GPU以外的任何线性代数和并行减少代码编写代码操作

那就是说,这是一个非常简单的小内核。如此微不足道,这将是内存带宽限制 - 您可能想看看是否可以"融合"有些人喜欢一起操作,以提高FLOPS与内存事务的比例。

如果您需要有关内核的帮助,请发表评论,我可以扩展答案以包含粗略的原型。

答案 1 :(得分: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)