अधिक विशिष्ट होना करने के लिए, मैं निम्नलिखित अहानिकर दिखने थोड़ा Repa 3 कार्यक्रम है:रेपा 2 और 3 एपीआई के बीच महत्वपूर्ण अंतर क्या हैं?
{-# LANGUAGE QuasiQuotes #-}
import Prelude hiding (map, zipWith)
import System.Environment (getArgs)
import Data.Word (Word8)
import Data.Array.Repa
import Data.Array.Repa.IO.DevIL
import Data.Array.Repa.Stencil
import Data.Array.Repa.Stencil.Dim2
main = do
[s] <- getArgs
img <- runIL $ readImage s
let out = output x where RGB x = img
runIL . writeImage "out.bmp" . Grey =<< computeP out
output img = map cast . blur . blur $ blur grey
where
grey = traverse img to2D luminance
cast n = floor n :: Word8
to2D (Z:.i:.j:._) = Z:.i:.j
---------------------------------------------------------------
luminance f (Z:.i:.j) = 0.21*r + 0.71*g + 0.07*b :: Float
where
(r,g,b) = rgb (fromIntegral . f) i j
blur = map (/ 9) . convolve kernel
where
kernel = [stencil2| 1 1 1
1 1 1
1 1 1 |]
convolve = mapStencil2 BoundClamp
rgb f i j = (r,g,b)
where
r = f $ Z:.i:.j:.0
g = f $ Z:.i:.j:.1
b = f $ Z:.i:.j:.2
कौन इतना समय मेरी 2 है GHZ कोर 2 डुओ लैपटॉप पर एक 640x420 छवि पर कार्रवाई करने लगते हैं:
real 2m32.572s
user 4m57.324s
sys 0m1.870s
मुझे पता है कि कुछ गलत होना चाहिए, क्योंकि मुझे रिपा 2 का उपयोग करके अधिक जटिल एल्गोरिदम पर बहुत बेहतर प्रदर्शन प्राप्त हुआ है। उस एपीआई के तहत, मैंने पाया कि बड़ा सुधार प्रत्येक सरणी परिवर्तन से पहले 'बल' पर कॉल जोड़ने से आया था (जिसे मैं नक्शा, संकल्प, ट्रैवर्स इत्यादि के लिए हर कॉल का मतलब समझें)। मैं रेपा 3 में समान रूप से काम करने के लिए काफी कुछ नहीं कर सकता - वास्तव में मैंने सोचा कि नया अभिव्यक्ति प्रकार पैरामीटर यह सुनिश्चित करना है कि किसी सरणी को मजबूर करने की आवश्यकता होने पर कोई अस्पष्टता नहीं है? और इस योजना में नया monadic इंटरफ़ेस कैसे फिट है? मैंने डॉन एस द्वारा अच्छा ट्यूटोरियल पढ़ा है, लेकिन रेपा 2 और 3 एपीआई के बीच कुछ महत्वपूर्ण अंतराल हैं जिन पर ऑनलाइन AFAIK पर चर्चा नहीं की गई है।
अधिक सरल, क्या उपर्युक्त प्रोग्राम की दक्षता को ठीक करने के लिए एक न्यूनतम प्रभावशाली तरीका है?
यह एक अच्छा जवाब है! मैं समझ गया था कि कम्प्यूट पी 'बल' के प्रतिस्थापन है, लेकिन इसे पहचान मोनैड के साथ उपयोग करने का विचार नहीं किया था। तुम्हारी सहायता सराहनीय है। – sacheie
मेरा मानना है कि मोनैडिक रिटर्न प्रकारों का उपयोग करने का कारण यह है कि कुछ मजबूर करने का विचार मजबूती से बलपूर्वक जुड़ा हुआ है। Http://www.cse.unsw.edu.au/~chak/papers/LCKP12.html में एक बेहतर स्पष्टीकरण है – Axman6