Каковы основные различия между API Repa 2 и 3?

Чтобы быть более конкретным, у меня есть следующая безобидная на вид маленькая программа Repa 3:

{-# 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

Которая занимает столько времени для обработки изображения 640x420 на моем ноутбуке 2Ghz core 2 duo:

real    2m32.572s
user    4m57.324s
sys     0m1.870s

Я знаю, что что-то должно быть совершенно не так, потому что я получил гораздо лучшую производительность на гораздо более сложных алгоритмах, используя Repa 2. В этом API большое улучшение, которое я обнаружил, произошло благодаря добавлению вызова «force» перед каждым преобразованием массива (что я понимаю означает каждый вызов карты, свертки, перемещения и т. д.).Я не могу понять аналогичную вещь, которую нужно сделать в Repa 3 - на самом деле я думал, что новые параметры типа проявления должны гарантировать отсутствие двусмысленности в отношении того, когда массив должен быть форсирован? И как в эту схему вписывается новый монадический интерфейс? Я прочитал хороший учебник Дона С., но между API Repa 2 и 3 есть некоторые ключевые пробелы, которые мало обсуждаются в Интернете, насколько мне известно.

Проще говоря, есть ли минимально эффективный способ исправить эффективность вышеуказанной программы?

11
задан sacheie 25 May 2012 в 00:34
поделиться