Matrix CUDA添加矩阵的行
我试图将4800x9600矩阵的行相加,得到一个1x9600矩阵 我所做的是将4800x9600拆分为9600个矩阵,每个矩阵的长度为4800。然后,我对4800个元素执行缩减 问题是,这真的很慢 有人有什么建议吗 基本上,我正在尝试实现MATLAB的sum(…)函数 这是我验证过的代码,工作正常,只是速度太慢了:Matrix CUDA添加矩阵的行,matrix,cuda,row,gpu,nvidia,Matrix,Cuda,Row,Gpu,Nvidia,我试图将4800x9600矩阵的行相加,得到一个1x9600矩阵 我所做的是将4800x9600拆分为9600个矩阵,每个矩阵的长度为4800。然后,我对4800个元素执行缩减 问题是,这真的很慢 有人有什么建议吗 基本上,我正在尝试实现MATLAB的sum(…)函数 这是我验证过的代码,工作正常,只是速度太慢了: void reduceRows(Matrix Dresult,Matrix DA) { //split DA into chunks Matrix D
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);
}
ReduceTotal()只调用标准的NVIDIA reduce,对Dchunk中的所有元素求和,并将结果放入DcolSum中
如果我找不到答案,我将在CPU上完成所有这些工作;(
首先非常感谢,还原是GPGPU中非常基本的操作,它应该很快,9600次还原也不应该很慢 你用的是什么显卡 我建议您将其拆分为9600个数组,每次将4800个元素的数组缩减为一个结果。我建议您使用CUDPP而不是reduceTotal来执行缩减操作,CUDPP类似于CUDA的STL。它的实现关注性能
我认为您的问题在于您正在启动9600X2内核。这应该是一个易于表达为单个内核的算法 实现它的最简单的方法不会合并内存,但它很可能比您现在使用的方法更快 一旦你有了一个简单的方法,然后合并你的内存读取:例如,让一个块中的每个线程将16个连续的浮点读到共享内存中,syncthreads,然后将相关的16个浮点累积到寄存器中,synthreads,然后重复
Computing SDK有很多简化技术的例子。不是在每列上循环,而是在列上并行化。4600个线程中的每个线程对其列中的9600个条目求和,并将总和放在结果向量中的适当位置 如果您正在寻找一个库来简化与Cuda的工作,我强烈建议您: 使用推力,我将创建一个函子,将矩阵指针保存在设备内存中,然后将其映射到一系列列索引上一个函子的函数将获取一个索引,对矩阵中该列中的所有内容求和,然后返回该和。然后,你将把你的和放在一个推力::设备_向量中,没有任何内存拷贝(甚至没有直接的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;
};
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;
};