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。
有人能告诉我吗?
答案 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)