网格步长循环
处理大于网格规模的数组
网格步长循环 是 CoddyKit 上的免费 CUDA Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CUDA Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CUDA Academy 课程共包含 4 节课。
当数组非常大时
有时数据量远大于您启动的线程数。每个元素对应一个线程已经无法满足需求,因此需要让每个线程处理多个元素。
网格有一个大小
线程总数就是网格大小:线程块数量乘以每个线程块中的线程数。这个步长表示每个线程所处理元素之间的间隔。
int stride = blockDim.x * gridDim.x;从起点开始,然后按步长前进
每个线程从通常的全局索引开始,然后一次次向前跳过一个网格大小,直到超出数组范围。
网格步长循环
这个循环体现了完整的模式:从 i 开始,按步长前进,在 n 处停止。无论您启动多少线程,都能覆盖任意大小的数组。
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < n;
i += stride) {
out[i] = a[i] + b[i];
}内置保护条件
请注意,循环条件 i < n 本身就是边界检查。从末尾之后开始的线程根本不会进入循环。
工作如何分配
当步长为 4 个线程时,线程 0 处理元素 0、4、8,而线程 1 处理元素 1、5、9。工作是交错分配的,而不是按块分配的。
交错访问有助于合并访问
由于相邻线程在每一步仍会访问相邻地址,访问仍然是合并的,内存带宽也能保持较高水平。
让线程与数据规模解耦
现在,启动规模不再取决于 n。您可以选择适合 GPU 的线程数量,让循环吸收任意工作负载。
针对硬件进行调优
一种常见选择是使用足够多的线程块来填满每个多处理器,然后让每个线程执行循环。这样可以让 GPU 保持繁忙,又不会启动过多线程。
数据很小时同样适用
如果 n 小于网格大小,每个线程执行循环体最多一次。这种模式可以平稳地退化为简单情况。
稳健的默认方案
许多 CUDA 专家会将每个逐元素内核都写成网格步长循环。它灵活、安全,而且很少是错误的选择。🚀
快速检查
找出步长。
总结
您学会了网格步长循环:从全局索引开始,按 blockDim.x * gridDim.x 前进,直到 i 达到 n。现在,一个内核就能处理任意大小的数组。🎉
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「网格步长循环」课时是免费的吗?
是的 — 「网格步长循环」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CUDA Academy 课程的其余内容,请升级到 CoddyKit PRO。 CUDA Academy 课程共包含 4 节课。
「网格步长循环」这节课中我会学到什么?
处理大于网格规模的数组 你通过在浏览器中直接运行的动手代码来练习 CUDA Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CUDA Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CUDA Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「网格步长循环」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CUDA Academy 课中编写并运行代码吗?
能。每节 CUDA Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。