2011-12-28 103 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)

這些技巧通常用於數據壓縮以估計位概率或實現近似算術編碼器。