将LLVM快速数学优化转移到MPFR类型

时间:2018-12-27 17:26:26

标签: llvm fractals mpfr

我正在编写一个编译器,该编译器在可执行代码中实现对分形公式的高级描述。例如,我的公式定义文件开始如下:

Mandelbrot
  z := z^p + c

Burning Ship
  z := (|x| + i |y|)^p + c

我正在使用K.I. Martin的SuperFractalThing普及的摄动技术,并且正在将MPFR用于高精度参考轨道。到目前为止,我正在发布C源代码,但尚未优化。

例如,这是《燃烧的船》电源3的输出内部循环:

// fx = (v13+(abs((v15*(v15*v15)))+(abs((v15*(v16*v16)))*-3)))
// fy = (v14+((abs((v15*(v15*v16)))*3)+(abs((v16*(v16*v16)))*-1)))
r_sqr_r(v27,v15);
r_mul_rr(v26,v15,v27);
r_abs_r(v26,v26);
r_sqr_r(v29,v16);
r_mul_rr(v28,v15,v29);
r_abs_r(v28,v28);
v11=-3;
r_mul_ri(v27,v28,v11);
r_add_rr(v25,v26,v27);
r_add_rr(v19,v13,v25);
r_mul_rr(v28,v15,v16);
r_mul_rr(v27,v15,v28);
r_abs_r(v27,v27);
v11=3;
r_mul_ri(v26,v27,v11);
r_sqr_r(v28,v16);
r_mul_rr(v27,v16,v28);
r_abs_r(v27,v27);
r_neg_r(v27,v27);
r_add_rr(v25,v26,v27);
r_add_rr(v20,v14,v25);
// v15 = fx
// v16 = fy
r_set_r(v15,v19);
r_set_r(v16,v20);

可以通过将v15*(v15*v16)重新关联为(v15*v15)*v16并在节之间共享平方值来立即得到改善(mpfr_sqrmpfr_mul更快;避免了重新计算是一个明显的胜利)。

我想使用LLVM的快速/不安全数学优化过程(常见的子表达式消除,重新关联等),但是要使用mpfr_t而不是floatdouble

我的一个想法是使用单精度float代表我的低精度类型,并使用double代表我的高精度类型。然后优化整个事物,分解IR,并使用实数类型(即doublempfr_t)对其进行重构。

有人尝试过这样的事情吗?可能出什么问题了?

0 个答案:

没有答案