在Repa中,我想在我的数组的最里面维度上并行应用某个d
维线性变换,即在所有“列”向量上。
通常,此类转换可以表示为矩阵M
,M*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