我正在尝试使用并行策略,想知道以下代码是否正确。Java 代码:
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;
}
使用并行策略计算结果的Haskell程序:
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'是否正确?我认为由于需要执行所有计算才能得出结果,所以应该强制评估。
有没有更好的方法来使用segments?在这个问题中存在哪些常见模式可以利用?
还有什么其他策略可以应用于这个问题?另外,是否有可能只使用
par
和seq
原语来并行化。