C++ CUDA程序比CPU程序慢,但内核更快?

C++ CUDA程序比CPU程序慢,但内核更快?,c++,matrix,cuda,parallel-processing,C++,Matrix,Cuda,Parallel Processing,这个问题的标题听起来可能很混乱,但事实上。。是的 我有一个执行这一行的程序 new_matrix = matrix1 + matrix2 + CPU_GIVE_ME_A_MATRIX(); “+”运算符重载,我创建了一个简单的矩阵类来简化代码读取 myMatrixClass operator+ (const myMatrixClass& mt) { myMatrixClass result(this->rows, this->columns); /

这个问题的标题听起来可能很混乱,但事实上。。是的

我有一个执行这一行的程序

new_matrix = matrix1 + matrix2 + CPU_GIVE_ME_A_MATRIX();
“+”运算符重载,我创建了一个简单的矩阵类来简化代码读取

    myMatrixClass operator+ (const myMatrixClass& mt)
{

    myMatrixClass result(this->rows, this->columns);
    // Sum each couple of values
    for(int i=0; i<rows; i++)
    {
        for(int j=0; j<columns; j++)
            result.values[i*columns+j] = this->values[i*columns+j] + mt.values[i*columns+j];
    }
    return result;
}
在分析了一点之后,我发现:

整个GPU GIVE_ME_A_MATRIX()函数比CPU GIVE_ME_A_MATRIX()函数(包括内存传输)更快,因此CUDA完成了它的工作

但是这条线 新矩阵=矩阵1+矩阵2+CPU\u给我一个矩阵(); 快于 新矩阵=矩阵1+矩阵2+GPU给我一个矩阵()

是什么导致了这种奇怪的行为? CPU缓存什么


由于这一行执行了几次(渲染需要),整个CUDA程序比CPU版本慢,但正如我所说的,GPU GIVE_ME_a_MATRIX()函数比CPU GIVE_ME_a_function()快。

CPU版本将生成的矩阵放入CPU缓存(或者至少可以),而GPU版本的结果必须从系统内存中读取。虽然这在大多数情况下是需要的(您不想在每次设备到主机的传输时污染CPU缓存),但这意味着CPU读取此数据(至少第一次)将比在主机端计算数据时慢


一般鼓励在设备上保留尽可能长的内存,并尽可能少地将内存传输回来。在这种情况下,似乎GPU没有得到足够的工作,使其值得。也许可以给GPU一个比计算单个矩阵更大的任务?

问题到底是什么?这一点也不让我惊讶。毕竟,与CPU相比,GPU的内存带宽非常低。@KonradRudolph:GPU通常比其主机CPU的内存带宽高得多。慢的是两者之间的PCI-e总线。
GPU\u GIVE\u ME\u A\u MATRIX()
在每次调用时执行GPU内存分配和GPU与GPU之间的数据传输吗?@Talonmes是的,这就是我的意思。谢谢你澄清我那无可否认的含糊不清的陈述。很遗憾,是的,但我试着在设备(GPU)上保留尽可能多的内存,只取回矩阵数据。无论如何,我分析了整个GPU GIVE-ME-A-u MATRIX()所需的时间,包括内存传输,它比CPU GIVE-ME-A-u MATRIX()函数快。问题应该在别处
new_matrix = matrix1 + matrix2 + GPU_GIVE_ME_A_MATRIX();