我一直试图生成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方法生成的
答案 0 :(得分:3)
首先尝试使用-O3
和/或-fast
启用编译器优化。对我的系统进行快速测试显示了一个因素或3个性能改进
此外,在尝试更改代码以提高性能时,可以通过将主循环更改为for(a=0;a<10 /* 512*/ ;a++)
另请注意:GCC支持complex numbers并查看手册页complex
,cpow
和cexp
并包含文件/usr/include/complex.h
我描述了该应用程序,并且看到它大部分时间都在powc()
。不幸的是,当我将powerc()更改为使用数学库中的cpow()
时,它的运行速度比实现速度慢。
如果您运行的系统具有多个内核,则可以通过将外部主循环与OpenMP并行化来相当容易地降低挂钟时间。但是,当您为动画生成图像帧时,使用单独的过程生成每个帧可能是最有效的(对于这种粗粒度并行化,我喜欢xargs -P # -n 1
。)
答案 1 :(得分:3)
当你在IRC上提到这一点时,我心情很奇怪,花了一段时间来优化它。它现在在我的Mac上至少快了4倍,不包括编译器优化标志,在其他一些平台上更是如此。
对于更高的数学,我是......无知,但我确实知道一些关于优化的事情。我相信这个计算与原始计算相同,除了用系统cexp()代替你在expc()中的实现,它产生相同的输出。你可以决定它在数量上是否足够稳定。
正如Brian Swift所说,powc()价格昂贵,因为log()和pow()功能
大赢的事情:
另一个重大胜利是将cexp()和cpow()中的算术转换为单精度,但结果略有不同,您可能会或可能不关心。
您可能无法再识别该程序,但它位于:
https://github.com/cgull/allegra.git
我注意到了更多的东西,并且从中剔除了另外25%-33%(天哪,这是一个收敛的迭代函数!)
我确信那些比我更了解更高数学的人可以在那里找到另外2-4倍的表现......