望Fork/Join Tutorial後,我創建了一個類來計算大的階乘:如何確定的fork-join任務的適當分工門檻
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其中規定:
一個主要的東西用叉子實現算法 時要考慮/ join並行的艇員選拔,確定 任務是否會執行順序計算,而不是 分叉並行門檻子任務。
如果閾值過大,那麼程序可能不會創建足夠的任務來充分利用可用的 處理器/內核。
如果閾值太小,則任務創建和管理的開銷可能變得很大。
一般來說,一些實驗將是必要的,以找到合適的閾值。
那麼,爲了確定閾值,我需要做哪些實驗?
我感興趣的是你在調查中取得的成就。請參閱http://stackoverflow.com/questions/22191369/fork-join-optimization。你能和我分享一個結果嗎? –