2011-01-13 8 views
5

में दिखाई देते हैं, मैं कुछ कोड को अनुकूलित करने का तरीका जानने का प्रयास कर रहा हूं। संदेश यह है:इनलाइन फ़ंक्शंस अभी भी .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 

जब मैं GHC 6.12.1 (ubuntu एक i486 मशीन पर लिनक्स) के साथ संकलन

GHC --make -O2 Vec.hs -prof ऑटो निर्माण सभी -fforce-recomp

और चलाने

वीइसी + आरटीएस -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 समय का एक महत्वपूर्ण भाग लेते हैं।

वह क्यों है? मैंने सोचा कि विशेष इनलाइन प्राग्मा करेगा जो कि कार्य दूर हो जाएंगे।

एक गैर बहुरूपी

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

कार्यों वीएक्स, vy उपयोग करते समय, vz एक लागत केंद्र के रूप में नहीं दिखाते।

+1

क्या आपने वास्तव में कोर को देखा था? '-ddump-core 'के साथ संकलित करने का प्रयास करें और देखें, क्या खुशी है। – fuz

उत्तर

2

मुझे संदेह है कि यह -auto-all का उपयोग करने का दुष्प्रभाव है, जो सामान्य रूप से जीएचसी को कई अनुकूलन को रोकता है, जिसमें इनलाइनिंग भी शामिल है। मुझे संदेह है कि आपके गैर-पॉलीमोर्फिक संस्करण में अंतर वास्तव में vx, vy, और vz के कारण बहुरूपता के कारण रिकॉर्ड वाक्यविन्यास के माध्यम से परिभाषित किया जा रहा है (लेकिन मैं इसके बारे में गलत हो सकता हूं)।

-auto-all का उपयोग करने के बजाय, मॉड्यूल में निर्यात सूची जोड़ने और "-auto" के साथ संकलित करने या SCC pragmas के माध्यम से मैन्युअल रूप से लागत केंद्र सेट करने का प्रयास करें। मैं आमतौर पर एससीसी प्रागम्स का उपयोग करता हूं क्योंकि मैं अक्सर उन्हें लेट-बाउंड फ़ंक्शंस पर सेट करना चाहता हूं, जो-सब कुछ नहीं करेंगे।

2

मुझे पता नहीं था कि उत्तरों को टिप्पणियां कैसे करें, इसलिए मैं इस जवाब में टिप्पणी कर रहा हूं।

सबसे पहले, आपके उत्तरों के लिए धन्यवाद।

FUZxxl: मैंने कोशिश की- विवाद-कोर, और एक त्रुटि संदेश मिला कि -डम्प-कोर एक अपरिचित ध्वज था। शायद आप का मतलब था -डम्प-सरल, जिसे रीयल वर्ल्ड हास्केल पुस्तक का उपयोग करने की सिफारिश की गई थी, लेकिन मुझे डर है कि मुझे आउटपुट को पढ़ने का तरीका नहीं पता है। मैंने "vx", आदि के लिए आउटपुट फ़ाइल में देखा, लेकिन उन्हें कभी नहीं देखा। मुझे लगता है मुझे कोर को पढ़ना सीखना चाहिए। क्या इसके लिए कोई अच्छा गाइड है?

जॉन: GHC के flag reference documentation के मुताबिक, अगर मैं इसे सही ढंग से पढ़ रहा हूँ, दोनों ऑटो और ऑटो सभी, कार्यों नहीं चिह्नित इनलाइन को _scc_s जोड़ने वाले हैं। यह देखने के लिए कि क्या मेरे लिए काम करेगा, मैंने एक और परीक्षण केस बनाया जिसमें Vec3 कोड एक अलग फ़ाइल/मॉड्यूल में था, जिसमें Vec3 (Vec3), vx, vy, vz, और dot निर्यात किया गया था। मैंने इस मॉड्यूल को main.hs फ़ाइल में आयात किया। इन्हें साथ-साथ संकलित करना, मैंने अभी भी .prof फ़ाइल में vx, vy, vz देखा है।

पुन: अपनी टिप्पणी है कि अंतर बहुरूपता के बजाय रिकॉर्ड वाक्य रचना की वजह से हो सकता है, मुझे विश्वास है कि अंतर क्योंकि जब मैंने

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

वीएक्स, vy और vz अभी भी परिभाषित, बहुरूपता की वजह से अधिक होने की संभावना है .prof फ़ाइल में दिखाया गया है।

टैड

+0

आपको अपने प्रश्नों के लिए एक वास्तविक खाता उपयोग करने पर विचार करना चाहिए। यदि आपके पास ऐसा खाता है, तो आप पहले अपने प्रश्नों के लिए कमेंट्स छोड़ सकते हैं और फिर जब आपकी प्रतिष्ठा काफी अधिक हो तो कुछ भी हो सकती है। – fuz

+0

सलाह के लिए धन्यवाद। मैंने अभी यह किया है। – Tad