2011-12-28 79 views
0

慢如果乘法比加法,而不是做优化乘法比另外

7 * 8 

请问这种理论上提高性能慢?

for(int i =0; i < 8 ; i++){ 
temp += 7 
} 

要不然我只需要做

7 + 7 + 7 + 7 + 7 + 7 + 7 + 7 
+2

在哪些情况下,哪些硬件乘法比加法慢?大多数合理的现代处理器都有内置的乘法指令,这些指令接近于快速加法。 – 2011-12-28 23:14:11

+1

任何语言/平台? – cnicutar 2011-12-28 23:14:19

+0

我的意思是假设乘法比加法慢,那么我应该如何改进呢? – klijo 2011-12-28 23:16:23

回答

4

你已经尝试过了,并定时呢?

在几乎每一台现代机器上,都有对乘法的快速硬件支持。所以除非它简单乘以2,否,它不会更快

要查看关于当前Intel机器一些硬号码:

add/sub 1 cycle latency 
mul/imul 3 cycle latency 

Agner Fog's manuals服用。

虽然它实际上比这更复杂,但重点仍然是:不,你不会试图用加法代替乘法。

在少数情况下,它更好(如由二的幂的乘法 - 使用移动),编译器会做出优化你,如果它知道在编译时的值。

在x86上,该编译器还可以与lea指令玩到了3,5,10,等做快速乘法......

+0

是的,编译器将无论如何产生的最佳代码。 Afaik有几个CPU,编译器会用'a + a'代替'a * 2',而不是'a >> 1',所以这里有一些事实。但是,这显然是一个特殊情况 - 看到所有人写'a >> 1'来“优化”他们的代码仍然很有趣。 – Voo 2011-12-28 23:37:01

+0

@Voo我认为在所有我现在看到的情况下,编译器实际上并不是'a >> 1'而是'a + a'。这是有道理的,因为在过去几年里,加/减操作得到了很大程度的优化,以至于它们的吞吐量往往比换档更高。 – Mysticial 2011-12-28 23:41:41

+0

哎呀,我们两个人的意思是说'a << 1'而不是'a >> 1' ... – Mysticial 2011-12-28 23:53:37

1

我觉得很难相信,16间值分配,16种添加和8个条件语句比处理器可以乘以7 * 8更快。

+1

,如果你乘以2则移位... – 2011-12-28 23:19:25

+0

我使用了7 * 8,这样我就可以很容易地写出问题了。如果8类似15111那么该怎么办?那么你肯定会看到我的情况有些滞后。 – klijo 2011-12-28 23:25:19

+0

您会在for循环中看到比在一个乘法语句中更高的延迟。现代处理器将以7 * 15111乘以相同速度乘以7 * 8。 for循环正在访问内存,并且多次在寄存器中移动内容以提高效率。 – 2011-12-28 23:30:04

1

这取决于体系结构。但是,通常循环比单个本地代码慢得多(特别是由于分支)。英特尔CPU具有良好的乘法实现,因此通常优于AMD和其他CPU。你可以看看CPU的特性here。此外,您可以使用该program来精确测量您的代码速度。

如果你真的关心速度,有时你可以近似乘法或除法。最值得注意的乘法技巧可能是位移或查找表。例如如果你想用一个2的幂数乘以一个数字,你可以使用移位指令。

如果您需要更好的东西,您可以更改号码的域名,例如逻辑域与量化表。在这种情况下,乘法变成加法,即log(A*B) = log(A)+log(B)

这些技巧通常用于数据压缩以估计位概率或实现近似算术编码器。