2011-01-13 38 views
5

Tôi đang cố gắng tìm ra cách tối ưu hóa một số mã. Ở đây là:chức năng nội tuyến vẫn hiển thị trong tệp .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 

Khi tôi biên dịch với GHC 6.12.1 (Ubuntu Linux trên một máy i486)

GHC --make -O2 Vec.hs -prof -Tự động -all -fforce-recomp

và chạy

Vec + RTS -p

Nhìn vào tập tin 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 

tôi thấy rằng vx chức năng và vy mất một phần đáng kể trong thời điểm đó.

Tại sao lại như vậy? Tôi nghĩ rằng pragma CHUYÊN MÔN CHUYÊN MÔN sẽ làm cho những chức năng đó biến mất.

Khi sử dụng một tổ chức phi-đa hình

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

chức năng vx, vy, vz không hiển thị như một trung tâm chi phí.

+1

Bạn thực sự đã xem xét cốt lõi chưa? Cố gắng biên dịch với '-ddump-core' và xem, điều gì sẽ xảy ra. – fuz

Trả lời

2

Tôi nghi ngờ đây là tác dụng phụ của việc sử dụng -auto-all, điều này hạn chế tối ưu hóa nhiều GHC thường sẽ thực hiện, kể cả nội tuyến. Tôi nghi ngờ sự khác biệt trong phiên bản phi đa hình của bạn thực sự là do vx, vyvz được xác định bằng cú pháp bản ghi thay vì do đa hình (nhưng tôi có thể sai về điều này).

Thay vì sử dụng -auto-tất cả, hãy thử thêm danh sách xuất vào mô-đun và biên dịch bằng "-auto" hoặc đặt các trung tâm chi phí theo cách thủ công qua pragmas SCC. Tôi thường sử dụng pragmas SCC anyway bởi vì tôi thường muốn đặt chúng trên các chức năng cho phép, mà -auto-tất cả sẽ không làm.

2

Tôi không thể tìm ra cách đưa ra nhận xét cho câu trả lời, vì vậy tôi đang đưa ra nhận xét trong câu trả lời này.

Đầu tiên, cảm ơn câu trả lời của bạn.

FUZxxl: Tôi đã thử -ddump-core và nhận được thông báo lỗi rằng -ddump-core là cờ không được công nhận. Có lẽ bạn có nghĩa là -ddump-đơn giản, mà cuốn sách Real World Haskell đề nghị sử dụng, nhưng tôi sợ tôi không biết làm thế nào để đọc đầu ra. Tôi nhìn vào tập tin đầu ra cho "vx", vv, nhưng không bao giờ nhìn thấy chúng. Tôi đoán tôi nên học cách đọc lõi. Có hướng dẫn nào tốt cho điều đó không?

John: Theo flag reference documentation GHC, nếu tôi đọc nó một cách chính xác, cả -Tự động và -Tự động-tất cả, có nghĩa vụ phải thêm _scc_s chức năng không rõ rệt INLINE. Để xem liệu -auto có làm việc cho tôi hay không, tôi đã tạo một trường hợp thử nghiệm khác trong đó mã Vec3 nằm trong một tệp/mô-đun riêng biệt, với Vec3 (Vec3), vx, vy, vz và dấu chấm được xuất. Tôi đã nhập mô-đun này vào tệp Main.hs. Biên dịch chúng với -auto, tôi vẫn thấy vx, vy, vz trong tệp .prof.

Re: Cảm nhận của bạn rằng sự khác biệt có thể là do cú pháp kỷ lục thay vì đa hình, tôi tin rằng sự khác biệt là nhiều khả năng do tính đa hình, bởi vì khi tôi xác định

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

vx, vy và vz vẫn xuất hiện trong tệp .prof.

Tad

+0

Bạn nên cân nhắc sử dụng tài khoản thực cho các câu hỏi của mình. Nếu bạn có một tài khoản như vậy, bạn có thể để lại dấu phẩy trước cho câu hỏi của riêng bạn và sau đó đến bất cứ điều gì khi danh tiếng của bạn đủ cao. – fuz

+0

Cảm ơn lời khuyên. Tôi đã làm điều đó ngay bây giờ. – Tad

Các vấn đề liên quan