2012-05-23 17 views
2

我看起來像一些Fortran代碼:有什麼辦法可以判斷變量是否被優化了?

subroutine foo(mx,my,mz) 
    real pts(3,mx,my,mz) 
end 

陣列點從來沒有真正在子程序中使用 - 我只是忘了刪除它,當我重構我的代碼。現在,由於fortran沒有堆棧和堆的概念,它取決於編譯器在哪裏分配pts - 這是gfortran中數組大小的函數,但我一直無法弄清楚portland組編譯器處理這個。

是否有可能判斷pts是分配在堆棧,堆上,還是完全優化出來(因爲它可能應該是這樣)?是否有可能有一個stackoverflow並不知道它(即沒有運行時錯誤)?我的直覺是,應該可以通過查看編譯器生成的程序集來判斷,但是我不知道我會在那裏看到什麼。

回答

5

最簡單的方法是查看編譯器在編譯-S時提供的彙編代碼,或者使用調試器查找符號。如果數組在堆上分配,也極有可能是分配函數的調用:

  • gfortran ifort默認分配堆棧上的所有陣列插入調用malloc
  • 。如果通過-heap-arrays <size>啓用自動堆陣列就會產生堆分配調用for_alloc
  • PGI編譯器生成到pgf90_auto_alloc電話,但我有這個編譯器和它分配陣列

通過的方式沒有經驗gfortran即使使用默認優化級別,也不會引用數組。我猜想其他編譯器也是這樣做的,但我不會在這裏下注。

2

我認爲這是編譯器特有的問題,因爲與死代碼消除有關的行爲不是通用的,並且不僅是編譯器特有的,而且還是特定於案例的。開啓優化的現代編譯器肯定會消除所有無法訪問的代碼或代碼,這些代碼在程序狀態方面沒有任何效果。未使用的變量和數組根本不會在最終的可執行文件中結束。

正如您所提到的,您最好的選擇是查看編譯後的二進制文件的彙編代碼,並查看它的功能。

相關問題