【问题标题】:Mandelbrot function using bitwise operators [closed]使用按位运算符的 Mandelbrot 函数 [关闭]
【发布时间】:2013-01-06 22:28:11
【问题描述】:

我正在渲染 buddhabrot 分形,我正在寻找一些优化/加速,我想知道尝试使用按位运算符执行 z = z^2 + c 是否值得。我已经把它简化了一点。

   double zi2 = z.i*z.i;
   double zr2 = z.r*z.r;
   double zir = z.i*z.r;
   while (iterations < MAX_BUDDHA_ITERATIONS && zi2 + zr2 < 4) {

         z.i = c.i;
         z.i += zir;
         z.i += zir;
         z.r = zr2 - zi2 + c.r;
         zi2 = z.i*z.i;
         zr2 = z.r*z.r;
         zir = z.i*z.r;
         iterations++;
   }

【问题讨论】:

  • 您使用什么语言?如果它是基于 VM 的(例如 java 或 c#),它可能会适得其反……
  • 我正在使用 C 编程,这就是我的想法。是否值得,以及如何。
  • 您所说的“它必须是可能的,因为编译器这样做......”是什么意思?如果编译器优化了,为什么要在源码中做呢?
  • 我想我有点困惑,我已经解决了我的问题。只是在高中,我还是个计算新手,很抱歉。
  • @JordanBrown,您可能会发现一些有趣的研究:整数(有符号和无符号)的存储,浮点数的存储(“double”是浮点类型) .汇编语言也会有所帮助。编译器将高级指令转化为汇编语言指令;有些甚至可以让您保存生成的汇编代码(例如 gcc 的 -S 标志)。分解复杂的操作甚至会适得其反。编译器可以手动进行,而不是让它选择适合高级操作的优化。

标签: c fractals bit-manipulation


【解决方案1】:

z^2+c可以封装在fused multiply-accumulate操作中。这在某些处理器上可作为单指令使用,并且在其他处理器上也可用。在它不可用的处理器中,它通常是优化的或可优化的。例如,C99 定义了 fma 系列函数来提供它。所以我想说你想要的可能已经发生了,如果没有,有一种非常易读的方法来保证它是。

一般来说,任何时候你的潜意识里都应该高度怀疑,用你刚刚构想出来的不那么可读、不那么可维护、更难调试的解决方案 X 来替换可读、可维护的代码会更快。可读性和可维护性不仅对于编写好代码非常重要,对于共享代码和讨论其正确性也非常重要;计算机速度很快,编译器相当不错。

【讨论】:

    【解决方案2】:

    编译器不在按位运算中进行... CPU 及其 ALU 使用按位运算,当然,对于一个单词的所有位,甚至是多个机器代码指令(如 multipy)并行发生在现代处理器中。

    你所问的毫无意义......好吧,如果你正在编程 FPGA,它可能有一些意义,但我假设你不是......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多