CUDA Academy · 课时

网格步长循环

处理大于网格规模的数组

第 4 / 4 课13 个步骤

网格步长循环 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 经典索引公式
  2. 防止索引超出范围
  3. 向上取整计算线程块数量
  4. 网格步长循环
← 返回 CUDA Academy