Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 快速计算大量数据/内部循环_Objective C_Macos_Opencl - Fatal编程技术网

Objective c 快速计算大量数据/内部循环

Objective c 快速计算大量数据/内部循环,objective-c,macos,opencl,Objective C,Macos,Opencl,因此,我正在编写一个简单的Mandelbrot渲染器。 我的内部循环(每次在屏幕上绘制时执行约100000000次)如下所示: 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;

因此,我正在编写一个简单的Mandelbrot渲染器。 我的内部循环(每次在屏幕上绘制时执行约100000000次)如下所示:

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'
Complex position={re,im};
复z={0.0,0.0};
uint32_t it=0;
对于(;it5)
如果(sqrt(z.re*z.re+z.im*z.im)>5.0f)
打破
}
//根据“it”的值在像素中显示颜色
只是一些非常简单的计算。这需要0.5到几秒钟的时间,这取决于缩放等,但我需要更快,以实现(几乎)平滑滚动

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


感谢您的帮助

我已经多次编写了Mandelbrot集渲染器。。。以下是你应该记住的事情

  • 花费时间最长的事情是那些永远不会逃避并花费所有迭代的事情。
    a。因此,你可以在几个矩形中中间形成一个区域并检查它。
  • 任何一个实部和虚部在-1和1之间的起点都不会逃逸
  • 您可以在滚动缓冲区中缓存点(20或30),如果您在缓冲区中看到您刚刚计算的点,则意味着您有一个循环,它将永远不会逃逸
  • 你可以使用一个更一般的逻辑,不需要平方根。。。在这种情况下,如果任何零件小于-2或大于2,它将失控,并可被视为逃逸

  • 但是你也可以分解它,因为每一点都是它自己的东西,所以你可以为每一行或每一象限创建一个单独的线程或gcd调度或其他任何东西。。。分割并并行运行是一个非常容易的问题。

    我已经多次编写了Mandelbrot集渲染器。。。以下是你应该记住的事情

  • 花费时间最长的事情是那些永远不会逃避并花费所有迭代的事情。
    a。因此,你可以在几个矩形中中间形成一个区域并检查它。
  • 任何一个实部和虚部在-1和1之间的起点都不会逃逸
  • 您可以在滚动缓冲区中缓存点(20或30),如果您在缓冲区中看到您刚刚计算的点,则意味着您有一个循环,它将永远不会逃逸
  • 你可以使用一个更一般的逻辑,不需要平方根。。。在这种情况下,如果任何零件小于-2或大于2,它将失控,并可被视为逃逸

  • 但是你也可以分解它,因为每一点都是它自己的东西,所以你可以为每一行或每一象限创建一个单独的线程或gcd调度或其他任何东西。。。分割并并行运行是一个非常容易的问题。

    除了@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

    除了@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;
    
    编译器可能会优化第一个,但第二个肯定会有所帮助


    为什么您要编写自己的复数而不是使用
    复数。h

    您能想出一种不需要平方根的方法吗?您能想出一种不需要平方根的方法吗?我没有看到复数有多大改进。h。。。但是有些。。。主要原因是它只有C99+。。。或者OP不知道。事实上,去掉平方根使速度提高了13%。我没有使用complex.h,因为我不知道它的存在,但是因为我的complex结构只包含两个double,所以我认为不会有太大的改进。不管怎样我还是要试试。我没有看到复杂的有多大的改进。h。。。但是有些。。。主要原因是它只有C99+。。。或者OP不知道。事实上,去掉平方根使速度提高了13%。我没有使用complex.h,因为我不知道它的存在,但是因为我的complex结构只包含两个double,所以我认为不会有太大的改进。不管怎样,我还是要试试。天哪,异步调度每行的计算速度提高了十倍O我将如何处理缓存点?有没有一种简单的方法可以在不缓存每个像素的情况下确定一个周期中会出现哪些点?要缓存点,您可以制作一个复杂的双arr[n]数组,或者将它们转换为点NSPoint或您自己的结构。Complex为您提供免费的等式检查、乘法和加法……天哪,异步调度每行的计算将速度提高了十倍!:O我将如何处理缓存点?有没有一种简单的方法可以在不缓存每个像素的情况下确定一个周期中会出现哪些点?要缓存点,您可以制作一个复杂的双arr[n]数组,或者将它们转换为点NSPoint或您自己的结构。Complex为您提供免费的等式检查、乘法和加法。。。