blockIdx.x * blockDim.x + threadIdx.x不是背下来的公式,而是「线程坐标 → 数据位置」的坐标变换。
核心判断:前两篇建立了数据闭环和错误检查,但还差最关键的一步——内核(Kernel)里的每个线程,凭什么知道「我该处理哪个元素」?答案是一个公式:
i = blockIdx.x * blockDim.x + threadIdx.x。这个公式不是语法糖,而是 CUDA 线程模型对「坐标变换」的完整表达。本篇把它拆到直觉层面,并引入理解 CUDA 数据遍历和线程复用的基础模式之一——网格跨度循环(grid-stride loop)。
① 为什么「索引」是写对 Kernel 的第一步
vectorAdd 能跑、错误会查了,但真正让 Kernel「算对」的,是每个线程都拿到了属于自己的那个下标。
先看一个典型误区:
「索引公式背下来就行,
i = blockIdx.x * blockDim.x + threadIdx.x。」