我有下面的代码来确认一个手写的方法来计算两个方阵的kronecker积。第一部分确实验证了我的重复和平铺方法a
和{
import pyopencl as cl
import numpy
from time import time
N = 3
num_iter = 1
a = numpy.random.rand(N,N)
b = numpy.random.rand(N,N)
c = numpy.kron(a, b)
abig = numpy.repeat(numpy.repeat(a,N,axis=1),N,axis=0)
bbig = numpy.tile(b,(N,N))
cbig = abig*bbig
print(numpy.allclose(c,cbig))
然后我尝试使用PyOpenCL将这个乘法移植到GPU。我首先在GPU内存上分别分配biga
和{d_a
和{h_C
分配为主机上的空数组,d_C
作为设备上相同大小的数组。在
以下是GPUTest.cl.测试公司名称:
^{3}$然而,我的输出并不接近。我相信我的错误在于如何处理线程id。从另一个关于矩阵点积的例子中,我认为id基本上是元素在块中的位置,因为这是元素方面的,所以我只需要从A和B中提取相同位置的元素,将它们相乘在一起。是否需要将这些id合并到一个索引中,以更好地解决实际分配内存的方式?在
但有没有一种方法可以利用平铺或内存共享方法?这只是一个简单的计算方法的尝试,我希望得到一个不需要重复/平铺版本的a
和{a
的单个元素,将b
的整体性乘以它,然后将结果存储在c
的分片中。在
我也为kronecker产品开发了一个内核。我将把它放在这里作为参考。为
A#B=C
其中#是the kronecker product,A是m-x-n-矩阵,B是p-x-q-矩阵,C是x-x-y-矩阵,x=mp和y=nq,下面的内核将计算C:
来自PyOpenCL的电话是:
^{pr2}$问题是内核没有为输入和输出内存地址获取索引。参数应该是
C[i+j*N]
,以便在整个内存块中适当地移动。在相关问题 更多 >
编程相关推荐