PyOpenCL Kronecker产品内核

2024-07-05 10:58:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来确认一个手写的方法来计算两个方阵的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作为设备上相同大小的数组。在

^{pr2}$

以下是GPUTest.cl.测试公司名称:

^{3}$

然而,我的输出并不接近。我相信我的错误在于如何处理线程id。从另一个关于矩阵点积的例子中,我认为id基本上是元素在块中的位置,因为这是元素方面的,所以我只需要从A和B中提取相同位置的元素,将它们相乘在一起。是否需要将这些id合并到一个索引中,以更好地解决实际分配内存的方式?在

但有没有一种方法可以利用平铺或内存共享方法?这只是一个简单的计算方法的尝试,我希望得到一个不需要重复/平铺版本的a和{}的算法。取a的单个元素,将b的整体性乘以它,然后将结果存储在c的分片中。在


Tags: 方法importnumpyid元素gputimecl
2条回答

我也为kronecker产品开发了一个内核。我将把它放在这里作为参考。为

A#B=C

其中#是the kronecker product,A是m-x-n-矩阵,B是p-x-q-矩阵,C是x-x-y-矩阵,x=mp和y=nq,下面的内核将计算C:

__kernel void kroneckerProdFast(__global float* res,
                                __global float* a,
                                __global float* b,
                                int p,
                                int q){
    int xi = get_global_id(0);
    int x = get_global_size(0); 
    int yi = get_global_id(1);
    int y = get_global_size(1); 

    int n = y / q;
    int mi = xi / p;
    int ni = yi / q;
    int pi = xi % p;
    int qi = yi % q;

    res[xi * y + yi] = a[mi * n + ni] * b[pi * q + qi];
} 

来自PyOpenCL的电话是:

^{pr2}$

问题是内核没有为输入和输出内存地址获取索引。参数应该是C[i+j*N],以便在整个内存块中适当地移动。在

相关问题 更多 >