題目描述
在二維平面上有 $N$ 個點,每一個點 $p_i(x_i, y_i)$各自帶權重 $w_i$,這些點不時會移動和改變權重。
現在 Morris 希望你幫忙撰寫線性搜索的函數,好讓他專注數據結構上的調整。函數詢問包含
- $N$ 個點的資訊 (以 SoA (Structure of Array) 的方式儲存,以達到最好的快取使用率)
- 詢問的矩形 $\text{Rect}$ (正交於兩軸)
函數必須回傳在矩形內部的點權重和。
|
|
main.c (測試用)
- 一開始,在二維空間 $[0, R) \times [0, R)$ 之間產生 $N$ 個點的資訊
- 接著,模擬 $M$ 次點的變化,並且呼叫
search_range
- 最後,將所有答案 HASH 輸出一個值
|
|
DRS.h
|
|
DRS.c
你的目標是要加速下述函數的計算,通過最低要求加速 2 倍以上。
|
|
測資限制
- $N \le 131072$
- $R \le 32768$
範例輸入
no input
範例輸出
|
|
編譯參數
|
|
- 當前測試機器 Intel CPU E5-2620v3
- Intel Intrinsics Guide
Solution
一般的線性作法,透過 rect.lx <= x[i] && x[i] <= rect.rx && rect.ly <= y[i] && y[i] <= rect.ry
操作,翻譯成組合語言時,四次的 branch & jump,在管線處理上的效能易受到影響。為了使這種 branch 減少而不使管線處理的效能下降,通常會使用查表法來完成,藉由并行的數值計算,在最後一步才進行 load/store 完成指定區塊的指令。
在這一題中,唯有條件式皆成立才執行,由於分枝操作上只有一種情況,故查表法就不適用於此。我們仍可以并行數個矩形判斷,並且存在至少一個矩形成立再運行 load 加總所需的資料,將會給予效能上的大幅提升。
|
|