11

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?

cevap

10

yeni gösterim türü parametreleri automagicallylar (muhtemelen o kadar da iyi yapmak zor problem) zorlamayın - hala elle zorlamak zorundayız. o monadic yüzden sadece de Monad Kimlik kullanabilirsiniz çünkü

computeP 
    :: (Monad m, Repr r2 e, Fill r1 r2 sh e) 
    => Array r1 sh e -> m (Array r2 sh e) 

Ben şahsen gerçekten anlamıyorum: Repa 3'te bu computeP fonksiyonu ile yapılır Yani

import Control.Monad.Identity (runIdentity) 
force 
    :: (Repr r2 e, Fill r1 r2 sh e) 
    => Array r1 sh e -> Array r2 sh e 
force = runIdentity . computeP 

şimdi, senin output işlevi uygun zorlama ile tekrar yazılabilir: bir kısaltma f ile

output img = map cast . f . blur . f . blur . f . blur . f $ grey 
    where ... 

yardım etmek için bir yardımcı işlev u kullanılarak tür kesmesi: Bu değişikliklerle birlikte

u :: Array U sh e -> Array U sh e 
u = id 
f = u . force 

, hızlanma oldukça dramatik - Her çıkış piksel gerekli olandan çok daha fazla değerlendirilmesi biter zorlayarak ara vermeden gibi beklenebilir ki (ara değerler paylaşılmaz) .

Orijinal kod:

real 0m25.339s 
user 1m35.354s 
sys  0m1.760s 

zorlama ile: 600x400 png ile test edilmiştir

real 0m0.130s 
user 0m0.320s 
sys  0m0.028s 

, çıkış dosyaları aynıydı.

+0

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

+1

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

7

computeP yeni force olduğunu. Eğer ne yaptığınızı benzer Repa 2.

yılında repa-örneklerden Laplace örnek force kullanılmış olurdu her yerde

Repa 3 size computeP kullanmak gerekir. Ayrıca blur işlevinde cmap yerine düz map kullanmalıdır. Ana sayfamda neden gelecek hafta başlarında bir açıklama yapacağım. gerektiğinde

+0

Haskell topluluğunun en iyi tarafı - kütüphane geliştiricilerinin kendileriyle ilgili geri bildirimler :) Kağıdınızı merakla bekliyorum. – sacheie

İlgili konular