Преобразование ускоренного представления массива в представление массива репы

Я хотел бы преобразовать ускоренный массив в массив repa, прежде чем использовать writeImageToBMP из repa-io записать массив в файл BMP. Не обращайте внимания на тот факт, что такая функция существует в ускорении, я просто использую ее в качестве примера вопроса. Возьмите:

{-# LANGUAGE ScopedTypeVariables #-}
import qualified Data.Array.Accelerate.Interpreter as A (run)
import Data.Array.Accelerate
import qualified Data.Array.Accelerate as A
import qualified Data.Array.Accelerate.IO as A
import qualified Data.Array.Repa as Repa
import qualified Data.Array.Repa.IO.BMP as Repa
import GHC.Word

main :: IO ()
main = do
  let accelArr = A.fromList
                 (Z :. (2::Int) :. (1::Int))
                 ([(1,2,3),(4,5,6)] :: [(Word8,Word8,Word8)])
      computation :: A.Acc (A.Array A.DIM2 (Word8,Word8,Word8))
      computation = A.map
       (\triple ->
           let (r',g',b') = unlift triple :: (Exp Word8,Exp Word8,Exp Word8)
           in lift (constant 0,g',b')) (use accelArr)
      repaArr :: Repa.Array A.A Repa.DIM2 (Word8,Word8,Word8)
      repaArr = A.toRepa (A.run computation)
  Repa.writeImageToBMP "out_repa.bmp" repaArr

Пакеты ускоряются, ускоряются, репа и репо восстанавливаются для компиляции этого кода.

Это не компилируется, потому что тип для writeImageToBmp в репа-ио есть:

writeImageToBMP
  :: FilePath
  -> Repa.Array Repa.U Repa.DIM2 (Word8, Word8, Word8)
  -> IO ()

куда U представляет массив манифеста в репа. Ошибка GHC:

Couldn't match type ‘A.A’ with ‘Repa.U’
Expected type: Repa.Array Repa.U Repa.DIM2 (Word8, Word8, Word8)
  Actual type: Repa.Array A.A Repa.DIM2 (Word8, Word8, Word8)
In the second argument of ‘Repa.writeImageToBMP’, namely ‘repaArr’
In a stmt of a 'do' block:
  Repa.writeImageToBMP "out_repa.bmp" repaArr

Тип repaArr является:

Repa.Array A.A Repa.DIM2 (Word8,Word8,Word8)

Вот почему GHC жалуется на то, что это аргумент writeImageToBMP,

Вопрос: Как мне преобразовать ускоренное представление массива? A к представлению массива repa Uтак что я могу позвонить writeImageToBMP в теме?

1 ответ

Решение

Обратите внимание, что функции computeS, computeP, copyS и copyP в Data.Array.Repa имеют такую ​​подпись:

...constraints... => Array r1 sh e -> m (Array r2 sh e)

и, следовательно, они являются функциями, которые позволяют вам конвертировать различные представления Repa (т.е. конвертировать r1 -> r2).

Имея это в виду, я получил этот код для проверки типа:

main :: IO ()
main = do
  let accelArr = A.fromList
                 (Z :. (2::Int) :. (1::Int))
                 ([(1,2,3),(4,5,6)] :: [(Word8,Word8,Word8)])
      computation :: A.Acc (A.Array A.DIM2 (Word8,Word8,Word8))
      computation = A.map
       (\triple ->
           let (r',g',b') = unlift triple :: (Exp Word8,Exp Word8,Exp Word8)
           in lift (constant 0,g',b')) (use accelArr)
      repaArr :: Repa.Array A.A Repa.DIM2 (Word8,Word8,Word8)
      repaArr = A.toRepa (A.run computation)
  zzz <- Repa.copyP repaArr
  Repa.writeImageToBMP "out_repa.bmp" zzz

Вы также можете использовать Repa.copyS Вот.

Другие вопросы по тегам