2011-09-09 14 views
27

Actualmente estoy escribiendo un programa de varios módulos en Haskell. He encontrado un problema extraño donde mis archivos no se están optimizando correctamente, aunque estoy pasando -O2 y así sucesivamente. Los archivos en cuestión son módulos compartidos de matemáticas en 3D. Cuando se compilan individualmente en un .o, estos módulos se optimizan correctamente. Cuando se compilan como parte de un programa más grande que utiliza --make, no están optimizados correctamente. El núcleo es bastante diferente.GHC no optimiza módulos que no sean el módulo principal

me he puesto en algunos simples código de prueba reducidos al mínimo en un archivo 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 importados desde principal ...

import Vector 

Este código se compila de manera diferente como un independiente .hs archivo en contraposición a cuando construyo utilizando main.hs --make

Mi línea de comandos es:

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 

Saludos

+2

Si estoy entendiendo correctamente, está comparando el resultado de dos invocaciones diferentes de GHC. Si es así, debe incluir la línea de comando de la otra invocación de GHC con la que está comparando. –

+1

¿Obtiene el mismo código si coloca '{- # INLINE addVeC# -}' en su código? ¿O si usas '{- # UNPACK # -}' en los campos de tu vector? Es posible que GHC no se alinee entre los límites del módulo en algunas circunstancias. –

+0

Solo para explicar un poco más. Yo uso las mismas opciones de línea de comando ghc para compilar ambos. Entonces, invocaré a GHC con las mismas opciones para compilar main.hs, que compila vector.hs indirectamente, pero también uso la misma línea de comando para compilar vector.hs directamente. Obtengo resultados diferentes Actualizaré la pregunta principal para incluir la salida central. –

Respuesta

1

Añadir

{-# INLINE addVeC#-} 

en el módulo principal.

GHC necesita una indicación de esa posibilidad antes de hacer esa optimización, si el invokator/invokated no está en los mismos módulos.

Cuestiones relacionadas