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