2011-01-13 10 views
5

Estoy tratando de averiguar cómo optimizar algunos códigos. Aquí está:funciones en línea todavía aparecen en el archivo .prof


{-# OPTIONS_GHC -funbox-strict-fields #-} 

data Vec3 a = Vec3 !a !a !a 

vx :: Vec3 a -> a 
vx (Vec3 x _ _) = x 
{-# SPECIALIZE INLINE vx :: Vec3 Double -> Double #-} 

vy :: Vec3 a -> a 
vy (Vec3 _ y _) = y 
{-# SPECIALIZE INLINE vy :: Vec3 Double -> Double #-} 

vz :: Vec3 a -> a 
vz (Vec3 _ _ z) = z 
{-# SPECIALIZE INLINE vz :: Vec3 Double -> Double #-} 


dot :: (Num a) => Vec3 a -> Vec3 a -> a 
dot u v = (vx u * vx v) + (vy u * vy v) + (vz u * vz v) 
{-# SPECIALIZE INLINE dot :: Vec3 Double -> Vec3 Double -> Double #-} 


type Vec3D = Vec3 Double 

-- just make a bunch of vecs to measure performance 

n = 1000000 :: Double 

v1s = [Vec3 x y z | (x, y, z) <- zip3 [1 .. n] [2 .. n + 1] [3 .. n + 2]] 
     :: [Vec3D] 

v2s = [Vec3 x y z | (x, y, z) <- zip3 [3 .. n + 2] [2 .. n + 1] [1 .. n]] 
     :: [Vec3D] 


dots = zipWith dot v1s v2s :: [Double]  
theMax = maximum dots :: Double 
main :: IO() 
main = putStrLn $ "theMax: " ++ show theMax 

Cuando compilo con GHC 6.12.1 (Ubuntu Linux en una máquina i486)

GHC --make -O2 Vec.hs -prof -auto -todas -fforce-ReComp

y ejecutar

Vec + RTS -p

Mirando el archivo Vec.prof,


COST CENTRE     MODULE    %time %alloc 

v2s       Main     30.9 36.5 
v1s       Main     27.9 31.3 
dots       Main     27.2 27.0 
CAF       GHC.Float    4.4 5.2 
vy        Main     3.7 0.0 
vx        Main     2.9 0.0 
theMax       Main     2.2 0.0 

veo que el VX función y vy toman una porción significativa del tiempo.

¿Por qué es eso? Pensé que SPECIALIZE INLINE pragma haría esas funciones desaparecen.

Cuando se utiliza un no polimórficos

data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show 

la funciones vx, vy, vz no muestran como un centro de costos.

+1

¿De hecho miró el núcleo? Intenta compilar con '-ddump-core' y mira, qué sucedió. – fuz

Respuesta

2

Sospecho que este es un efecto secundario del uso de -auto-all, que inhibe muchas optimizaciones que GHC normalmente realizaría, incluida la alineación. Sospecho que la diferencia en su versión no polimórfica se debe en realidad a vx, vy y vz que se define a través de la sintaxis del registro en lugar de a causa del polimorfismo (pero podría estar equivocado al respecto).

En lugar de usar -auto-all, intente agregar una lista de exportación al módulo y compilar con "-auto", o establecer manualmente centros de coste a través de pragmas SCC. Usualmente uso los pragmas de SCC de todas formas porque a menudo quiero configurarlos en funciones con permiso de acceso, lo que no sucede con todo.

2

No pude encontrar la manera de hacer comentarios a las respuestas, así que estoy haciendo comentarios en esta respuesta.

Primero, gracias por sus respuestas.

FUZxxl: Intenté -ddump-core, y recibí un mensaje de error que -ddump-core era una marca no reconocida. Quizás quisiste decir -ddump-simpl, que el libro Real World Haskell recomienda usar, pero me temo que no sé cómo leer el resultado. Busqué en el archivo de salida "vx", etc., pero nunca los vi. Creo que debería aprender a leer core. ¿Hay alguna buena guía para eso?

John: De acuerdo con flag reference documentation de GHC, si estoy leyendo correctamente, tanto -auto y -auto-todo, se supone añadir a _scc_s funciones no marcada línea. Para ver si -auto funcionaría para mí, creé otro caso de prueba en el que el código Vec3 estaba en un archivo/módulo separado, con Vec3 (Vec3), vx, vy, vz y dot exported. Importé este módulo en un archivo Main.hs. Compilándolas con -auto, todavía vi vx, vy, vz en el archivo .prof.

Re: su comentario de que la diferencia podría deberse a la sintaxis de registro en lugar de polimorfismo, creo que la diferencia es más probable debido al polimorfismo, porque cuando he definido

data Vec3 a = Vec3 {vx, vy, vz :: !a} 

vx, vy y vz todavía apareció en el archivo .prof.

Tad

+0

Debería considerar usar una cuenta real para sus preguntas. Si tiene esa cuenta, puede dejar a los comensales primero en sus propias preguntas y luego a cualquier cosa cuando su reputación sea lo suficientemente alta. – fuz

+0

Gracias por el asesoramiento. Lo he hecho ahora. – Tad

Cuestiones relacionadas