我正在尝试将 4800x9600 矩阵的行加在一起,得到一个 1x9600 的矩阵。
我所做的是将 4800x9600 拆分为 9,600 个长度为 4800 的矩阵。然后我对 4800 个元素进行缩减。
问题是,这真的很慢......
有人有什么建议吗?
基本上,我正在尝试实现 MATLAB 的 sum(...) 函数。
这是我验证过的代码可以正常工作,只是它真的很慢:
void reduceRows(Matrix Dresult,Matrix DA)
{
//split DA into chunks
Matrix Dchunk;
Dchunk.h=1;Dchunk.w=DA.h;
cudaMalloc((void**)&Dchunk.data,Dchunk.h*Dchunk.w*sizeof(float));
Matrix DcolSum;
DcolSum.h=1;DcolSum.w=1;
//cudaMalloc((void**)&DcolSum.data,DcolSum.h*DcolSum.w*sizeof(float));
int i;
for(i=0;i<DA.w;i++) //loop over each column
{
//printf("%d ",i);
cudaMemcpy(Dchunk.data,&DA.data[i*DA.h],DA.h*sizeof(float),cudaMemcpyDeviceToDevice);
DcolSum.data=&Dresult.data[i];
reduceTotal(DcolSum,Dchunk);
}
cudaFree(Dchunk.data);
}
矩阵定义为:
typedef struct{
long w;
long h;
float* data;
}Matrix;
ReduceTotal() 只是调用标准的 NVIDIA 缩减,对 Dchunk 中的所有元素求和,然后将答案放入 DcolSum 中。
如果找不到答案,我将在 CPU 上执行所有这些操作... ;(
提前谢谢了,