标签: repa

如何在一个范围内使用Repa进行数组切片

我试图使用Repa实现累积和函数以计算积分图像.我目前的实现如下所示:

cumsum :: (Elt a, Num a) => Array DIM2 a -> Array DIM2 a
cumsum array = traverse array id cumsum' 
    where
        elementSlice inner outer = slice array (inner :. (0 :: Int))
        cumsum' f (inner :. outer) = Repa.sumAll $ elementSlice inner outer
Run Code Online (Sandbox Code Playgroud)

问题出在elementSlice函数中.在matlab中或说numpy,这可以指定为array [inner,0:outer].所以我正在寻找的是:

slice array (inner :. (Range 0 outer))
Run Code Online (Sandbox Code Playgroud)

但是,似乎不允许在当前的Repa范围内指定切片.我考虑过在Haskell中使用高效并行模板卷积中讨论的分区,但如果每次迭代都改变它,这似乎是一个相当重要的方法.我还考虑过屏蔽切片(乘以二进制矢量) - 但这似乎再次对大型矩阵执行得很差,因为我会为矩阵中的每个点分配一个掩码矢量...

我的问题 - 有没有人知道是否有计划增加支持切片范围到维修?或者是否有一种高效的方式我可以解决这个问题,也许采用不同的方法?

arrays haskell repa

7
推荐指数
2
解决办法
2071
查看次数

没有并行化的修复

我真的很喜欢它Repa的界面,即使它的并发能力也是如此.而且我实际上需要修复数组是顺序的,因为我的数组是相对较小的数组,并且它们上的并行化是无用的,甚至是有害的.

但是我在我的程序中使用parallel-io进行并行化,所以我编译它-threaded并运行+RTS -Nx.这样就可以实现并行化.有没有办法关闭repa的并发功能?

嗯,在写这篇文章时我明白我不太可能需要其他任何东西DIM1,所以也许我应该转而去Vector.但是,问题的答案将是有用的.

我通过并行运行得到的警告信息是

Data.Array.Repa: Performing nested parallel computation sequentially.
  You've probably called the 'force' function while another instance was
  already running. This can happen if the second version was suspended due
  to lazy evaluation. Use 'deepSeqArray' to ensure that each array is fully
  evaluated before you 'force' the next one.
Run Code Online (Sandbox Code Playgroud)

force我的代码实际上没有.

haskell repa

7
推荐指数
1
解决办法
437
查看次数

你如何在Repa中计算[i] = f(a [i-1])?

可以在Repa中计算一个依赖于过去值(即较小索引)的数组吗?给出了阵列的初始部分(例如a[0]).(注意我使用类似C的表示法来表示数组的元素;请不要混淆.)

我阅读了教程并快速检查了hackage但我找不到一个功能来完成它.

(我想在一维数组中进行这种计算并不会导致修复,因为你无法对其进行并行化.但我认为你可以在2维或更多维的情况下并行化它.)

编辑:可能我应该更具体地说明f我想要使​​用什么样的.由于在a[i]标量的情况下没有办法并行化,所以让我们关注的a[i]是N dim向量.我不需要a[i]更高维度(例如矩阵)因为你可以将它"展开"到矢量.因此,f是将R ^ N映射到R ^ N的函数.

大多数情况下,它是这样的:

b = M a[i-1]
a[i][j] = g(b)[j]
Run Code Online (Sandbox Code Playgroud)

其中b是N dim向量,M是N×N矩阵(没有稀疏性假设),并且g是一些非线性函数.我想为i=1,..N-1给定的计算它a[0],g并且M.我希望有一些通用的方法来(1)并行化这种类型的计算和(2)分配中间变量,如b高效(在类C语言中,你可以只重复使用它,如果修复或类似的图书馆可以做到像魔术一样不破坏纯度).

haskell repa

6
推荐指数
1
解决办法
463
查看次数

修复动态编程

两个相关的问题.

  • 是否存在修复数组的可变(ST monad)实现的原因?等效于Data.Vector.Mutable但具有形状.

  • 与此相关的是,如何在未装箱的表示中实现动态编程算法(从同一数组的其他元素计算的数组元素)?

haskell repa

6
推荐指数
1
解决办法
312
查看次数

在使用repa时使用Identity monad与mmultP有什么问题?

我不明白为什么这个程序使用repa:

import Data.Array.Repa
import Data.Array.Repa.Algorithms.Matrix
import Data.Functor.Identity

go = runIdentity $ do
  let mat = fromListUnboxed (ix2 2 2) [1..4]
  let ins = fromListUnboxed (ix2 2 1) [1, 1]
  mmultP mat ins
