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

时间:2012-04-14 11:52:33

标签: 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);
    // 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()

更快

1 个答案:

答案 0 :(得分:1)

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

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