测量CUDA内核运行时间时是否需要预热代码?

时间:2016-12-12 10:00:28

标签: cuda gpu

在第85页,professional CUDA C programming

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?开始,我知道原因是:

  

如果它们是非显示卡,则可能是驱动程序在一段时间不活动后自行关闭。所以你在第一次运行时看到的可能是初始化开销,只发生一次。

因此,如果我的GPU卡长时间不活动,例如,我只是用它来运行一些程序,它不需要运行任何预热代码。我的理解是对的吗?

1 个答案:

答案 0 :(得分:5)

除了GPU处于省电状态之外,还有许多其他原因导致内核首次启动速度慢于进一步运行:

  • 即时编译
  • 将内核传输到GPU内存
  • 缓存内容
  • ...

由于这些原因,最好至少进行一次&#34;预热运行&#34;在定时内核运行之前,如果你对连续内核启动的持续速度感兴趣。

如果您有特定的应用程序和用例,那么在相关情况下对该应用程序进行基准测试总是有意义的。尽管如此,在较少控制的测量中,运行时的变化要大得多。