我正在尝试将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上完成所有这些......;(
非常感谢,
答案 0 :(得分:3)
不是在每列上循环,而是在列上进行并行化。 4600个线程中的每一个对其列中的9600个条目求和,并将总和放在结果向量中的适当位置。
如果您正在寻找一个能够简化Cuda工作的图书馆,我强烈推荐Thrust:http://code.google.com/p/thrust/
使用Thrust,我会创建一个仿函数来将矩阵的指针保存在设备内存中,然后将其映射到一系列列索引上。仿函数的operator()将获取一个索引,总结矩阵的该列中的所有内容,并返回总和。然后你将把你的总和放在一个push :: device_vector中,没有任何内存副本(甚至是直接的CUDA调用)。
您的仿函数可能类似于:
struct ColumnSumFunctor {
const Matrix matrix;
// Make a functor to sum the matrix
ColumnSumFunctor(const Matrix& matrix);
// Compute and return the sum of the specified column
__device__
int operator()(const int& column) const;
};
答案 1 :(得分:1)
答案 2 :(得分:0)