簡體   English   中英

為什么我的快速排序在大量輸入時崩潰?

[英]Why does my quicksort crash on large inputs?

我創建了一個中位數為3的標准快速排序實現,該實現對大量隨機整數進行排序。 我想增加至少一億個元素,但最好是十億個元素。 為了提高速度,我嘗試並行化Cilk ++中的算法。 該算法使用雙重遞歸,我產生了Cilk任務來執行每個遞歸排序。

我的算法適用於最大為1000000的數組。沒有Cilk關鍵字,我的順序算法可以輕松處理1億個元素,但是當我嘗試使用Cilk時,程序崩潰到了桌面。 我現在想找出原因。 我生成的Cilk任務太多了嗎?

我正在使用Windows 7 64位,Intel ++編譯器和集成在Visual Studio 2010中的Intel Parallel Studio XE2013。該程序被編譯為32位應用程序。 存儲隨機數據的內存作為對malloc的單次調用分配,並且檢查指針。 在中值計算中,在計算中間元素時也要防止整數溢出。

這很可能是緩沖區溢出問題。

這是我的分區:

int pivotvalue = medianOf3(data, low, high);
// pivot is placed next to the last element

int left = low;
int right = high - 1;
while (left < right) {
    while (data[left] < pivotvalue) {
        left++;
        if (left > high) {
            break;
        }
    }
    while (data[right] >= pivotvalue) {
        right--;
        if (right < low) {
            break;
        }
    }

    if (left < right) {
        swap(data, left, right);
    }
}

// restore pivot
swap(data, left, high - 1);
return left;

我不知道Cilk的工作方式,但我記得需要在嵌入式平台上修復quicksort實現,這可能會使遞歸導致堆棧溢出。 解決方法是對數據的較小“一半”使用遞歸調用,並在函數內部處理較大的“一半”(即尾遞歸)。 由於調用圖的深度等於列表中元素的數量,因此排序(或反向排序)的列表始終會觸發溢出。

您可以使用調試器找出導致崩潰的原因嗎? 您可以將數據轉儲到swap()每個條目上的日志文件中,然后查看函數在崩潰前調用的內容嗎? 是否可以在每次調用時轉儲堆棧的大小? 每個Cilk任務是否都有自己的堆棧,該堆棧可能小於非Cilk版本中使用的堆棧?

您可以通過向帶有堆棧地址的swap()添加參數來跟蹤堆棧使用情況。 第一次調用和任何新的Cilk線程都使用NULL。 如果不是NULL,則每個遞歸調用都使用該參數,或者使用其局部變量之一的地址來確定其堆棧在哪里。 轉儲地址差異,或在全局范圍內進行跟蹤,僅在其超過先前的最大值時才報告。

英特爾Cilk Plus(不支持cilk ++是另一種產品)的生成深度限制為1024。您的雙端隊列很可能溢出,這很可能會導致崩潰。

確定要在遞歸樹中生成的深度是一種平衡的行為。 您希望有足夠的生成數量以允許工作被盜,但是使用太多會增加開銷。 cilk_spawn很便宜,但不是免費的。 如果要排序的元素數量低於某個閾值,則最好將一個檢查添加到您的快速排序中,而不要生成遞歸調用。

cilk_for的好處之一是,它可以根據與您一起工作的工作人員的數量來優化產卵深度。

- Barry Tannenbaum
  Intel Cilk Plus Runtime Development

對兩個子問題都遞歸的N個項目的快速排序具有(最壞情況)遞歸深度O(N)。 通常的解決方法是“ tomologic”建議的解決方法:對較小的子問題遞歸,對較大的子問題進行迭代。 這將遞歸深度減小到O(lg N)。

該修復程序會轉移到並行版本。 如果串行程序占用堆棧空間S,則Cilk Plus版本最多占用堆棧空間PS。 (此屬性在許多其他並行框架中並不適用。)因此,產生較小的子問題並在較大的子問題上進行迭代應將總堆棧空間保持在O(P lg N)之內。

我是《 結構化並行編程 》一書的作者之一,該書討論了Cilk Plus和TBB中Quicksort的並行實現。 可以從http://parallelbook.com/student免費下載Quicksort的示例(完全遞歸和半遞歸)。

Arch D. Robison
Intel Corporation

暫無
暫無

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

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