【问题标题】:acceleration of theta function evaluation for Newton's method fractal generation牛顿法分形生成的θ函数评估加速
【发布时间】:2012-04-13 05:45:59
【问题描述】:

我一直在尝试生成Jacobi theta functionsNewton's method 分形——我尝试使用 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) 执行标准牛顿法生成的

【问题讨论】:

  • 您介意我将您的代码作为示例应用程序传递给苹果,使用他们的新clang C 编译器编译时运行速度比使用他们的 gcc 慢。
  • 没问题。稍后我会用 icc 试试这个。
  • icc 是个好主意。我很好奇你看到它比gcc 有多大改进。
  • 哇。 icc 生成的代码运行速度比 gcc 快 7 倍,令人印象深刻。 (也感谢提到 icc,我没有意识到英特尔会在 Linux 上免费提供他们的开发工具供非商业用途使用)。
  • 附录:我完成了渲染,可以在 youtube 上查看:youtube.com/watch?v=f0ZGfCmPjWA 下一步是尝试使用英特尔数学内核库(假设它会比数学更快.h)

标签: optimization fractals


【解决方案1】:

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

此外,在尝试更改代码以提高性能时,更快的运行时间是有益的,或许可以将主循环更改为 for(a=0;a<10 /* 512*/ ;a++)

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

我分析了应用程序,发现它大部分时间都在powc()。不幸的是,当我将 powc() 更改为使用数学库中的 cpow() 时,它的运行速度比您的实现慢。

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

【讨论】:

  • 顺便说一句,我的直觉是没有人真正使用 c99 标准中的复杂数据类型来做任何事情,而且它只是被添加到语言中,因为当时有人认为这将是一个好主意. (顺便说一句:我对特殊功能 ASIC 有点激动,因为这些功能(Jacobi)在软件中得到了无数次的重新实现,而且所有的软件实现都很慢)
  • 我认为 gcc 在 c99 之前有一段时间有复杂的支持。但是,如果complex 的大多数重度用户仍在使用 fortran,我不会感到惊讶。
【解决方案2】:

当你在 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 倍的性能...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2018-10-16
    • 2014-05-01
    相关资源
    最近更新 更多