【问题标题】:CUDA program is slower than CPU program, but the kernel is faster?CUDA程序比CPU程序慢,但内核更快?
【发布时间】:2012-04-26 13:24:57
【问题描述】:

问题的标题可能听起来很混乱,但实际上..确实如此!

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

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;
}

我有另一个版本的程序,它使用 CUDA 计算第三项

new_matrix = matrix1 + matrix2 + GPU_GIVE_ME_A_MATRIX();

经过一番分析后,我发现:

整个 GPU_GIVE_ME_A_MATRIX() 函数比 CPU_GIVE_ME_A_MATRIX() 函数更快(包括内存传输),所以 CUDA 完成了它的工作..

但是这条线 new_matrix = matrix1 + matrix2 + CPU_GIVE_ME_A_MATRIX(); 比 new_matrix = matrix1 + matrix2 + GPU_GIVE_ME_A_MATRIX();

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

由于这条线被执行了几次(渲染需要),整个CUDA程序比CPU版本慢,但正如我所说的GPU_GIVE_ME_A_MATRIX()函数比CPU_GIVE_ME_A_FUNCTION()快

【问题讨论】:

  • 问题到底是什么?这一点都不让我吃惊。毕竟,GPU 的显存带宽与 CPU 相比是极低的。
  • @KonradRudolph:GPU 的内存带宽通常比其主机 CPU高得多。慢的是两者之间的PCI-e总线。
  • GPU_GIVE_ME_A_MATRIX() 是否在每次调用时执行 GPU 内存分配和与 GPU 之间的数据传输?
  • @talonmies 是的,我就是这个意思。感谢您澄清我公认的含糊不清的陈述。
  • 遗憾的是,但我尝试在设备 (GPU) 上保留尽可能多的内存并仅取回矩阵数据。无论如何,我分析了整个 GPU_GIVE_ME_A_MATRIX() 所花费的时间,包括内存传输,它比 CPU_GIVE_ME_A_MATRIX() 函数快。问题应该出在其他地方

标签: c++ matrix cuda parallel-processing


【解决方案1】:

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

通常建议尽可能长时间地保留设备上的内存,并尽可能少地转移回来。在这种情况下,听起来 GPU 没有得到足够的工作使其值得。也许比计算单个矩阵更大的任务可以交给 GPU?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2014-05-27
    • 2013-02-01
    • 2012-11-27
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多