當核心數量不夠或想限制當前任務使用的GPU核心數時可以使用網格跨步的思路編寫CUDA程序。
CUDA的執行配置:
[gridDim, blockDim]
中的blockDim
最大只能是1024,但是並沒提到gridDim
的最大限制。英偉達給出的官方回復是gridDim最大為一個32位整數的最大值,也就是2,147,483,648,大約二十億。這個數字已經非常大了,足以應付絕大多數的計算,但是如果對並行計算的維度有更高需求呢?答案是網格跨步,它能提供更優的並行計算效率。
[2, 4]
的執行配置為例,該執行配置中整個grid只能並行啟動8個線程,假如我們要並行計算的數據是32,會發現後面8號至31號數據共計24個數據無法被計算。for
循環,每個線程可以干更多事情,所有線程的啟動銷毀開銷更少。[1, 1]
,如下所示,那麼核函數的跨步大小就成為了1,核函數裡的for
循環與CPU函數中順序執行的for
循環的邏輯一樣,非常方便驗證CUDA並行計算與原來的CPU函數計算邏輯是否一致。