、professional CUDA C programming:CUDAカーネルの実行時間を測定する際にウォーミングアップコードが必要ですか? 85ページで
int main()
{
......
// run a warmup kernel to remove overhead
size_t iStart,iElaps;
cudaDeviceSynchronize();
iStart = seconds();
warmingup<<<grid, block>>> (d_C);
cudaDeviceSynchronize();
iElaps = seconds() - iStart;
printf("warmup <<< %4d %4d >>> elapsed %d sec \n",grid.x,block.x, iElaps);
// run kernel 1
iStart = seconds();
mathKernel1<<<grid, block>>>(d_C);
cudaDeviceSynchronize();
iElaps = seconds() - iStart;
printf("mathKernel1 <<< %4d %4d >>> elapsed %d sec \n",grid.x,block.x,iElaps);
// run kernel 3
iStart = seconds();
mathKernel2<<<grid, block>>>(d_C);
cudaDeviceSynchronize();
iElaps = seconds() - iStart;
printf("mathKernel2 <<< %4d %4d >>> elapsed %d sec \n",grid.x,block.x,iElaps);
// run kernel 3
iStart = seconds();
mathKernel3<<<grid, block>>>(d_C);
cudaDeviceSynchronize();
iElaps = seconds() - iStart;
printf("mathKernel3 <<< %4d %4d >>> elapsed %d sec \n",grid.x,block.x,iElaps);
......
}
私たちは、異なるカーネルの実行中の時間を測定する前にウォームアップがある見ることができます。
GPU cards warming up?から、私は理由がある知っている:
彼らは非表示カードであれば、それも一定の時間後に自分自身をシャットダウンするドライバであるかもしれません。だから、最初の実行で見ているのは、初期化オーバーヘッドが1回だけ起こることでしょう。
私のGPUカードが長時間使用されていない場合(例:いくつかのプログラムを実行するだけの場合)、ウォームアップコードを実行する必要はありません。私の理解は正しいのですか?