主要观点:当计算成本过高时,可通过并行化(线程或多进程)或优化单核心计算来提高效率并降低成本。文中以 Mandelbrot 计算为例,Rust 语言编写的 Mandelbrot 计算代码最初在单核心上运行,通过使用 SIMD(单指令多数据)操作可在单核心上加快计算速度并降低成本,同时利用 Rust 的 Rayon 库可轻松添加多核心并行性,在 i7 - 12700K CPU 上测试,单核心 SIMD 版本比标量版本快约 4.5 倍,多核心时 SIMD 仍有显著性能提升,展示了在单核心上可以通过优化提高性能的可能性。
关键信息:
- 有两个目标:加快结果返回速度和降低计算成本。
- 并行化虽能提速但会增加成本,优化单核心计算可兼顾两者。
- Rust 语言用于编写 Python 扩展,文中代码示例及图像受 Rust 开发者版权保护并许可使用。
- Mandelbrot 计算简单,通过反复变换起始复数直到其发散来确定像素颜色。
- 优化代码的困难在于难以利用现代 CPU 单核心内的并行性,指令级并行性在该算法中效果不佳。
- SIMD 可一次处理多个数据,通过掩码可对不同索引进行不同操作,在 Rust 中使用 SIMD 需使用夜间编译器并启用实验性功能。
- 编译代码时可先针对当前 CPU 以启用本地最佳 SIMD 指令,后续可解决便携性问题。
- 测试表明 SIMD 版本比标量版本在单核心上快约 4.5 倍,利用 Rayon 库添加多核心并行性后,多核心时 SIMD 仍有显著性能提升。
重要细节:
- 代码中定义了
Complex
结构体表示复数,get_count
函数用于计算 Mandelbrot 序列的迭代次数。 - 在 SIMD 实现中,使用
u64s
、u32s
、f64s
等特殊 SIMD 类型处理批量数据,通过掩码操作对不同索引进行不同处理。 - 编译时通过
RUSTFLAGS="-C target-cpu=native"
针对当前 CPU 编译以启用本地最佳 SIMD 指令。 - 在多核心并行处理中,将
chunks_mut
改为par_chunks_mut
以自动使用所有 CPU 核心。 - 完整可运行项目在 GitHub 上:https://github.com/pythonspee... 。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。