曼德博洛特集合
Mandelbrot 集合是分形数学里面一个非常重要的概念,和科赫雪花等等将数学和艺术以一种奇妙的方式统一了起来,高质量的 Mandelbrot 几个的计算需要极其强大的算力,我们就不详细叙述概念了,下面是一个最简单的 逃逸次数计算代码,x, y 是复平面上的坐标,max_iter 是最大逃逸次数,
复制代码
我们简单的测试一下 一个典型的坐标
复制代码
结果如下

下面把 这段代码编译到 spirv
缺少的 while 循环处理需要加上
复制代码
这个代码比较难以理解 需要好好说明,所有 SSA 体系的 中间语言,基本原则是不去修改一个值而是为每次运算生成一个新的 值,也即是一个新 的 SSA ID 这样最大的好处是完全可以使用 寄存器窗口,不用考虑之前寄存器的复用问题。
但是就会面临循环这种最基础的情况,那么怎么处理循环呢,就需要在循环开始的时候 创建 所谓的 phi 变量,就是 求和变量
phi 变量每次根据来源 选择一个值 循环进入的时候,phi 选择的是初始值,循环中,phi 选择的是 修改后的值
复制代码
就是这条语句的作用了
然后在循环体里面 参与运算的是 phi 的统一标识 最后返回的 是也是这个统一标识
但是运算的结果 通过 phi 汇集的点再回到 统一标识里面,这样就避免了修改 SSA 变量
其实本质就是使用一个 可变的容器 来避免修改 SSA 的值
有点像 rust 里面的 RefCell 内部可变性
我们还是使用 32 x 32 的线程组
使用这个结构传递 计算的初始信息
复制代码
main 函数是这样的
复制代码
每个线程组 计算 64 x 64 的小块
总共启动 32 x 32 个线程组
一次计算 1024 x 1024 的图像
复制代码
这是启动代码 和 初始点坐标
耗费的微秒数

生成的图像在这里

评论