隨著對處理大型數據集的需求不斷增長,高效能計算變得至關重要。GPU 在並行計算方面表現卓越,而 CUDA 為開發者提供了強大的工具來利用這種能力。在 CUDA 中,一種高效處理大型數據集的重要技術就是 Grid Stride Loop

什麼是 Grid Stride Loop?

Grid Stride Loop 是一種設計模式,擴展了 CUDA kernel 的功能,使其能夠高效地處理大型數據集。與簡單的 kernel(每個執行緒僅處理一個元素)不同,Grid Stride Loop 允許執行緒遍歷多個數據元素,從而更充分地利用 GPU 的並行計算能力,並且能夠簡化超過執行緒數量的數據集的處理方式。

Grid Stride Loop 的運作方式

在 CUDA 中,執行緒(Thread)被組織成區塊(Block),區塊則組成網格(Grid)。每個執行緒在網格中的索引 (idx) 決定了它所處理的數據範圍。然而,當數據集的大小超過網格內所有執行緒的總數時,Grid Stride Loop 就能發揮作用。

Grid Stride Loop 透過 Grid Stride(網格步長) 來確保每個執行緒間隔性地處理數據:

  1. 執行緒索引:每個執行緒從索引開始 (idx = cuda.grid(1))。
  2. 網格步長:步長等於整個網格中的執行緒總數 (stride = cuda.gridsize(1))。
  3. 迴圈遍歷:執行緒依據步長遍歷數據集,每次處理 stride 間隔的元素。

以下是一個在 CUDA kernel 中使用 Grid Stride Loop 的簡單範例:

from numba import cuda

@cuda.jit
def add_kernel(x, y, out):
    idx = cuda.grid(1)
    stride = cuda.gridsize(1)

    for i in range(idx, x.size, stride):
        out[i] = x[i] + y[i]

Grid Stride Loop 的優勢

  1. 靈活性:Grid Stride Loop 可適應任何大小的數據集,無需為特定的 Grid 或 Block 設定調整配置。
  2. 記憶體共用(Memory Coalescing):透過處理連續的數據元素,提升記憶體存取效率。
  3. 可擴展性:即使是超大型數據集,Grid Stride Loop 仍可充分利用 GPU 的計算資源。

實際案例:計算直角三角形斜邊長度(Hypotenuse)

假設我們要計算一組數值對應的直角三角形斜邊長度,可以利用 Grid Stride Loop 高效處理任意大小的數組:

from numba import cuda
from math import hypot
import numpy as np

@cuda.jit
def hypot_stride(a, b, c):
    idx = cuda.grid(1)
    stride = cuda.gridsize(1)

    for i in range(idx, a.size, stride):
        c[i] = hypot(a[i], b[i])

# 初始化數據
n = 1000000
a = np.random.uniform(-10, 10, n).astype(np.float32)
b = np.random.uniform(-10, 10, n).astype(np.float32)
c = np.zeros_like(a)

# 傳輸數據至 GPU
d_a = cuda.to_device(a)
d_b = cuda.to_device(b)
d_c = cuda.device_array_like(c)

# 啟動 Kernel
threads_per_block = 128
blocks_per_grid = (n + threads_per_block - 1) // threads_per_block
hypot_stride[blocks_per_grid, threads_per_block](d_a, d_b, d_c)

# 取回結果
result = d_c.copy_to_host()

這種方法確保了數組中的所有元素都能夠高效處理,無論數據集的大小如何變化。

結論

Grid Stride Loop 是高效 CUDA 程式設計的重要技術之一,允許開發者處理超過單一 Grid 容量的數據集。結合記憶體共用(Memory Coalescing)、原子操作(Atomic Operations)等技術,Grid Stride Loop 能夠充分發揮 GPU 的強大並行運算能力。

無論是數值模擬、影像處理還是科學計算,Grid Stride Loop 都提供了一種可擴展且優雅的解決方案,使你的 GPU 計算更高效、更強大。