27
我目前正在Haskell中編寫一個多模塊程序。我發現了一個奇怪的問題,即我的文件未被正確優化,即使我傳入了-O2
等等。有問題的文件是共享的3D矢量數學模塊。當單獨編譯爲.o時,這些模塊會被正確優化。當使用--make編譯爲較大程序的一部分時,它們沒有正確優化。核心是完全不同的。GHC不優化主模塊以外的模塊
我已經把一些簡單的精簡測試代碼爲vector.hs文件:
data TestVector = TestVector !Double !Double !Double !Double
addVec :: TestVector -> TestVector -> TestVector
addVec (TestVector x1 y1 z1 w1) (TestVector x2 y2 z2 w2) =
TestVector (x1 + x2) (y1 + y2) (z1 + z2) (w1 + w2)
而且從主要進口它...
import Vector
該代碼被編譯不同作爲一個獨立的.hs文件,而不是當我建立main.hs使用--make
我的命令行是:
ghc -tmpdir tmp -hidir hi -odir obj -fext-core -fexcess-precision -funbox-strict-fields -threaded -rtsopts -fwarn-missing-signatures -Wall -O2 Main.hs -o main
乾杯
如果我理解正確,那麼您將比較兩個不同的GHC調用的輸出。如果這是正確的,你應該包括你正在比較的另一個GHC調用的命令行。 –
如果你在代碼中加入了{{##INLINE addVec# - }',你會得到相同的代碼嗎?或者,如果你在矢量的字段上使用了「{ - #UNPACK# - }」?在某些情況下,GHC可能不會跨越模塊邊界。 –
只是爲了解釋一點。我使用相同的ghc命令行選項來編譯這兩個選項。所以,我會用相同的選項來調用GHC來編譯main.hs,它會間接編譯vector.hs,但我也使用相同的命令行直接編譯vector.hs。我得到不同的結果。我會更新主要問題以包含核心輸出。 –