看完之后分叉/连接教程 http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html,我创建了一个用于计算大阶乘的类:
public class ForkFactorial extends RecursiveTask<BigInteger> {
final int end;
final int start;
private static final int THRESHOLD = 10;
public ForkFactorial(int n) {
this(1, n + 1);
}
private ForkFactorial(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected BigInteger compute() {
if (end - start < THRESHOLD) {
return computeDirectly();
} else {
int mid = (start + end) / 2;
ForkFactorial lower = new ForkFactorial(start, mid);
lower.fork();
ForkFactorial upper = new ForkFactorial(mid, end);
BigInteger upperVal = upper.compute();
return lower.join().multiply(upperVal);
}
}
private BigInteger computeDirectly() {
BigInteger val = BigInteger.ONE;
BigInteger mult = BigInteger.valueOf(start);
for (int iter = start; iter < end; iter++, mult = mult.add(BigInteger.ONE)) {
val = val.multiply(mult);
}
return val;
}
}
我的问题是如何确定细分任务的阈值?我找到了一个有关 fork/join 并行性的页面 http://faculty.ycp.edu/~dhovemey/spring2011/cs365/lecture/lecture18.html其中指出:
实现算法时要考虑的主要事项之一
使用 fork/join 并行性是选择确定阈值
任务是否将执行顺序计算而不是
分叉并行子任务。
如果阈值太大,则程序可能无法创建
足够的任务来充分利用可用的资源
处理器/核心。
如果阈值太小,那么任务创建和任务的开销
管理可能变得很重要。
一般来说,需要进行一些实验才能找到
适当的阈值。
那么我需要做哪些实验才能确定阈值?
PigeonHole估计:设置任意Threshold,计算计算时间。
并在此基础上增加和减少阈值,看看您的计算时间是否有所改善,直到您通过降低阈值看不到任何改善为止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)