如何确定 fork-join 任务的适当分工阈值

2024-06-19

看完之后分叉/连接教程 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(使用前将#替换为@)

如何确定 fork-join 任务的适当分工阈值 的相关文章

随机推荐