更快地计算大量数据/内循环

时间:2014-02-14 23:30:59

标签: objective-c macos opencl

所以,我正在编写一个简单的Mandelbrot渲染器。 我的内循环(每次在屏幕上绘制时执行约100,000,000次)看起来像这样:

Complex position = {re,im};
Complex z = {0.0, 0.0};

uint32_t it = 0;
for (; it < maxIterations; it++)
{
    //Square z
    double old_re = z.re;
    z.re = z.re*z.re - z.im*z.im;
    z.im = 2*old_re*z.im;

    //Add c
    z.re = z.re+position.re;
    z.im = z.im+position.im;

    //Exit condition (mod(z) > 5)
    if (sqrt(z.re*z.re + z.im*z.im) > 5.0f)
    break;
}

//Color in the pixel according to value of 'it'

只是一些非常简单的计算。这需要0.5到几秒,具体取决于缩放等,但我需要它更快,以启用(几乎)平滑滚动。

我的问题是:达到最大可能计算速度的最佳选择是什么? OpenCl使用GPU?在汇编中编码?将图像分成小块并在另一个线程上分配每个块的计算?这些组合?

感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

我已多次写过一个Mandelbrot设置渲染器......这是你应该记住的事情......

  1. 花费时间最长的东西是那些永远不会逃脱并完成所有迭代的东西。
    一个。所以你可以在几个矩形的中间创建一个区域并首先检查它。
  2. 任何起点,-1和1之间的实部和虚部都不会逃脱。
  3. 你可以在滚动缓冲区中缓存点(20或30),如果你看到缓冲区中你刚刚计算出的一个点意味着你有一个循环并且它永远不会逃脱。
  4. 您可以使用不需要平方根的更一般的逻辑......因为如果任何部分小于-2或大于2,它将失控并且可以被视为转义。
  5. 但是你也可以解决这个问题,因为每个点都是它自己的东西,所以你可以为每一行或象限制作一个单独的线程或gcd调度或者其他...这是一个非常容易分开和运行的问题平行。

答案 1 :(得分:4)

除了@Grady Player的评论之外,你可以从优化代码开始

//Add c
z.re += position.re;
z.im += position.im;

//Exit condition (mod(z) > 5)
if (z.re*z.re + z.im*z.im > 25.0f)
break;

编译器可以优化第一个,但第二个肯定会有所帮助。

为什么要编写自己的复杂编码,而不是使用complex.h