我在玩并行策略并想知道我是否按照正确的方式执行下列操作。 Java代码:如何在Haskell中使用并行策略编写嵌套循环问题
double x = 0.0;
double[] arr = new double[2000];
for (int i = 0; i < arr.length; i++)
arr[i] = i;
for (int i = 0; i < arr.length; i++) {
x += arr[i] * 5;
for (int j = i + 1; j < arr.length; j++)
x -= arr[j] * 3;
}
它采用并行策略来计算结果
哈斯克尔程序:
n = 2000
ns = [0..n-1]
segments = chunk 100 ns
chunk n [] = []
chunk n xs = ys : chunk n zs
where (ys,zs) = splitAt n xs
parCompute = foldl' (+) 0 (map (\ts -> compute ts) segments `using` parList rdeepseq)
compute ts = foldl' addfunc 0 ts
where
addfunc acc i = (acc + x) - (foldl' minusfunc 0 [(i+1)..(n-1)])
where
x = (ns!!i) * 5
minusfunc acc' j = (acc' + x')
where
x' = (ns!!j) * 3
main = print parCompute
我的问题是:
是它的使用权与foldl”在这里吗?我想因为所有计算都需要完成以获得结果,所以我应该强制评估。
有没有更好的方法来使用段?在这个问题中我可以利用哪些常见模式?
其他什么策略可以应用于这个问题?此外,任何使用
par
和seq
原语进行并行化的可能性。
风格评论:嵌套wheres丑陋。 – rampion
我不认为这些代码是等价的。代码“x - = arr [j] * 3”被应用于列表中位置“i”之后的所有项目,但在haskell代码中,等价物仅应用于本地块,而不是所有位于“i”位置的值。或者,也许我读错了。 –
@Tim:它给出了相同的答案。我已经检查了Haskell对Java的结果。 – vis