【发布时间】:2012-06-27 14:36:53
【问题描述】:
是否可以在 Repa 中计算取决于过去值(即较小的索引)的数组?给出了数组的初始部分(例如,a[0])。 (请注意,我使用类似 C 的符号来表示数组的元素;请不要混淆。)
我阅读了tutorial 并快速检查了hackage,但我找不到执行此操作的函数。
(我想在一维数组中进行这种计算在 Repa 中没有意义,因为你不能并行化它。但我认为你可以在二维或更多维情况下并行化它。)
编辑:
可能我应该更具体地说明我想使用什么样的f。由于在a[i] 是标量的情况下无法并行化,所以让我们关注a[i] 是N 暗向量的情况。我不需要a[i] 更高维(例如矩阵),因为您可以将其“展开”为向量。所以,f 是一个将 R^N 映射到 R^N 的函数。
大部分情况是这样的:
b = M a[i-1]
a[i][j] = g(b)[j]
其中b 是一个 N 暗向量,M 是一个 N × N 矩阵(不假设稀疏性),g 是一些非线性函数。我想在给定a[0]、g 和M 的情况下为i=1,..N-1 计算它。我希望有一些通用的方法来(1)并行化这种类型的计算和(2)使b等中间变量的分配有效(在类C语言中,你可以重用它,这会很好如果 Repa 或类似的库可以在不破坏纯度的情况下像魔术一样做到这一点)。
【问题讨论】:
-
对于关联
f,可以并行化,称为“扫描”。 en.wikipedia.org/wiki/Prefix_sum 不过,我在 Repa 文档中找不到 scan。 -
您可以使用repa 模板来做到这一点,hackage.haskell.org/packages/archive/repa/2.0.2.1/doc/html/…。但另请参阅stackoverflow.com/questions/6170008/…
-
@Heatsink 扫描不需要一个系列作为输入吗?对我来说,这更像是unfold。
-
哦,这不是扫描。我将等式误读为
a[i] = f(a[i], a[i-1])。其实更像take n $ iterate f z。 -
@Heatsink 是的,这正是我的意思。您认为是否可以在 Repa 中进行这种计算,尤其是当
f是多维的时?另外,我担心使用无限列表并比较类 C 语言会产生某种开销,您可以在计算之前分配内存。与裸 Haskell 列表相比,我希望 Repa 减少这种开销。