所以,我正在编写一个简单的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?在汇编中编码?将图像分成小块并在另一个线程上分配每个块的计算?这些组合?
感谢任何帮助!
答案 0 :(得分:4)
我已多次写过一个Mandelbrot设置渲染器......这是你应该记住的事情......
但是你也可以解决这个问题,因为每个点都是它自己的东西,所以你可以为每一行或象限制作一个单独的线程或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