簡體   English   中英

為什么gcc -o0比icc -o0快?

[英]Why would gcc -o0 be faster than icc -o0?

對於我要做的簡短報告,我們的類在同時使用gcc -O0和icc -O0的集群上運行了代碼。 我們發現gcc在沒有任何優化的情況下比icc快2.5倍? 為什么是這樣? gcc -O0實際上是做了一些小的優化,還是恰好對這個系統更好地工作?

該代碼是用c編寫的此處找到的幼稚字符串搜索算法的實現。

謝謝

在-O0的性能並不有趣,也不表示什么。 它明確表示“我不在乎性能”,編譯器會幫助您解決這一問題; 它只會做最簡單的事情。 幸運的是,對於您的特定硬件配置上的一個高度特定的微基准,對於GCC而言,最簡單的方法比對ICC而言最簡單的方法要快。 如果您另外運行了100個微基准測試,您可能還會發現一些ICC速度更快的基准。 即使您沒有,那也不會有太大的意義。 如果要比較各個編譯器的性能,請啟用優化功能,因為這是您關心性能時要執行的操作。

如果您想了解為什么速度更快,請分析執行情況。 執行時間花在哪里? 哪里有攤位? 為什么發生這些失速?

需要考慮的幾件事:

  • 每個編譯器默認使用的指令集。 例如,如果您的GCC構建默認情況下生成i686代碼,而ICC將自身限制為i586操作碼,則可能會看到明顯的性能差異。

  • 集群中的實際CPU。 如果您使用AMD處理器而不是Intel CPU,那么ICC處於不利地位,因為ICC當然專門針對Intel處理器。

  • 您提到使用集群。 這種速度差異是否也存在於單個處理器上? 如果您使用了編譯器提供的任何並行化工具,那么那里可能會有很大的不同。

  • 簡單來說,禁用優化后,編譯器將為每個代碼構造使用預制的“模板”。 由於這些模板打算在以后進行優化,因此它們的構造方式使優化過程可以生成更好的代碼。 使用-O0可能會變慢或變快,這實際上並不意味着什么-例如,更明確的初始代碼可能更易於優化,但執行起來卻慢得多。

也就是說,找出正在發生的事情的唯一方法是分析代碼的執行情況,並在必要時查看主要區別所在的那些代碼部分的匯編。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM