首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将加速的数组表示转换为repa的U数组表示

将加速的数组表示转换为repa的U数组表示
EN

Stack Overflow用户
提问于 2015-11-05 15:01:04
回答 1查看 103关注 0票数 1

我想将加速数组转换为repa数组,然后使用repa的writeImageToBMP将数组写入BMP文件。忽略存在这样一个函数的事实-io,我只是用它作为一个问题的例子。采取:

代码语言:javascript
复制
{-# 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

这些包可以加速、加速-io、repa和repa来编译这个代码.

这不能编译,因为repa中的writeImageToBmp类型是:

代码语言:javascript
复制
writeImageToBMP
  :: FilePath
  -> Repa.Array Repa.U Repa.DIM2 (Word8, Word8, Word8)
  -> IO ()

其中U表示repa中的清单数组。GHC错误是:

代码语言:javascript
复制
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的类型是:

代码语言:javascript
复制
Repa.Array A.A Repa.DIM2 (Word8,Word8,Word8)

这就是为什么GHC抱怨这是writeImageToBMP的一个论点。

问题:如何将加速数组表示A转换为repa清单数组表示U,以便在其上调用writeImageToBMP

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 17:44:45

注意,computeScomputePcopyScopyPData.Array.Repa中具有这样的签名:

代码语言:javascript
复制
...constraints... => Array r1 sh e -> m (Array r2 sh e)

因此,它们是允许您在不同Repa表示(即转换r1 -> r2)之间进行转换的函数。

考虑到这一点,我需要输入以下代码:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33547919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档