6

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

我阅读了教程并快速检查了hackage,但我找不到执行此操作的功能。

(我想在一维数组中进行这种计算在 Repa 中没有意义,因为你不能并行化它。但我认为你可以在二维或更多维的情况下并行化它。)

编辑f:也许我应该更具体地说明我想使用哪种。由于没有办法在 casea[i]是标量的情况下进行并行化,所以让我们关注 casea[i]是 N dim 向量的情况。我不需要a[i]更高维(例如矩阵),因为您可以将其“展开”为向量。因此,f是一个将 R^N 映射到 R^N 的函数。

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

b = M a[i-1]
a[i][j] = g(b)[j]

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

4

2 回答 2

3

我看不到 Repa 这样做的方式。但是有 Vector:Data.Vector.iterateN构建你想要的向量。然后Data.Array.Repa.fromUnboxed将其从 Vector 转换为 Repa。

iterateN :: Int -> (a -> a) -> a -> Vector aSource

O(n) 将函数 n 次应用于值。第零个元素是原始值。

于 2012-06-28T10:14:19.233 回答
1

编辑:实际上,我想我误解了这个问题。我会在这里留下我的答案,以防它对其他人有用......

您可以使用traverse http://hackage.haskell.org/packages/archive/repa/3.2.1.1/doc/html/Data-Array-Repa.html#v:traverse

Prelude Data.Array.Repa R> let x = fromListUnboxed (Z :. 10 :: DIM1) [1..10]
Prelude Data.Array.Repa R> R.computeUnboxedS $ R.traverse x (\ (Z :. i) -> (Z :. (i - 1))) (\f  (Z :. i) -> f (Z :. (i + 1)) - f (Z :. i))
AUnboxed (Z :. 9) (fromList [1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0])

剖析它:

    R.computeUnboxedS $                            -- force the vector to be "real"
    R.traverse x                                   -- traverse the vector
    (\ (Z :. i) -> (Z :. (i - 1)))                 -- function to get the shape of the result
    (\f (Z :. i) -> f (Z :. (i + 1)) - f (Z :. i)) -- actual "stencil"

将其扩展到多维数组应该是微不足道的。

于 2012-06-27T21:05:40.497 回答