[英]Should I use matching (gcc) compiler optimization flags when profiling the code?
我在編譯代碼時使用-O3 ,現在我需要對其進行分析。 對於分析,我有兩個主要選擇: valgrind --tool = callgrind和gprof 。
Valgrind(callgrind)文檔聲明:
與Cachegrind一樣,您可能希望使用調試信息(-g選項)進行編譯並啟用優化。
但是,在Agner Fog的C ++優化書中 ,我讀過以下內容:
許多優化選項與調試不兼容。 調試器可以一次執行一行代碼並顯示所有變量的值。 顯然,當部分代碼被重新排序,內聯或優化時,這是不可能的。 通常可以使程序的兩個版本可執行:在程序開發期間使用的具有完全調試支持的調試版本,以及啟用了所有相關優化選項的發布版本。 大多數IDE(集成開發環境)都具有制作調試版本和目標文件和可執行文件的發行版本的工具。 確保區分這兩個版本並關閉可執行文件的優化版本中的調試和分析支持。
這似乎與callgrind
指令沖突,以使用調試信息標志-g
編譯代碼。 如果我按以下方式啟用調試:
-ggdb -DFULLDEBUG
我不會導致此選項與-O3
優化標志沖突嗎? 在我到目前為止所閱讀的內容之后,使用這兩個選項對我來說毫無意義。
如果我使用說-O3
優化標志,我可以使用以下命令編譯帶有其他分析信息的代碼:
-pg
仍然用valgrind描述它?
配置編譯的代碼是否有意義
-ggdb -DFULLDEBUG -O0
標志? 這看起來很愚蠢 - 不是內聯函數和展開循環可能會改變代碼中的瓶頸,所以這應該僅用於開發,以使代碼實際上正確地執行 。
用一個優化標志編譯代碼並用另一個優化標志編譯代碼是否有意義?
你為什么要剖析? 只是為了測量或找到加速?
您應該只分析優化代碼的常識是基於假設代碼幾乎是最佳的開始,如果有顯着的加速,則不是。
您應該將加速的發現視為錯誤。 許多人使用這種方法 。
在你刪除了不必要的計算后,如果你仍然有緊張的CPU循環,即你沒有把所有的時間花在系統或庫或優化器沒有看到的I / O例程上,那么打開-O3,然后讓它做它的魔力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.