c - OpenCL 将 MxN 矩阵转换为方阵

标签 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。 我的困惑是如何在不丢失后续值的情况下移动元素。我会创建一个本地副本,但我正在处理的矩阵非常大,不适合私有(private)内存。

这是一维外观:

[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]

我在这里使用的所有数字都只是为了这个例子,实际上我的矩阵中有随机 float ,并且尺寸超出了 2000x2000。

有什么想法吗?谢谢

最佳答案

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

__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”。

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

关于c - OpenCL 将 MxN 矩阵转换为方阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22516120/

相关文章:

c++ - OpenCV 均值函数因从 OpenCV 阈值函数创建的掩码而崩溃?

c++ - 以编程方式获取 GPU 内存使用情况

opencv - 如何确保 OpenCV 实际运行 OpenCL 内核?

c - 共享 OpenCL 内核数据

ios - 如何在我的 Objective-C iOS 项目中使用 C 库?

c++ - gcc 链接器 - 将存档中的所有目标文件映射到特定部分

c - 写入指针时出错,可通过更改指向数组的指针来解决。发生了什么?

c - 我正在尝试以小端方式从结构内的值读取所有 64 位

python - 如何在 Numpy(或其他 Python 解决方案)中利用外积的对称性?

matrix - 我们如何检查矩阵是否为 PSD 是否为 PyTorch?