Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix CUDA添加矩阵的行_Matrix_Cuda_Row_Gpu_Nvidia - Fatal编程技术网

Matrix CUDA添加矩阵的行

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

我试图将4800x9600矩阵的行相加,得到一个1x9600矩阵

我所做的是将4800x9600拆分为9600个矩阵,每个矩阵的长度为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);
}
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;
};