我想叉加入优化
我要上叉的优化工作是什么/连接算法。通过优化,我的意思是只计算最佳线程数,或者如果你想 - 计算SEQUENTIAL_THRESHOLD
(见下面的代码)。
// PSEUDOCODE
Result solve(Problem problem) {
if (problem.size < SEQUENTIAL_THRESHOLD)
return solveSequentially(problem);
else {
Result left, right;
INVOKE-IN-PARALLEL {
left = solve(extractLeftHalf(problem));
right = solve(extractRightHalf(problem));
}
return combine(left, right);
}
}
如何想象
例如,我要计算大阵列的产品。然后我刚评估所有部件,并获得最佳的线程量:
SEQUENTIAL_THRESHOLD = PC * IS/MC
(只是例子)
PC
- 处理器核的数量; IS
- 常数,表示具有一个处理器内核的最佳阵列大小以及对数据的最简单操作(例如读数); MC
- 乘以经营成本;
假设MC = 15; PC = 4和IS = 10000; SEQUENTIAL_THRESHOLD = 2667
。如果subtask-array大于2667,我会分叉它。
广泛的问题
- 是否有可能使SEQUENTIAL_THRESHOLD公式中这样的方式?
- 是否可以为更复杂的计算完成相同的操作:不仅适用于数组/集合和排序操作?
窄的问题:
不要存在关于SEQUENTIAL_THRESHOLD
用于阵列/收藏/整理计算了一些调查?他们如何实现这一目标?
更新2014 3月7日:
- 如果没有办法写为阈值计算单式,我可以写将执行在PC上预定义测试的UTIL,而且比得到最佳阈?这也是不可能的或不是?
- Java 8 Streams API可以做什么?它可以帮助我吗? Java 8 Streams API是否消除了Fork/Join中的需求?
“为串行和并行执行之间选择理想的阈值是协调并行任务的成本的函数。如果协调成本是零,更细粒度的任务数量较多倾向于提供更好的并行;下层的协调成本,我们可以在我们需要切换到顺序方法之前进行细化。“ - 从网站引用的伪代码来自:http://www.ibm.com/developerworks/library/j-jtp11137/;) – Marco13
换句话说,不要使用CPU内核的数量作为*可用内核*可随时更改。阈值应该足够大,以便与问题大小相比,分裂的开销并不重要。越多的子任务'Executor'/scheduler适应实际系统负载情况的自由度越大。 – Holger
这是map-reduce任务的典型问题。您应该查看Java 8的Streams API。它将处理接近最佳的执行。只要您没有使用HPC,您就不应过分担心达到最佳效果。如果计算发生在那里,即使花费更长时间,您也希望桌面保持负责。 – allprog