在 Rust 中快速渲染曼德布洛特集合

主要观点:

  • 介绍曼德布洛特集及在 Rust 中渲染其图像的不同方法,包括朴素实现、使用 AVX2 和 Rayon 并行化、使用 OpenCL 并行化等。
    关键信息:
  • 曼德布洛特集是使函数(f\_c(z)=z^2+c)从(z=0)开始迭代时不逃逸到无穷的复数(c)的集合,常见的多色渲染中每种颜色代表迭代的发散速度。
  • 朴素实现是直接将基本算法转换为代码,运行时仅一个核心忙碌,控制台输出执行时间约 18.437s。
  • AVX2 是 x86 指令集扩展,可并行处理多个数据,但不一定能加速代码,使用 AVX2 并行化曼德布洛特算法后执行时间约 6.668s,仅 2.76 倍速提升。
  • Rayon 可自动并行化迭代,使用 Rayon 并行化后执行时间约 6.668s。
  • OpenCL 可在 CPU、GPU 等硬件加速器上运行代码,使用 OpenCL 并行化后执行时间约 0.816s,相比朴素版本有 22.5 倍提升,对于 56000×32000 图像,AVX2+Rayon 有 2.6 倍提升,OpenCL 有 33.2 倍提升。
    重要细节:
  • 朴素实现算法中通过循环计算每个像素的颜色,若迭代次数超过最大迭代次数则为白色,否则根据比例映射为灰色。
  • AVX2 代码中使用特定的数据类型和指令进行并行计算,如__m256__m256i,以及_mm256_add_epi32等指令。
  • Rayon 通过在Cargo.toml中添加依赖rayon = "1.5"并在代码中使用use rayon::prelude::*;和将iter()替换为par_iter()来实现并行。
  • OpenCL 中通过定义内核函数mandelbrot,在主机系统编译后在硬件加速器上执行,使用ocl库在 Rust 中使用 OpenCL,内核函数中计算每个像素的迭代次数并存储在输出缓冲区中。
阅读 16
0 条评论