【问题标题】:OpenCL convert MxN matrix to square matrixOpenCL 将 MxN 矩阵转换为方阵
【发布时间】:2014-03-19 19:22:47
【问题描述】:

我正在尝试将 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。

有什么想法吗?谢谢

【问题讨论】:

  • 您是否确实需要在设备上执行此操作,即仅需要在程序开始时执行此操作还是需要执行多次?
  • 我想在 GPU 上执行此操作,但在 CPU 上执行此操作会在我的程序中造成主要瓶颈。我的程序的重点是将两个矩阵相乘。矩阵可以是任意长度。我创建了一个内核,它可以非常快地将两个方阵相乘。所以我现在要做的是将两个输入矩阵转换为具有相同的尺寸并且是正方形的。

标签: c matrix opencl gpgpu


【解决方案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 ;
}

新的矩阵大小应该为操作提供足够的空间,即“NxN”。

我不知道你是否使用这种内存排序。您能否提供您期望数据如何与您的其他内核交互?正如其他答案所说,您可以证明不需要另一个内核来进行如此简单的操作。您也可以将其集成到您的其他内核中。

【讨论】:

  • 整个程序的主要目标是将两个矩阵相乘,我正在使用我创建的优化内核来执行此操作。如果矩阵是“NxN”,它运行得非常快。所以我想要做的是将所有输入矩阵转换为维度 NxN,其中 N 是矩阵对中的最大维度。我目前正在解决这个问题的方法是在 CPU 端重新分配内存。将其映射到 VRAM。现在我想添加填充,然后继续执行其余部分。完成后移除填充物。我认为您的方式可行,但可能会浪费内存?
  • 是的,会浪费内存和GPU运算。您应该修改 NxN 乘法 ir 的内核代码,以避免出现在最小尺寸矩阵中的行/列。这样你就不会浪费内存了。
【解决方案2】:

如果您不需要做任何数学运算,并且唯一的目标是以其他方式解释数据,那么您在这里不需要任何 OpenCL。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多