встроенные функции по-прежнему отображаются в файле .prof - PullRequest
5 голосов
/ 13 января 2011

Я пытаюсь выяснить, как оптимизировать некоторый код.Вот оно:


{-# 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

Когда я компилирую с помощью ghc 6.12.1 (Ubuntu Linux на компьютере с i486)

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

Я вижу, что функции vx и vy занимают значительную часть времени.

Почему это так?Я думал, что из-за прагмы SPECIALIZE INLINE эти функции исчезнут.

При использовании неполиморфных

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

функции vx, vy, vz не отображаются как центр затрат.

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Я не мог понять, как комментировать ответы, поэтому я делаю комментарии в этом ответе.

Во-первых, спасибо за ваши ответы.

FUZxxl: я попытался -ddump-core и получил сообщение об ошибке, что -ddump-core был нераспознанным флагом. Возможно, вы имели в виду -ddump -imp, который рекомендовала использовать книга Real World Haskell, но, боюсь, я не знаю, как прочитать вывод. Я искал в выходном файле «vx» и т. Д., Но никогда не видел их. Я думаю, я должен научиться читать ядро. Есть ли хорошие руководства для этого?

Джон: Согласно справочной документации флага GHC , если я правильно читаю, предполагается, что -auto и -auto-all добавляют _scc_s к функциям , а не с пометкой INLINE , Чтобы увидеть, будет ли -auto работать для меня, я создал еще один тестовый пример, в котором код Vec3 находился в отдельном файле / модуле, с экспортированными Vec3 (Vec3), vx, vy, vz и dot. Я импортировал этот модуль в файл Main.hs. Скомпилировав их с -auto, я все еще видел vx, vy, vz в файле .prof.

Re: ваш комментарий о том, что разница может быть связана с синтаксисом записи, а не с полиморфизмом. Я полагаю, что разница более вероятна из-за полиморфизма, потому что, когда я определил

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

vx, vy и vz все еще отображаются в файле .prof.

Тэд

2 голосов
/ 13 января 2011

Я подозреваю, что это побочный эффект от использования -auto-all, который запрещает многие оптимизации, которые GHC обычно выполняет, включая встраивание.Я подозреваю, что разница в вашей неполиморфной версии на самом деле связана с тем, что vx, vy и vz определяются с помощью синтаксиса записи, а не из-за полиморфизма (но я могу ошибаться).

Вместо использования -auto-all, попробуйте либо добавить список экспорта в модуль и скомпилировать с помощью "-auto", либо вручную установить МВЗ с помощью прагм SCC.В любом случае я обычно использую прагмы SCC, потому что часто хочу установить их для функций с привязкой по буквам, что -auto-all не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...