簡體   English   中英

如何確定fork-join任務的正確工時除法閾值

[英]How to determine the proper work division threshold of a fork-join task

看完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;
    }
}

我的問題是如何確定我細分任務的門檻? 在fork / join parallelism上找到了一個頁面,其中指出:

在使用fork / join並行性實現算法時要考慮的主要事項之一是選擇閾值,該閾值確定任務是否將執行順序計算而不是分支並行子任務。

如果閾值太大,則程序可能無法創建足夠的任務來充分利用可用的處理器/核心。

如果閾值太小,則任務創建和管理的開銷可能變得很大。

通常,需要一些實驗來找到合適的閾值。

那么我需要做些什么樣的實驗來確定閾值呢?

PigeonHole估計:設置任意閾值,計算計算時間。 並在此基礎上增加和減少閾值,以查看您的計算時間是否有所改善,直到您通過降低閾值看不到任何改進為止。

選擇閾值取決於許多因素:

實際計算應該花費合理的時間。 如果你要求一個數組並且數組很小,那么按順序執行它可能會更好。 如果數組長度為16M,則將其拆分為較小的部分並進行並行處理應該是值得的。 試試看吧。

處理器的數量應該足夠了。 Doug Lea曾用16+處理器記錄他的框架,以使其值得。 即使將數組分成兩半並在兩個線程上運行,吞吐量也會增加1.3%。 現在您必須考慮拆分/加入開銷。 嘗試在許多配置上運行,看看你得到了什么。

並發請求的數量應該很少。 如果您有N個處理器和8(N)個並發請求,那么每個請求使用一個線程通常對吞吐量更有效。 這里的邏輯很簡單。 如果您有N個處理器可用,並且相應地拆分了您的工作,但是您前面還有數百個其他任務,那么分裂的重點是什么?

這就是實驗手段。

不幸的是,這個框架沒有問責制。 無法在每個線程上看到負載。 deques的高水位標記。 已處理的請求總數 遇到錯誤等

祝好運。

請注意,算術與BigInteger不是恆定時間,它與輸入的長度成比例。 每個操作的實際復雜性是不容易在 ,雖然是Q引用的futureboy執行/ A部分沒有記錄什么(預計)根據不同的情況來實現。

在決定如何將問題划分為更小的塊以及確定特定塊是否值得再次划分時,使工作估計功能正確非常重要。

在使用實驗來確定閾值時,您需要注意不要只是對問題空間的一個角進行基准測試。

據我了解,這個實驗是一個優化,因此只有在需要時才應用。

您可以嘗試不同的拆分策略 - 即可以通過兩個相等的部分或估計的乘法成本(取決於整數小數長度)進行分割。

對於每種策略,您可以測試盡可能多的閾值,以全面了解您的策略。 如果您的CPU資源有限,那么您可以測試每個5或10。 因此,根據我的經驗,這里的第一個重要事項是全面了解算法的執行情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM