Attualmente sto scrivendo un programma multi-modulo in Haskell. Ho trovato uno strano problema in cui i miei file non vengono ottimizzati correttamente, anche se sto passando in -O2
e così via. I file in questione sono moduli matematici vettoriali 3D condivisi. Quando vengono compilati singolarmente su un file .o, questi moduli sono ottimizzati correttamente. Quando sono compilati come parte di un programma più grande usando --make, non sono ottimizzati correttamente. Il nucleo è abbastanza diverso.GHC non sta ottimizzando moduli diversi dal modulo principale
ho messo in qualche semplice codice di test stripped-down in un file 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)
e importati dalla principale ...
import Vector
Questo codice viene compilato in modo diverso come un autonomo .hs di file rispetto a quando ho costruire main.hs utilizzando --make
la mia linea di comando è:
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
Acclamazioni
Se sto capendo correttamente, stai confrontando l'output di due diverse invocazioni di GHC. Se è giusto, dovresti includere la riga di comando dell'altra chiamata di GHC a cui stai confrontando. –
Ottieni lo stesso codice se metti '{- # INLINE addVeC# -}' sul tuo codice? O se usi '{- # UNPACK # -}' nei campi del tuo vettore? GHC potrebbe non essere in linea tra i limiti del modulo in alcune circostanze. –
Solo per spiegare un po 'di più. Io uso le stesse opzioni della riga di comando ghc per compilare entrambi. Quindi, invoco GHC con le stesse opzioni per compilare main.hs, che compila vector.hs indirettamente, ma uso anche la stessa riga di comando per compilare vector.hs direttamente. Ottengo risultati diversi. Aggiornerò la domanda principale per includere l'output principale. –