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
的时间中可能包含了上下文切换,因而比实际花费的时间略长。