2011-09-09 6 views
27

Obecnie piszę program wielomodułowy w Haskell. Znalazłem dziwny problem, gdy moje pliki nie są prawidłowo zoptymalizowane, mimo że przechodzę w -O2 i tak dalej. Pliki te są udostępniane modułów 3D matematyki wektorowe. Gdy są kompilowane indywidualnie do .o, te moduły są poprawnie zoptymalizowane. Po skompilowaniu jako część większego programu przy użyciu --make, nie są one poprawnie zoptymalizowane. Rdzeń jest zupełnie inny.GHC nie optymalizuje modułów innych niż główny moduł

Włożyłam w jakiś prosty okrojoną kodu testowego do vector.hs pliku:

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) 

i importowanych go od głównego ...

import Vector 

Ten kod zostanie skompilowany inaczej jako samodzielny .hs pliku, w przeciwieństwie do tego, kiedy buduję main.hs pomocą --make

moja linia poleceń jest:

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 

Cheers

+2

Jeśli dobrze rozumiem, porównujesz wyniki dwóch różnych inwokacji GHC. Jeśli to prawda, powinieneś dołączyć wiersz poleceń innej inwokacji GHC, do której się porównasz. –

+1

Czy otrzymasz ten sam kod, jeśli w swoim kodzie wstawisz '{- # INLINE addVeC# -}'? Lub jeśli używasz '{- # UNPACK # -}' na polach twojego wektora? W niektórych okolicznościach GHC może nie być wbudowane w granice modułów. –

+0

Po prostu wyjaśnić trochę więcej. Używam tych samych opcji wiersza poleceń ghc, aby skompilować oba. Tak więc wezwę GHC z tymi samymi opcjami do kompilowania main.hs, który kompiluje vector.hs pośrednio, ale ja też używam tego samego wiersza poleceń do bezpośredniego kompilowania vector.hs. Otrzymuję różne wyniki. Zaktualizuję główne pytanie, aby uwzględnić podstawowe wyniki. –

Odpowiedz

1

Dodaj

{-# INLINE addVeC#-} 

w module głównym.

GHC potrzebuje wskazania tej możliwości przed wykonaniem tej optymalizacji, jeśli invokator/wywoływany nie znajduje się w tych samych modułach.

Powiązane problemy