牛顿方法分形生成的θ函数评估加速

时间:2012-04-13 05:45:59

标签: optimization fractals

我一直试图生成Newton's method Jacobi theta functions分形 - 我用mpmath的尝试需要很长时间,所以我尝试用C编码。

用于生成以下图像的源代码在此处: http://owen.maresh.info/allegra.c并将使用 gcc allegra.c -o allegra -lm 进行编译,然后应调用as ./allegra> jacobi.pnm

http://owen.maresh.info/jacobi.png

所以: *有没有办法加快评估速度 - 这需要花费半小时的时间来制作这张图片? (我希望能够使用不同的nomes快速生成这些图像,以便我可以制作电影) *我知道我在theta函数定义中犯了一个错误,但我很难找到不连续的原因。

出于参考目的,该图像是通过在θ 3 (z,0.001-0.3019 * i)上进行标准Newton方法生成的

2 个答案:

答案 0 :(得分:3)

首先尝试使用-O3和/或-fast启用编译器优化。对我的系统进行快速测试显示了一个因素或3个性能改进

此外,在尝试更改代码以提高性能时,可以通过将主循环更改为for(a=0;a<10 /* 512*/ ;a++)

来实现更快的运行时间。

另请注意:GCC支持complex numbers并查看手册页complexcpowcexp并包含文件/usr/include/complex.h

我描述了该应用程序,并且看到它大部分时间都在powc()。不幸的是,当我将powerc()更改为使用数学库中的cpow()时,它的运行速度比实现速度慢。

如果您运行的系统具有多个内核,则可以通过将外部主循环与OpenMP并行化来相当容易地降低挂钟时间。但是,当您为动画生成图像帧时,使用单独的过程生成每个帧可能是最有效的(对于这种粗粒度并行化,我喜欢xargs -P # -n 1。)

答案 1 :(得分:3)

当你在IRC上提到这一点时,我心情很奇怪,花了一段时间来优化它。它现在在我的Mac上至少快了4倍,不包括编译器优化标志,在其他一些平台上更是如此。

对于更高的数学,我是......无知,但我确实知道一些关于优化的事情。我相信这个计算与原始计算相同,除了用系统cexp()代替你在expc()中的实现,它产生相同的输出。你可以决定它在数量上是否足够稳定。

正如Brian Swift所说,powc()价格昂贵,因为log()和pow()功能

大赢的事情:

  • pjtheta()和pjtheta3()中的计算可以合并
  • 计算可以在newt()中成为内循环,其中一些可以移出内部循环或两个循环
  • 对于Brian(和我)来说,
  • cpow()可能会慢一些,但是cexp()肯定比你的代码更快,至少在我的机器上是这样。两种方式尝试
  • 编译器标志中的
  • -ffast-math删除了对标准符合不良行为数字的支持,并加快了速度。

另一个重大胜利是将cexp()和cpow()中的算术转换为单精度,但结果略有不同,您可能会或可能不关心。

您可能无法再识别该程序,但它位于:

https://github.com/cgull/allegra.git

我注意到了更多的东西,并且从中剔除了另外25%-33%(天哪,这是一个收敛的迭代函数!)

我确信那些比我更了解更高数学的人可以在那里找到另外2-4倍的表现......