Tad*_*Tad 5 profiler haskell ghc
我正在试图弄清楚如何优化一些代码.这里是:
{-# 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
Run Code Online (Sandbox Code Playgroud)
当我使用ghc 6.12.1(在i486机器上的ubuntu linux)编译时
ghc --make -O2 Vec.hs -prof -auto-all -fforce-recomp
并运行
Vec + RTS -p
看看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
Run Code Online (Sandbox Code Playgroud)
我看到函数vx和vy占用了很大一部分时间.
这是为什么?我认为SPECIALIZE INLINE pragma会让这些功能消失.
使用非多态时
data Vec3D = Vec3D {vx, vy, vz :: !Double} deriving Show
Run Code Online (Sandbox Code Playgroud)
函数vx,vy,vz不显示为成本中心.
我怀疑这是使用的副作用-auto-all
,它抑制了 GHC 通常执行的许多优化,包括内联。我怀疑非多态版本的差异实际上是由于vx
, vy
, 和vz
通过记录语法定义的,而不是因为多态性(但我对此可能是错的)。
不要使用 -auto-all,而是尝试将导出列表添加到模块并使用“-auto”进行编译,或者通过 SCC 编译指示手动设置成本中心。无论如何,我通常使用 SCC 编译指示,因为我经常想将它们设置在 let 绑定函数上,而 -auto-all 则不会这样做。
归档时间: |
|
查看次数: |
227 次 |
最近记录: |