更具體,我有以下看似平淡無奇的小惹巴3的程序:Repa 2和3 API之間的主要區別是什麼?
{-# 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
這需要這麼多的時間來處理我的2GHz的Core 2 Duo處理器的筆記本電腦一個640x420的圖像:
real 2m32.572s
user 4m57.324s
sys 0m1.870s
我知道一些東西肯定是錯的,因爲我在使用Repa 2的更復雜的算法上獲得了更好的性能。在該API下,我發現的重大改進來自每次數組轉換之前對'force'的調用理解爲意味着每次調用映射,卷積,遍歷等)。我不能完全理解Repa 3中的類似事情 - 事實上,我認爲新的表現類型參數應該確保關於數組何時需要被迫的模糊性。新的monadic接口如何適應這種方案?我已閱讀Don S的精彩教程,但Repa 2和3 API之間的一些關鍵差距很少在線討論AFAIK。
更簡單地說,是否有一個微不足道的方法來解決上述程序的效率?
這是一個很好的答案!我明白,computeP是'force'的替代品,但並沒有想到將它與monad身份一起使用。我感謝您的幫助。 – sacheie
我相信使用monadic返回類型的原因是因爲強迫某事的想法與順序發生的強制緊密相關。 http://www.cse.unsw.edu.au/~chak/papers/LCKP12.html有更好的解釋 – Axman6