對於我必須做的簡要報告,我們的班級使用gcc -O0和icc -O0在羣集上運行代碼。我們發現gcc比icc快2.5倍,沒有任何優化?爲什麼是這樣? gcc -O0實際上是做了一些小的優化,還是僅僅爲了這個系統而工作得更好?爲什麼gcc -o0比icc -o0快?
該代碼是一個天真的字符串搜索算法的實現here,寫在c。
感謝您在-O0
對於我必須做的簡要報告,我們的班級使用gcc -O0和icc -O0在羣集上運行代碼。我們發現gcc比icc快2.5倍,沒有任何優化?爲什麼是這樣? gcc -O0實際上是做了一些小的優化,還是僅僅爲了這個系統而工作得更好?爲什麼gcc -o0比icc -o0快?
該代碼是一個天真的字符串搜索算法的實現here,寫在c。
感謝您在-O0
有幾件事情要考慮到:
指令集每個編譯器默認使用。例如,如果您的GCC版本默認生成i686代碼,而ICC將自身限制爲i586操作碼,則您可能會看到顯着的性能差異。
羣集中的實際CPU。如果您使用AMD處理器而不是英特爾CPU,那麼ICC就處於劣勢,因爲它當然專門針對英特爾處理器。
您提到使用集羣。這種速度差異是否也存在於單個處理器上?如果您使用了編譯器提供的任何並行處理功能,那麼可能會存在顯着差異。
簡化地說,當禁用優化時,編譯器爲每個代碼構造使用預先製作的「模板」。由於這些模板旨在隨後進行優化,所以它們的構建方式可以使優化過程生成更好的代碼。使用-O0
可能會更慢或更快的事實並不意味着什麼 - 例如,更明確的初始代碼可能更容易優化,但執行起來要慢得多。
這就是說,要找出到底是怎麼回事的唯一方法是分析代碼的執行,如果有必要,看看其中的主要差異在於編碼的那些部分的組裝。
我不知道誰在使用i586,當它不容易找到那些古老的CPU –
@LưuVĩnhPhúc:你會感到驚訝。首先,有很多舊CPU正在使用中 - 有些將會在那裏破產; ATM,工業控制器,用於會計和記錄保存的PC。同樣,一些具有舊指令集的CPU仍在生產中用於嵌入式應用。另外,如果性能無關緊要,並且希望應用程序可以在大多數CPU上工作而不考慮供應商,則通常必須編譯爲最低公分母,這通常會是一些舊式CPU。 – thkala
性能不感興趣或指示的任何東西。它明確地說「我不關心性能」,編譯器會幫你解決這個問題;它只是做任何簡單的事情。通過隨機運氣,GCC的最簡單的方法比針對特定硬件配置上的一個高度特定的微基準的ICC最簡單。如果您運行了100個其他微基準,您可能會發現一些ICC速度更快的地方。即使你沒有,那也沒有多大意義。如果您要在編譯器中比較性能,請啓用優化,因爲如果您關心性能,那就是您所做的。
如果你想明白爲什麼一個更快,剖析執行。執行時間在哪裏?哪裏有攤位?爲什麼這些攤位發生?
我們可能正在與一位從某個臭名昭着的編譯器供應商那裏學習的教師打交道,你應該關閉調試優化,因此誰不關心性能而無需優化...... –
沒有優化的基準測試似乎毫無意義的做法。 –
比較程序集轉儲,原因應該很明顯。 – zwol
它是一所大學的成員。毫無意義似乎是一個要求 – Kurru