質問のタイトルは混乱しているように聞こえるかもしれませんが、実際には..そうです!
この行を実行するプログラムがあります
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で第3項を計算するプログラムの別のバージョンがあります
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() 関数よりも高速です。