CUDA编程13 - 测量每个Block的执行时间
一:概述
GPU 程序性能不是靠 CPU 那样的“顺序执行”来衡量的,而是靠线程块(block)和多处理器(SM)利用率。每个 block 在 GPU 的不同多处理器上执行,顺序不确定。传统的 kernel 总体计时(比如 cudaEvent
计时整个 kernel)只能知道总时间,无法分析哪个 block 慢,为什么慢。通过测量每个 block 的执行时间,可以发现是否有 block 被延迟(memory bottleneck),是否某些 block 数据访问不均衡(load imbalance),是否存在分支或线程 divergence 导致的性能差异。
二:代码分析
本例子代码要实现的是测量 CUDA kernel 中每个 block 的执行时间,同时做一个并行归约(找最小值)。
1、 每个 block 独立计时
GPU 的 block 是并行执行的,并且执行顺序是不确定的。因此,无法用全局计时去测整个 kernel,而是每个 block 自己记录开始和结束时间。用 clock()
函数在 block 第 0 个线程记录:
timer[bid] = clock(); // block 开始时间
...
timer[bid + gr