💡 线程索引映射 — 逻辑 vs 物理
每个线程通过索引计算确定自己要处理哪个数据元素。
选择维度查看不同的映射方式:
• 1D — 向量,tid 直接算
• 2D — 矩阵,row/col 分别算
• 3D — 立方体,x/y/z 三维索引
逻辑线程 vs 物理线程
GPU 物理线程有限 (RTX 3090 ~12.6 万同时运行),但你可以启动 1678 万个逻辑线程。
GPU 以 block 为单位分批调度 (Wave):SM 先运行一批 block,完成后释放资源再接收下一批。
所有映射必须做边界检查 (if tid < N)。
数据远大于线程数时,一个线程通过 stride 循环处理多个元素:
每个线程通过索引计算确定自己要处理哪个数据元素。
选择维度查看不同的映射方式:
• 1D — 向量,tid 直接算
• 2D — 矩阵,row/col 分别算
• 3D — 立方体,x/y/z 三维索引
逻辑线程 vs 物理线程
GPU 物理线程有限 (RTX 3090 ~12.6 万同时运行),但你可以启动 1678 万个逻辑线程。
GPU 以 block 为单位分批调度 (Wave):SM 先运行一批 block,完成后释放资源再接收下一批。
blockIdx 是编译时分配的固定值——block 0 永远是 block 0,无论在哪个 SM、第几波执行。所有映射必须做边界检查 (if tid < N)。
数据远大于线程数时,一个线程通过 stride 循环处理多个元素:
for (i = tid; i < N; i += gridSize) — 跳步处理, 各线程交错覆盖全部数据。