CUDA 常见问题
CUDA 常见问题
- kernel 越界会报错吗?不一定,可能只是结果错误或者偶发崩溃,所以边界检查必须写,开发期用 compute-sanitizer 扫。
- 什么时候该用 double?消费级显卡上双精度吞吐远低于单精度,能用 float 就用 float,需要高精度累加时用 Kahan 求和或分段累加。
__syncthreads()有什么坑?必须在 block 内所有线程都能到达的位置调用,放在分支里会死锁;每个循环迭代里需要几次同步要想清楚。- occupancy 是不是越高越好?不是。访存密集型算子往往先打满带宽,再提占用率收益有限;反过来,降低占用率换取更多寄存器做数据复用,有时更快。
- block 之间怎么通信?只能通过 global memory 加第二次 kernel,或者用 cooperative groups 做网格级同步,后者对启动配置有额外要求。
- 怎么判断优化是否有效?固定输入与随机种子,用 ncu 对比优化前后的 kernel 耗时与 DRAM 吞吐,不要只看端到端时间。

