Để cụ thể hơn, tôi có ít chương trình Repa 3 vô hại-looking sau:Sự khác biệt chính giữa API Repa 2 và 3 là gì?
{-# 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
nào mất nhiều thời gian này để xử lý một hình ảnh 640x420 trên 2Ghz core 2 duo máy tính xách tay của tôi:
real 2m32.572s
user 4m57.324s
sys 0m1.870s
Tôi biết điều gì đó phải sai, vì tôi đã có hiệu suất tốt hơn nhiều trên các thuật toán phức tạp hơn bằng cách sử dụng Repa 2. Theo API đó, cải tiến lớn mà tôi tìm thấy đến từ việc thêm một lời gọi vào 'force' trước mỗi biến đổi mảng (mà tôi hiểu nghĩa là mọi cuộc gọi đến bản đồ, convolve, đi qua vv). Tôi không thể làm ra điều tương tự để làm trong Repa 3 - trên thực tế tôi nghĩ rằng các thông số kiểu biểu hiện mới được cho là để đảm bảo không có sự mơ hồ về khi một mảng cần phải bị ép buộc? Và giao diện monadic mới phù hợp với chương trình này như thế nào? Tôi đã đọc hướng dẫn hay của Don S, nhưng có một số khoảng trống chính giữa API Repa 2 và 3 mà ít được thảo luận trực tuyến về AFAIK.
Đơn giản hơn, có cách nào có tác động tối thiểu để khắc phục hiệu quả của chương trình trên không?
Đây là một câu trả lời tuyệt vời! Tôi đã hiểu rằng tính toánP là sự thay thế cho 'lực lượng', nhưng đã không nghĩ đến việc sử dụng nó với danh tính đơn sắc. Tôi đánh giá cao sự giúp đỡ của bạn. – sacheie
Tôi tin rằng lý do sử dụng các kiểu trả về đơn thuần là vì ý tưởng buộc một cái gì đó ở khá chặt chẽ với các lực lượng xảy ra liên tục. Có giải thích tốt hơn trong http://www.cse.unsw.edu.au/~chak/papers/LCKP12.html – Axman6