CUDA添加矩阵行

时间:2010-07-22 18:42:41

标签: matrix cuda row gpu nvidia

我正在尝试将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上完成所有这些......;(

非常感谢,

3 个答案:

答案 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)