cudaLaunchKernel 非常耗时?

事情起因

在第一次使用 nsys 的时候发现 cudaLaunchKernel 非常耗时。网友觉得 cudaLaunchKernel 超过了 50ms 就觉得很大了,但我在服务器上测是 400~500ms!

我想到的可能原因:

  • 服务器的 CPU 和 GPU 负载太高。用环境变量 CUDA_VISIBLE_DEVICES 换到同一台服务器上相对比较空闲的卡,发现 kernel 启动时间从平均 440 ms 减少到了 372 ms,因此可以排除 GPU 负载高的影响。
  • 启动 kernel 时申请的资源太多。我们自己写的 kernel 每个 block 都是固定 512 线程数,GPU 为 3090,每个 SM 上最大能容纳 1024 个线程;对 cudnn 的调用(比如卷积核)看了一下是用满了 1024 线程数。
  • GPU 在 warmup 阶段。

真正原因

GPU 在 warmup 阶段

我之前都是参考 Avg,没有参考 Min。幸好我的测试程序恰好调用了两次 kernel,这才让我看到第二次调用(也就是 Min)实际上只花了 30 us(微秒)。而第一次花费了 917 ms。

另外网上也说 nsys 不适合高精度的程序观察(比如极短的内核),记录的 cudaLaunchKernel 的时间中可能包含了上下文切换,因而比实际花费的时间略长。