排序 (Sorting) 練習題 (Practice - Sorting Foundations and Parallel Radix Sort)


Question 1 - 排序的兩個必要條件與 stable [recall]

情境/題目:任何 sorting algorithm 必須滿足哪兩個條件?另外,什麼是 stable sort,它在什麼情況下是必要的?

Question 2 - Radix Sort 的本質與迭代結構 [recall]

情境/題目:Radix sort 屬於哪一類排序?以 1-bit radix 排 N-bit key 需要幾次 iteration?為什麼 iteration 之間必須序列執行,而平行機會在哪裡?

Question 3 - Destination Index 公式 [recall]

情境/題目:在一次 1-bit radix iteration 中,落 0 bucket 與落 1 bucket 的 key,各自的 destination index 公式為何?令 i = key indexinputSize = N

Question 4 - 用 Exclusive Scan 取得 # ones before [recall]

情境/題目:# ones before# ones total 各自如何取得?為什麼用 exclusive scan 而不是 inclusive scan?

Question 5 - 為何 Scan 必須放在邊界檢查之外 [recall]

情境/題目:在 Fig. 13.4 的 kernel 中,exclusiveScan(bits, N) 為何要寫在 if (i < N) 邊界檢查之外?若要在整個 grid 範圍同步做 scan,有哪兩種做法?

Question 6 - Comparison vs Noncomparison 複雜度 [recall]

情境/題目:comparison-based 排序的複雜度下界是多少?radix sort 為何能突破它?代價是什麼?

Question 7 - Merge Sort 的兩層平行性 [recall]

情境/題目:平行 merge sort 用 merge tree 自底向上合併。在早期 stage晚期 stage,平行性的主要來源分別是什麼?

Question 8 - 其他平行排序方法 [recall]

情境/題目:簡述 odd-even transposition sort、sorting networks、sample sort 的特徵與複雜度,並說明 LSD 與 MSD radix sort 的關鍵差異。

Question 9 - 計算 Destination Indices [application]

情境/題目:input(8 個 key,index 0..7)取出的 LSB bits 為 [1, 0, 1, 1, 0, 0, 1, 0]。請算出 # ones before 陣列、# ones total,以及 index 2(bit=1)與 index 4(bit=0)兩個 key 的 destination index。

Question 10 - r-bit Radix 的計算 [application]

情境/題目:要排序 32-bit 的整數 key,改用 4-bit radix。請問:(a) 需要幾次 iteration?(b) 每次 iteration 每個 block 有幾個 local bucket?(c) 每個 block 的 local sort 需要做幾次 1-bit local exclusive scan?(d) global bucket-size 表有幾列?

Question 11 - Shared Memory Local Sort 的全域位移 [application]

情境/題目:在 13.4 的 coalescing 優化中,每個 block 在 shared memory 做完 local sort 後,如何決定自己的 local 0-bucket 與 local 1-bucket 在 global output 中的起始位置?請描述所用的資料結構與運算。

Question 12 - Coalesced Local Sort vs Naive Scatter [analysis]

情境/題目:基礎 kernel 直接 output[dst] = key 為何 coalescing 很差?13.4 的「shared memory local sort 後再寫回」如何改善?這個優化把成本從哪裡移到了哪裡?

Question 13 - Radix 大小取捨與 Thread Coarsening [analysis]

情境/題目:增大 radix(用更多 bit/iteration)能減少 iteration 數,為什麼不能把 radix 取得無限大?另外,thread coarsening 為何能同時改善 coalescing 又降低 global scan 開銷?coarsening 在什麼前提下才划算?