Преобразование ускоренного представления массива в представление массива репы
Я хотел бы преобразовать ускоренный массив в массив 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
Вот.