一:概述
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