Mojo Academy · 课时

结合并行与向量化

在 SIMD 之上叠加线程

第 3 / 4 课13 个步骤

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

两种速度来源

SIMD 将多个值打包到一个核心的指令中。线程则将工作分散到多个核心。两者结合可以获得最大收益。⚡

外层:线程

在外层使用 parallelize,让每个核心负责一块数据。这是在核心之间进行的粗粒度划分。

parallelize[do_chunk](workers)

内层:向量

在每个块内部使用 vectorize,让一个核心通过 SIMD 打包数据处理自己的切片。这是每个核心内部的细粒度划分。

from algorithm import vectorize

导入两个辅助工具

这两个工具都位于 algorithm 模块中,因此您可以将它们一起导入,并在一个函数中组合使用。

from algorithm import parallelize, vectorize

块工作线程

每个块工作线程会计算自己的起点和终点,然后将自己的切片交给 vectorize,执行 SIMD扫描。

fn do_chunk(c: Int):
    var start = c * chunk

向量化内层范围

在工作线程中,只针对当前块的长度调用 vectorize。SIMD 宽度决定一次运行多少条通道。

vectorize[step, width](end - start)

偏移到数据位置

内层步骤会得到一个局部索引,因此将块起点加上它,即可定位到完整数组中的正确位置。

fn step[w: Int](i: Int):
    out.store[width=w](start + i, ...)

选择 SIMD 宽度

使用 simdwidthof 将向量宽度匹配到硬件通道,使每个核心都能充分利用寄存器。

alias width = simdwidthof[DType.float32]()

核心数量乘以通道数

收益会相乘:多个核心中的每个核心都在每一步处理多个通道。这种乘积正是组合代码如此快速的原因。

保持块彼此独立

这种组合之所以有效,是因为各个块从不访问彼此的数据。保持独立性可以让这两个层次安全运行。

测量组合收益

请对标量版本、仅向量化版本和组合版本进行基准测试。通过数据可以看出每个层次贡献了多少。

快速检查

您要在同一个工作负载上结合使用线程和 SIMD。

总结

您在块上使用 parallelize,并在每个块内部调用 vectorize,再根据块起点计算偏移,从而让核心数量乘以通道数,提升整体吞吐量。🚀

免费开始

用 AI 导师学习 Mojo — 免费

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

课程
30
课程
120

常见问题解答

「结合并行与向量化」课时是免费的吗?

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

「结合并行与向量化」这节课中我会学到什么?

在 SIMD 之上叠加线程 你通过在浏览器中直接运行的动手代码来练习 Mojo Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Mojo Academy 需要有经验吗?

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

「结合并行与向量化」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. parallelize 函数
  2. 将工作拆分为数据块
  3. 结合并行与向量化
  4. 避免数据竞争
← 返回 Mojo Academy