daha spesifik olmak gerekirse, ben şu zararsız görünümlü küçük repai 3 program var:Repa 2 ve 3 API'leri arasındaki temel farklar nelerdir?
real 2m32.572s
user 4m57.324s
sys 0m1.870s
: my 2GHz Core 2 Duo dizüstü bir 640x420 görüntü işlemek için bu kadar zaman alır
{-# 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
o API altında repa 2. kullanarak çok daha karmaşık algoritmalara çok daha iyi performans aldık çünkü
I (her dizi dönüşümü önce buldum büyük bir gelişme 'kuvvet' çağrısı ekleyerek geldi, bir şeylerin yanlış olduğunu biliyorum ki ben Her arama, kavga, traverse vb. Repa 3'teki benzer şeyi tam olarak anlayamıyorum - aslında yeni tezahürat tipi parametrelerin, bir dizinin zorlanması gerektiğinde hiçbir belirsizlik olmamasını sağladığını düşündüm. Ve yeni monadik arayüz bu şemaya nasıl uyuyor? Don S'nin güzel öğreticisini okudum, ancak çevrimiçi AFAIK hakkında çok az tartışılan Repa 2 ve 3 API'leri arasında bazı önemli boşluklar var.
basitçe Daha yukarıdaki programın verimliliğini saptamak minimal etkili yol var?
Bu harika bir cevap! ComputeP'nin 'force' yerine geçtiğini, ancak onu kimlik monad'ıyla kullanmayı düşünmediğini anlamıştım. Yardımın için minnettarım. – sacheie
Monadik geri dönüş türlerinin kullanılmasının sebebi, bir şeyi zorlama fikrinin, sırayla meydana gelen kuvvet-kaşıntılara oldukça sıkı bir şekilde bağlı olduğu için olduğuna inanıyorum. Http://www.cse.unsw.edu.au/~chak/papers/LCKP12.html adresinde daha iyi bir açıklama var. – Axman6