더 구체적으로, 나는 다음과 같은 무해한 보이는 작은 바디 수리 3 프로그램이 있습니다Repa 2와 3 API의 주요 차이점은 무엇입니까?
real 2m32.572s
user 4m57.324s
sys 0m1.870s
: 내 2GHz의 코어 2 듀오 노트북에 640x420 이미지를 처리하기 위해이 정도의 시간이 소요
{-# 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
을
RepA 2를 사용하는 훨씬 더 복잡한 알고리즘에 대해 훨씬 더 나은 성능을 얻었 기 때문에 무언가가 틀림 없음을 알고 있습니다.이 API에서 발견 된 큰 개선점은 모든 배열 변환 전에 '강제'호출을 추가 한 것입니다. map, convolve, traverse 등의 모든 호출을 의미하는 것으로 이해). 필자는 Repa 3에서 할 수있는 비슷한 것을 만들 수 없다. 사실, 새로운 구현 형 매개 변수가 배열을 강제해야 할 때에 대한 모호성이 없도록 보장한다고 생각 했는가? 그리고 새로운 모나드 인터페이스는이 계획에 어떻게 들어 맞습니까? 나는 Don S가 작성한 훌륭한 튜토리얼을 읽었지만, 온라인 AFAIK에 대해서는 거의 언급되지 않은 Repa 2와 3 API 사이에 몇 가지 중요한 차이가있다.
더 간단히 말하면, 위의 프로그램의 효율성을 수정하는 데 최소한의 영향을 미치는 방법이 있습니까?
이것은 훌륭한 대답입니다! 나는 computeP가 '힘'의 대체물이지만, 신원 모나드와 함께 사용하지 않을 것이라고 이해했다. 도와 주셔서 감사합니다. – sacheie
나는 모나드 리턴 타입을 사용하는 이유는 무언가를 강요한다는 생각이 순차적으로 일어나는 힘과 밀접하게 연결되어 있기 때문이라고 생각한다. http://www.cse.unsw.edu.au/~chak/papers/LCKP12.html에 더 좋은 설명이 있습니다. – Axman6