超越多核并行性:使用 SIMD 实现更快的曼德布洛特集

主要观点:当计算成本过高时,可通过并行化(线程或多进程)或优化单核心计算来提高效率并降低成本。文中以 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 实现中,使用 u64su32sf64s 等特殊 SIMD 类型处理批量数据,通过掩码操作对不同索引进行不同处理。
  • 编译时通过 RUSTFLAGS="-C target-cpu=native" 针对当前 CPU 编译以启用本地最佳 SIMD 指令。
  • 在多核心并行处理中,将 chunks_mut 改为 par_chunks_mut 以自动使用所有 CPU 核心。
  • 完整可运行项目在 GitHub 上:https://github.com/pythonspee...
阅读 142
0 条评论