Mojo Academy · 课时

编译时循环展开

使用 @parameter for 展开循环

第 2 / 4 课13 个步骤

编译时循环展开 是 CoddyKit 上的免费 Mojo Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Mojo Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Mojo Academy 课程共包含 4 节课。

编译器展开循环

循环展开是指编译器将每次迭代分别写成直线代码,从而消除循环计数和分支的开销。⚙️

用于循环的 @parameter 修饰符

将@parameter放在范围在编译时已知的 for 循环上,Mojo 就会将其完全展开,而不是在运行时执行循环。

@parameter
for i in range(4):
    print(i)

边界必须是静态的

循环范围必须是编译时取值,这样编译器才能确切知道要生成多少份循环体副本。

alias N = 8

@parameter
for i in range(N):
    process(i)

索引变为常量

在展开后的循环中,每个副本的索引都是真正的参数,因此可以在只有编译时取值才允许出现的地方使用它。

@parameter
for i in range(4):
    arr[i] = i * i

为什么要展开循环?

展开循环会去除每次迭代的分支和计数工作,让 CPU 获得一串可以高效进行流水线处理的连续指令。

它可以与 SIMD 配合

展开后的循环体通常会为SIMD操作提供输入,使每个生成的副本处理一组向量通道,从而获得最大吞吐量。

索引 SIMD 通道

编译时索引可以访问 SIMD 向量中的单个通道,而运行时循环变量并不总能做到这一点。

@parameter
for i in range(4):
    total += vec[i]

代码更大,运行更快

循环展开以更大的二进制文件换取更少的执行指令。对于运行数百万次的紧凑热点循环,这通常是值得的。

不要展开所有循环

请仅对小型的热点内层循环使用展开。展开过大的范围会使代码膨胀,还可能损害指令缓存性能。

一种编译时工具

@parameter for 纯粹属于元编程:循环在运行时根本不存在,因为编译器已经将它展开成扁平代码。🚀

与常量配合使用

使用别名定义边界,让一个命名常量控制展开次数,使代码清晰,也便于日后重新调优。

alias TILE = 4

@parameter
for i in range(TILE):
    work(i)

快速检查

请回想 @parameter 对 for 循环做了什么。

回顾

@parameter for会在编译时展开具有静态边界的循环:索引变为常量,开销消失,热点循环运行得更快。🎯

免费开始

用 AI 导师学习 Mojo — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「编译时循环展开」课时是免费的吗?

是的 — 「编译时循环展开」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Mojo Academy 课程的其余内容,请升级到 CoddyKit PRO。 Mojo Academy 课程共包含 4 节课。

「编译时循环展开」这节课中我会学到什么?

使用 @parameter for 展开循环 你通过在浏览器中直接运行的动手代码来练习 Mojo Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Mojo Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Mojo Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「编译时循环展开」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Mojo Academy 课中编写并运行代码吗?

能。每节 Mojo Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 参数化算法
  2. 编译时循环展开
  3. 条件编译
  4. 约束与静态检查
← 返回 Mojo Academy