我试图将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。
任何想法?感谢
答案 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。
重新分配内存并引入新的矩阵行。