4

我一直在尝试生成Jacobi theta 函数的牛顿方法分形——我对 mpmath 的尝试需要很长时间,所以我尝试用 C 对其进行编码。

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


(来源:maresh.info

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

出于参考目的,此图像是通过对 ϑ 3 (z,0.001-0.3019*i)执行标准牛顿法生成的

4

2 回答 2

3

First try enabling compiler optimizations with -O3 and/or -fast. A quick test on my system showed a factor or 3 performance improvement

Also, when experimenting with code changes to improve performance, it is beneficial to have a quicker runtime, perhaps by changing your main loop to for(a=0;a<10 /* 512*/ ;a++)

Also note: GCC supports complex numbers and see man pages complex, cpow, and cexp and include file /usr/include/complex.h

I profiled the application, and saw it is spending most of the time in powc(). Unfortunately when I changed powc() to use cpow() from the math library, it ran slower than your implementation.

If the system you are running on has multiple cores, wall clock time could probably be brought down fairly easily by parallelizing the outer main-loop with OpenMP. However, when you are generating image frames for the animation, it will likely be most efficient to just have each frame being generated with a separate process (I like xargs -P # -n 1 for this type of coarse grain parallelization.)

于 2012-04-13T08:09:53.193 回答
3

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

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

正如 Brian Swift 所指出的,powc() 很昂贵,这是因为 log() 和 pow() 函数

大获全胜的事情:

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

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

您可能不再认识该程序,但它位于:

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

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

我敢肯定,比我更了解高等数学的人可以在那里找到另外 2-4 倍的性能......

于 2012-07-07T04:39:51.027 回答