Run Code Online (Sandbox Code Playgroud)

给我以下警告:

Data.Array.Repa: Performing nested parallel computation sequentially.
  You've probably called the 'compute' or 'copy' function while another
  instance was already running. This can happen if the second version
  was suspended due to lazy evaluation. Use 'deepSeqArray' to ensure
  that each array is fully evaluated before you …
Run Code Online (Sandbox Code Playgroud)

parallel-processing haskell repa

6
推荐指数
1
解决办法
128
查看次数

Haskell:并行计算和 monad 的“顺序属性”

我很困惑为什么 REPA 函数computeP将其结果打包在一个 monad 中。它具有以下类型签名。

computeP :: (Load r1 sh e, Target r2 e, Source r2 e, Monad m) =>
            Array r1 sh e -> m (Array r2 sh e)
Run Code Online (Sandbox Code Playgroud)

本教程中它说

这样做的原因是monad 给出了一个明确定义的序列概念,因此计算 P 强制在 monadic 计算的特定点完成并行评估。

同样,Stack Overflow 上的这个答案指出

Repa 中的并行计算必须是 monadic 的原因部分与懒惰有关,但主要是因为 Repa 无法处理嵌套并行性。Monad 的顺序属性在很大程度上解决了这个问题[.]

问题

  • 拥有这个“顺序属性”究竟意味着什么?
  • 一个 monad 如何执行这个?
  • 例如computeP:对使用哪个 monad 没有限制,所以我可以使用身份 monad。那么可以使用下面的函数来代替解包 monad,还是会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,甚至有必要使用 monad 吗?

    import Data.Functor.Identity
    import Data.Array.Repa.Eval
    import Data.Array.Repa
    
    myComputeP :: (Load …
    Run Code Online (Sandbox Code Playgroud)

monads haskell repa

6
推荐指数
1
解决办法
206
查看次数

修复---如何制作一个Read实例?

什么是最好的方法

type Configuration = Array DIM1 (Double, Double, Double)
Run Code Online (Sandbox Code Playgroud)

Read的一个实例?所以后来我可以推导出来

data SimulationData = SD Configuration Double StdGen Int
Run Code Online (Sandbox Code Playgroud)

成为Read的一个例子.

haskell repa

5
推荐指数
1
解决办法
590
查看次数

扩展Repa数组形状

我正在编写一个生成图像的程序,我希望将其带入Repa阵列.我目前正在使用的类型:

data Colour = Colour Double Double Double
Run Code Online (Sandbox Code Playgroud)

表示像素,我有一个(可能效率低但功能齐全)的函数,它将a Colour转换为DIM1数组:

colourToRepa :: Colour -> Array U DIM1 Double
colourToRepa (Colour r g b) = R.fromListUnboxed (Z :. (3::Int)) [r,g,b]
Run Code Online (Sandbox Code Playgroud)

目前我的程序中的图像只是一个[Colour]具有(Int, Int)代表尺寸的值.

我可以使用它来构建一个Array V DIM2 Colour足够容易的,但有没有办法(使用colourToRepa或以其他方式)将此数组扩展为Array U DIM3 Double

使用列表我可以使用map但是Repa的地图保留了数组的形状(我想从a DIM2到a DIM3).

haskell repa

5
推荐指数
1
解决办法
346
查看次数

为什么修复阵列没有mapM?

背景

我使用repa更多作为"管理"工具.我绕过reactive-banana小号AddHandlersArray:Array D DIM2 (AddHandler Bool).

目前我正在使用这个kludge:

mapMArray :: (Monad m, R.Source r a, R.Shape sh)  => (a -> m b) -> Array r sh a -> m (Array D sh b)
mapMArray f a = do
    l <- mapM f . R.toList $ a
    return $ R.fromFunction sh (\i -> l !! R.toIndex sh i)
  where sh = R.extent a
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

makeNetworkDesc :: Frameworks t => Array D DIM2 …
Run Code Online (Sandbox Code Playgroud)

haskell frp repa

5
推荐指数
1
解决办法
159
查看次数

如何将Repa数组折叠为任意值?

Repa的所有归约函数都折回为与数组内容相同的类型。例如:

foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a
Run Code Online (Sandbox Code Playgroud)

我想将repa数组折叠成可以传递给GUI库以呈现的数据结构,即任意值,但是我找不到库中的函数来执行此操作。这个功能存在[... | x <- [0..w-1], y <- [0..h-1]]吗?还是我必须使用来遍历单元格?

haskell repa

5
推荐指数
1
解决办法
137
查看次数

标签 统计

haskell ×10

repa ×10

arrays ×1

frp ×1

monads ×1

parallel-processing ×1