2016-12-12 9 views
1

professional CUDA C programmingCUDAカーネルの実行時間を測定する際にウォーミングアップコードが必要ですか? 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カードが長時間使用されていない場合(例:いくつかのプログラムを実行するだけの場合)、ウォームアップコードを実行する必要はありません。私の理解は正しいのですか?

答えて

5

GPUカーネルの最初の打ち上げがさらに実行よりも遅くなる可能性が他の理由の数に制限はありませんが省電力状態にあることに加え:

  • 実行時コンパイラ
  • これらの理由から、GPUメモリ
  • キャッシュの内容
  • ...

へのカーネルの転送は、それは常に良いのpです継続的なカーネル起動が達成される持続的な速度に関心がある場合は、タイムドカーネルが実行される前に少なくとも1回の "ウォームアップ実行"を実行するようにしてください。

ただし、特定のアプリケーションとユースケースを念頭に置いている場合は、関連する状況でそのアプリケーションのベンチマークを行うことは常に意味があります。あまり制御されていない測定では、実行時間のばらつきがはるかに大きくなることもあります。

関連する問題