2012-04-14 73 views
-1

问题的标题可能听起来很混乱,但事实上......这是!CUDA程序比CPU程序慢,但内核速度更快?

我有执行该线

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 = matri x1 + 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()

+0

究竟是什么问题?这根本不令我感到意外。毕竟,与CPU相比,GPU的内存带宽非常低。 – 2012-04-14 12:00:25

+1

@KonradRudolph:与主机CPU相比,GPU通常具有*更高的内存带宽。速度慢的是两者之间的PCI-e总线。 – talonmies 2012-04-14 12:08:42

+0

'GPU_GIVE_ME_A_MATRIX()'是否在每次调用时都执行GPU内存分配和数据传输到/来自GPU? – talonmies 2012-04-14 12:12:09

回答

1
更快

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

通常鼓励尽可能长时间保持设备上的内存,并尽可能少地将内存传输回去。在这种情况下,这听起来像GPU没有被赋予足够的工作来使其值得。 GPU可能会给GPU提供比计算单个矩阵更大的任务吗?

相关问题