質問のタイトルは混乱するかもしれませんが、実際はそれです!CUDAプログラムはCPUプログラムより低速ですが、カーネルは高速ですか?
私は
new_matrix = matrix1 + matrix2 + CPU_GIVE_ME_A_MATRIX();
この行を実行するプログラム「+」演算子はオーバーロードされたと私は、コードの読み取りを簡素化するために、単純な行列クラスを作成されています。
全体GPU_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();
と第三項を計算するプログラムの別のバージョンを持っています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()
質問は正確には何ですか?これはまったく私を驚かせることはありません。結局のところ、GPUのメモリ帯域幅はCPUに比べて非常に低いです。 –
@KonradRudolph:GPUは、通常、ホストCPUよりもはるかに高い*メモリ帯域幅を持っています。遅いのは、2つの間のPCI-eバスです。 – talonmies
'GPU_GIVE_ME_A_MATRIX()はGPUメモリ割り当てとGPUとのデータ転送を呼び出しごとに実行していますか? – talonmies