问题的标题可能听起来很混乱,但事实上......这是!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()
究竟是什么问题?这根本不令我感到意外。毕竟,与CPU相比,GPU的内存带宽非常低。 – 2012-04-14 12:00:25
@KonradRudolph:与主机CPU相比,GPU通常具有*更高的内存带宽。速度慢的是两者之间的PCI-e总线。 – talonmies 2012-04-14 12:08:42
'GPU_GIVE_ME_A_MATRIX()'是否在每次调用时都执行GPU内存分配和数据传输到/来自GPU? – talonmies 2012-04-14 12:12:09