【问题标题】:Converting Equations Into Bit-shifting Operations将方程转换为位移运算
【发布时间】:2012-11-20 04:31:46
【问题描述】:

是否有任何标准方法可以将(任何)方程转换为位移运算?

我的意思是把任何不是 + 或 - 的东西转换成位移,所以结束方程只包含操作数 >、+ 和 -。这是为了降低公式的处理器密集度。

显然,这些结果方程只是近似值,考虑的阶数越多(一阶、二阶等),精度越高。

我在网上搜索了有关此的任何信息,但找不到任何信息,除了特定公式(sin、cos、inv e.t.c)的内容。

我设想的是多项式或泰勒展开过程,然后将其转换为位移运算。

【问题讨论】:

    标签: c optimization bit-shift performance


    【解决方案1】:

    仅仅因为您将某些内容简化为更简单的指令,并不意味着它们会以某种方式执行得更快或更少密集。虽然您可能能够将许多事情简化为操作的简化子集,但您可能需要更多的操作来完成相同的任务。一个处理器每秒只能执行这么多操作,而您将首先遇到这个问题。

    通常,当您尝试在低级别优化某些内容时,您会尝试使用更复杂的操作码,以便减少需要的操作码。例如,您可以通过执行许多 ADD 指令来执行乘法。但是,除了最琐碎的示例之外,它所花费的 ADD 比单个 MUL 操作码要多得多,并且执行时间要长得多。

    回到你的实际问题......完全忽略效率,只要你拥有的指令集是图灵完备,你可以计算任何东西。如果您小心选择该指令,您实际上可以使用a single instruction 计算任何东西。我不相信有任何通用的方式可以说“将任意算法转换为仅使用这些指令”,这通常是编译器编写者的工作。

    【讨论】:

    • that's generally the job of a compiler writer ...或genetic programming任务的工作:-)
    【解决方案2】:

    一般不会。

    在大多数 CPU 上,乘法并不比其他算术运算慢很多,因此尝试将乘法转换为位移运算没有什么意义,除了乘以 2 的恒定幂次方。

    就除法而言,有一些众所周知的方法可以将除法转换为乘法,这些方法非常有效。请参阅http://www.flounder.com/multiplicative_inverse.htm 以了解如何操作。但是,除以非常量值并不能真正优化。

    当然,将 2 的幂(或一个数字除以 2 的幂)很容易转换为位移。不过,其他指数不容易转换。

    大多数超越函数不能在位级别上合理地表示。无论如何,大多数都不是在整数上定义的,这无济于事。

    【讨论】:

    • 有趣的是,这部分是我在嵌入式 Cortex-M3 上运行的代码中最耗时的部分。改为反乘法确实加快了速度。
    【解决方案3】:

    按位运算的软件乘法不太可能在现代 CPU 上胜过硬件乘法。

    如果允许避免 1) 循环,通常逐位操作可以产生更好的性能;和 2) 分支。

    A good online cookbook 用于位黑客。否则有A Hacker's delight

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2019-05-16
      • 1970-01-01
      • 2013-05-22
      • 2023-03-31
      相关资源
      最近更新 更多