【发布时间】:2016-12-12 10:00:27
【问题描述】:
在第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 卡没有长时间处于非活动状态,例如,我只是用它来运行一些程序,它应该不需要运行任何预热代码。我的理解对吗?
【问题讨论】: