2012-04-14 5 views
-1

質問のタイトルは混乱するかもしれませんが、実際はそれです!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()

+0

質問は正確には何ですか?これはまったく私を驚かせることはありません。結局のところ、GPUのメモリ帯域幅はCPUに比べて非常に低いです。 –

+1

@KonradRudolph:GPUは、通常、ホストCPUよりもはるかに高い*メモリ帯域幅を持っています。遅いのは、2つの間のPCI-eバスです。 – talonmies

+0

'GPU_GIVE_ME_A_MATRIX()はGPUメモリ割り当てとGPUとのデータ転送を呼び出しごとに実行していますか? – talonmies

答えて

1
よりも高速です

CPUバージョンは結果のマトリックスをCPUキャッシュに入れます(または少なくとも可能です)が、GPUバージョンの結果はシステムメモリから読み込まなければなりません。これは、ほとんどの場合(すべてのデバイスがホスト転送に移行するたびにCPUキャッシュを汚染したくない)、このデータのCPU読み取り(少なくとも最初のもの)は、データが計算された場合よりも遅くなることを意味します-側。

可能な限り長くデバイスにメモリを保存し、できるだけ戻すことはほとんどありません。この場合、GPUはそれを価値あるものにするのに十分な仕事が与えられていないように思えます。おそらく、単一のマトリックスを計算するよりも大きな仕事をGPUに与えることができますか?

関連する問題