编译时循环展开
使用 @parameter for 展开循环
编译时循环展开 是 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 反馈 — 无需本地设置。