1

我正在對科學應用進行一些性能測試,並試圖考慮所有可能影響應用程序性能的元素(如緩存大小層次結構CPU速度...緩存行以及以往可能與性能有關)。這個問題出現在我的腦海裏,雖然它可能是愚蠢的,但我想讓它變得很明顯。性能乘以2相同/不相同的矩陣

* 問: *

,如果我不對指正please.cost處理整型和浮點或雙精度數在處理器不同,這是因爲使用CPU浮點單元(以計算浮點值)。現在我想知道在用相同的float或double值填充兩個2d矩陣之間是否存在差異,然後將它們相乘或填充它們的隨機float或double值,然後將它們相乘。劑量編譯器使用緩存矩陣的所有元素具有相同的值?

如果A和B的大小對處理時間(例如乘法)有任何影響或沒有影響,那麼A和B可以是數字中不同大小的數字,如(A.B)的總處理處理浮點值?如果有差異劑量,重要的是要考慮與否? 。 我能夠使用性能計數器庫來測量我的應用程序的性能,但是由於使用過的庫的開銷,您無法確定指令/觸發器變化是針對隨機值還是其他參數,如I/Dcache未命中,緩存大小,問題大小或其他參數。

二手機器英特爾E4500。 編譯器g ++ 4.7。

感謝

+2

我非常懷疑編譯器會緩存這些值。另一方面,一些數學API可能會。處理器甚至可能有(可能很小)的機會。要進行基準測試,請運行足夠多的時間或足夠長的矩陣,以便實際使用至少幾秒鐘,然後在性能檢查之外填充矩陣。 – Dukeling

+1

這就是爲什麼高層優化比低層優化更重要的原因。如果你知道所有的值都是相同的,你可以將問題從O(n^3)減少到O(n^2),而無論處理器有多聰明,它總是O(n^3)如果你執行完整的乘法。 –

+0

你的問題真的很一般。你能更具體地瞭解情況嗎?在這種一般情況下,在整個堆棧中提及所有可能的優化幾乎是不可能的。 –

回答

2

你是正確的,整數和浮點運算的成本是不同的,但並不像人們可以承擔。它高度依賴於哪個處理器單元用於計算。特別是對於英特爾處理器,您可以在http://www.intel.com/products/processor/manuals/的「優化參考手冊」中找到有用的信息。附錄C列出了所有指令的指令延遲。

對於您的具體問題,如果矩陣乘法的計算時間取決於兩個矩陣的條目是包含相同還是隨機值,則答案爲「否」。如果您在計算運行時查看指令的數量和順序以及內存訪問模式,則在兩種情況下都是相同的。編譯器通常也不能利用矩陣全部由相同條目組成的事實,因爲矩陣乘法需要覆蓋所有可能的情況。 (好吧,除非你打包所有的東西 - 填充矩陣條目和乘法本身 - 在一個函數中,並排除所有副作用,如鋸齒,然後一個非常非常聰明的編譯器可能會做出一些東西,但我們不是在談論,對不對?)

此外,數字的大小(我假定你指的是十進制數字)並不重要。在單精度浮點數(或雙精度情況下爲64位)的情況下,每個矩陣項由其32位的全部表示。

+0

你可能是對的,但有幾個警告。非常小(非正常)的數字可能非常緩慢地處理,例如慢100倍;並且這樣的數字在迭代優化問題中實際上並不罕見,因爲它們有時會將(某些係數)收斂到零。同樣,NaN和Inf值上的operatiosn並不總是與其他值上的操作一樣快。此外,一些操作(雖然不是,我相信,乘法和加法)在實際芯片上的實現取決於價值,儘管我不認爲這種效應可能經常遇到任何人。 –