c++加法比乘法快嗎?我的實驗為什麼一樣快呢?

幾千萬個點分別進行加法和乘法運算,就是說幾千萬個(x,y)循環帶入x+y,x*y,得到的計算x+y 和 x*y的時間差不多,這似乎不科學啊,乘法運算不是應該比加法運算慢嗎?


這得看你測的是latency延遲,還是throughput吞吐了,而且這都是硬體相關的,不同CPU不一樣。用C++很可能是測不了的,真的想測,需要用彙編。不過,無論如何,乘法都不會比加法快。

乘法就像我們列豎式一樣,移位乘了再加,雖然硬體上有很多並行辦法,它無論如何都會比單做加法來得慢。這樣,乘法的延遲就大。

CPU里的流水線,可以在某些硬體上,讓乘法和加法的吞吐達到相同水平的。但是,乘法器比較複雜,價格貴,一般來說,它最多和加法器一樣多。在那些加法器數量超過乘法器的CPU里,靠指令多發射機制和多個加法器,可以讓加法的吞吐超過乘法幾倍。

想測延遲的話,需要用彙編讓前後的指令相關,強迫流水線等待。想測吞吐的話,需要讓循環控制的影響儘可能小,別忘了循環變數也會消耗加法器的。你感興趣的話,可以做做看。


現代cpu體系結構下,整數的乘法幾乎與加減法一樣快,除法會慢一些。


貴專業不熟,體系結構彙編語言什麼的不提硬體乘法器么?感覺跟這個有關係。

還有可能你的代碼里寄存器和內存還有磁碟的IO調度佔了太多時間,要看到具體的代碼和運行情況才知道。


現在的用最多的IA CPU中包含六條流水線,一條加,一條乘。最新的支持乘加。所以至少throughput時一樣的。


各種優化,還有處理器的優化

你覺得intel的工程師們會任由乘法比加減法速度一直慢下去么


又是這種問題,就知道看運算複雜度。。。影響性能的因素多了去了,指令周期只是一個方面。你測試的那種情況,主要的性能瓶頸在於把(x,y)載入到內存中。相對於內存延遲,CPU指令根本不算什麼。


乘法會有優化,例如你2乘8,到了彙編層就變成了2左移3位,速度甚至比加法快

例如你2乘3,在彙編層就是lea eax,[eax*2+eax],通過取址的指令,而不是mul指令,達到優化目的(其實這裡就一個左移加上一個加法,而且取址指令更加快)

所以因為種種優化,就會有這樣的錯覺,

所以你想有正確的結果,數值必須足夠複雜或者隨機,很難達到優化的目的,才使用mul指令.


坐等intel手冊~(≧▽≦)/~

所謂快,到底指的是latency還是throughput呢?

乘法如果流水,應該不會慢到哪裡去,題主可以自己用FPGA手寫一個十幾級流水的乘法器→_→

至於延遲的話,我想當然也覺得乘法會慢(*/ω\*)。


使用一堆隨機數試試,再看結果。一般而言乘法計算占很多指令周期的,不過程序以指令流水方式運行,當cpu中含有多個乘法器時,可以保證乘法的CPI降低到加法的水平。


乘法確實比較複雜,尤其是浮點數乘法。

不過這種東西都已經可以用硬體實現了,一般是在一個時鐘周期內完成,並不比加法更費時間


推薦閱讀:

為什麼許多電腦都是默認關閉CPU虛擬化?
如何評價龍芯要做獨立於Wintel、AA體系的第三極?
Intel 為什麼不做 ARM 晶元?
近三年家用級CPU性能的提升有多大?
如何評價Linux之父Linus認為並行計算基本上就是浪費大家的時間?

TAG:程序員 | 中央處理器CPU | 編程 | 最優化 |