许多并行变换在并行转换中的应用

时间:2014-06-11 00:04:40

标签: haskell sequential repa

在Repa中,我想在我的数组的最里面维度上并行应用某个d维线性变换,即在所有“列”向量上。

通常,此类转换可以表示为矩阵MM*v的每个条目只是M的适当行与[{1}}的点积。 }。所以我可以使用v和一个计算相应点积的函数。这需要花费traverse

但是,我的d^2很特别:它允许使用线性工作顺序算法。例如,M可能是整个下三角形中具有M s的下三角矩阵。然后1只是M*v(a.k.a。“scan”)的部分和的向量。这些总和可以以显而易见的方式顺序计算,但需要结果的v st条目来有效地计算(i-1)条目。 (我有几个这样的i,所有这些都可以用线性连续时间的一种方式计算。)

我没有看到任何明显的方法来使用M(或任何其他Repa函数)来利用traverse的这个属性。可以吗?当有如此快速的线性工作算法时,使用M - 工作算法(即使具有丰富的并行性)将是非常浪费的。

(我看过一些旧的SO帖子(例如,here)提出了类似的问题,但没有一点与我的情况相符。)

更新

根据请求,这里有一些说明性代码,用于计算部分和的d^2(如上所述)。正如我所料,运行时(工作)在M中以超线性方式增长,这是数组范围的第二个参数(d)。这是因为ext仅指定如何计算输出的mulM'条目,而与所有其他条目无关。即使在阵列的总大小中存在线性时间算法,我也不知道如何在Repa中表达它。

有趣的是,如果我从i中删除定义清单array'的行,那么运行时只会在数组的总大小中线性缩放!因此,当数组被“一直向下”延迟时,融合/优化必须以某种方式提取线性工作算法,但没有任何明确的帮助。这太棒了,但对我来说也不是很有用,因为实际上我需要在清单数组上调用main

mulM

0 个答案:

没有答案