【发布时间】:2012-01-03 02:37:26
【问题描述】:
作为一个更大问题的一部分,我试图在数组中定义一个数组,如下所示:
import Data.Array.Repa
type Arr = Array DIM2 Int
arr = force $ fromList (Z :. 5 :. 5) [1..25] :: Arr
combined :: Arr
combined = arr `deepSeqArray`
traverse arr (\_ -> Z :. 4 :. 4 :: DIM2) (\f (Z :. x :. y) ->
let reg = force $ extract f (x,y) (2,2)
in reg `deepSeqArray` sumAll reg)
extract :: (DIM2 -> Int) -> (Int,Int) -> (Int,Int) -> Arr
extract lookup (x0,y0) (width,height) = fromFunction bounds
$ \sh -> offset lookup sh
where
bounds = Z :. width :. height
offset :: (DIM2 -> Int) -> DIM2 -> Int
offset f (Z :. x :. y) = f (Z :. x + x0 :. y + y0)
main = print combined
extract 函数使用fromFunction 和提供给它的查找函数,但它也可以使用traverse 和arr ! ... 达到相同的效果。尽管尽可能早地到处使用force 和deepSeqArray,但控制台在这里填满了消息,然后是正确的结果:
Data.Array.Repa:按顺序执行嵌套并行计算。 您可能已经调用了“强制”函数,而另一个实例是 已经运行。如果第二个版本因暂停而发生这种情况 懒惰的评价。使用“deepSeqArray”确保每个数组都完全 在“强制”下一个之前进行评估。
虽然我还没有构建一个带有列表来比较速度的版本,但在较大的版本中性能会受到影响。
这仅仅是嵌套数组定义的结果,因此我应该重组我的程序以将内部或外部定义变为列表吗?我的extract 功能是否很糟糕以及问题的原因?
from this question 的提示非常有用,但我还没有爬过编译的代码。
【问题讨论】: