【发布时间】:2013-11-24 17:11:03
【问题描述】:
在查看了Fork/Join Tutorial 之后,我创建了一个用于计算大阶乘的类:
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;
}
}
我的问题是如何确定我细分任务的阈值?我找到了一个page on fork/join parallelism,它说:
实现算法时要考虑的主要事项之一 使用 fork/join 并行性正在选择确定的阈值 任务是否将执行顺序计算而不是 分叉并行子任务。
如果阈值太大,则程序可能无法创建 足够的任务来充分利用可用的 处理器/内核。
如果阈值太小,那么创建任务的开销和 管理可能变得很重要。
一般来说,需要进行一些实验才能找到 适当的阈值。
那么我需要做哪些实验来确定阈值?
【问题讨论】:
-
我对您在调查中取得的成就感兴趣。请参阅stackoverflow.com/questions/22191369/fork-join-optimization。你能和我分享一下结果吗?
标签: java concurrency fork-join