Optimization 牛顿θ函数计算的加速';s方法分形生成

Optimization 牛顿θ函数计算的加速';s方法分形生成,optimization,fractals,Optimization,Fractals,我一直在尝试生成分形——我尝试mpmath需要很长时间,所以我试着用C编写它 用于生成以下图像的源代码如下:并将使用gcc allegra.c-o allegra-lm编译,然后应作为./allegra>jacobi.pnm调用 (来源:) 因此: *有没有什么方法可以加快评估速度--这张图片的制作耗时超过半小时?(我希望能够用不同的名称快速生成这些图像,以便制作电影) *我知道我在θ函数定义中犯了一个错误,但是我很难找到不连续的原因 出于参考目的,此图像是通过在ϑ3(z,0.001-0.3

我一直在尝试生成分形——我尝试mpmath需要很长时间,所以我试着用C编写它

用于生成以下图像的源代码如下:并将使用gcc allegra.c-o allegra-lm编译,然后应作为./allegra>jacobi.pnm调用


(来源:)

因此: *有没有什么方法可以加快评估速度--这张图片的制作耗时超过半小时?(我希望能够用不同的名称快速生成这些图像,以便制作电影) *我知道我在θ函数定义中犯了一个错误,但是我很难找到不连续的原因


出于参考目的,此图像是通过在ϑ3(z,0.001-0.3019*i)上使用标准牛顿法生成的。

首先尝试使用
-O3
和/或
-fast
启用编译器优化。对我的系统进行的快速测试表明,性能提高了1到3倍


此外,在试验代码更改以提高性能时,运行时速度更快是有益的,也许可以将主循环更改为
,以提高性能(a=0;a当你在IRC上提到这一点时,我心情不好,花了一段时间对它进行优化。在我的Mac上,它现在至少快了4倍,不算编译器优化标志,在其他一些平台上更是如此

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

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

重大胜利的事情:

  • pjtheta()和pjtheta3()中的计算可以组合使用
  • 该计算可以在newt()中的一个内循环中进行,其中一些可以从内循环或两个循环中移出
  • cpow()对Brian(和我)来说可能比较慢,但cexp()肯定比您的代码快,至少在我的机器上是这样。两种方法都试一下
  • -编译器标志中的ffast math取消了对不符合标准的数字的支持,大大加快了速度
另一个巨大的成功是将cexp()和cpow()中的算法转换为单精度,但这会产生稍微不同的结果,这一点您可能关心,也可能不关心

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

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


我相信比我更懂高等数学的人可以在那里找到另一个2-4倍的性能…

你介意我把你的代码作为一个示例应用程序传递给苹果吗?当用他们新的
clang
C编译器编译时,它的运行速度比用他们的gcc编译时慢。没问题。我稍后会用icc试试。
icc
是一个好主意。我很好奇你看到它比
gcc
有多大的改进。哇。
icc
产生的代码比gcc快7倍,这让人印象深刻。(也感谢你提到icc,我还没意识到英特尔让他们的开发工具在Linux上免费供非商业使用).附录:我完成了渲染,可以在youtube上看到:下一步是尝试使用intel math内核库(假设它比math.h快)顺便说一句,我的直觉是,实际上没有人在c99标准中使用复杂的数据类型做任何事情,它只是被添加到语言中,因为当时有人认为这是一个好主意。(顺便说一句:我在鼓动一种特殊的函数ASIC,因为这些函数(Jacobi)theta在软件中被重新实现了无数次,所有的软件实现都很慢)我认为在c99之前的一段时间里,
gcc
有复杂的支持。但是,如果大多数
complex
的重负荷用户仍然使用fortran,我不会感到惊讶。