OpenCL将MxN矩阵转换为方阵

时间:2014-03-19 19:22:47

标签: c matrix opencl gpgpu

我试图将3x2矩阵转换为4x4的方阵:

__kernel void padding(float* newM, int m, int n, int newlength)
{

}

矩阵" newM"是行主序,m = 3,n = 2,newlength = 4。 newM中的元素在前面都是紧凑的,矩阵的尾部只是0。 我的困惑是如何在不丢失后续值的情况下移动元素。我会创建一个本地副本,但我正在处理的矩阵非常大,不适合私有内存。

这是一维的外观:

[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0] -> [1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0]

这是一个二维的外观:

[1, 1, 1]    [1, 1, 1, 0]
[1, 1, 1] -> [1, 1, 1, 0]
             [0, 0, 0, 0]
             [0, 0, 0, 0]

它在2D中的实际效果如何:

[1, 1, 1, 1]    [1, 1, 1, 0]
[1, 1, 0, 0] -> [1, 1, 1, 0]
[0, 0, 0, 0]    [0, 0, 0, 0]
[0, 0, 0, 0]    [0, 0, 0, 0]

我在这里使用的所有数字都只是用于这个例子,实际上我在矩阵中有随机浮点数,尺寸超过2000x2000。

任何想法?感谢

2 个答案:

答案 0 :(得分:1)

如果您的数据按行排序,请执行此操作:

__kernel void padding(float* newMa, float* oldMa, int oldR, int oldC, int N)
{
    int id = get_global_id(0);
    int r = id/N;
    int c = id%N;
    float value = 0.0f;
    if(r < oldR || c < oldC) //Inside the old matrix size
        value = oldMa[r*oldR+oldC];
    newMa[id] = value ;
}

新的矩阵大小应该有足够的空间用于操作,即&#34; NxN&#34;。

我不知道您是否正在使用此内存排序。您能否提供您希望数据与其他内核连接的方式?正如其他答案所说,你可能不需要另一个内核来实现这么简单的操作。您也可以将其集成到其他内核中。

答案 1 :(得分:0)

如果您不需要进行任何数学计算,并且唯一的目标是以其他方式解释数据,则此处不需要任何OpenCL。

重新分配内存并引入新的矩阵行。