看板 Prob_Solve 關於我們 聯絡資訊
: let ax+b-y = 0 : for (i=1,i<10000,i++) : { : dis = abs(a*xpoint[i]+b-ypoint[i]) : if (dis>dismax) : { : dismax = dis : point = i <-------這是我的目的 想要找哪一個點 : } 我假設你已經測試過了,這部份是 bottleneck,而且這些計算是必須的。 已經有人建議用平行化了,我這邊提供用單 CPU 的稍微加快的技巧。 dis 計算其實就只是 dot product + abs,這兩個指令應該可以直接由 硬體支援,你可以編譯成 assembly 檢查一下。 讀取 point 的時候是循序讀的,所以可以使用 prefetch,或許可以減少存取時間。 計算完 dis 之後立刻作 comparison 會造成 data hazard,pipeline就堵死了。 你可以改成類似這樣 dis = abs(a*xpoint[i]+b-ypoint[i]); if (pre_dis > dismax) .... pre_dis = dis; 這些技巧有沒有用,取決於你的機器和資料,而且就算變快效果應該也很有限。 又因為你沒有提供 profiling 的資訊,我也很難猜測到底是慢在哪個指令上, 只能憑我的經驗去猜而已。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 50.133.134.181 ※ 文章網址: https://www.ptt.cc/bbs/Prob_Solve/M.1431905639.A.9A6.html
firingmoon: 想請教一下 程式改成這樣的話不就抓不到最長距離了? 05/18 10:41
FRAXIS: 可以吧 要稍微修改一點 05/19 00:06
saladim: 不懂? 還是有比較阿? 05/23 13:28
FRAXIS: 你要先了解計算機結構,才會知道這樣有什麼差 05/23 19:24
saladim: 我是知道(在這邊不敢說了解 有老大哥在監視)..常見例子是 05/23 22:58
saladim: WB stage之前另外一條pipeline要取同變數的值 方法之一就 05/23 23:01
saladim: 有加入control logic讓資料可以just-in-time 05/23 23:02
saladim: 所以你這邊說的是不要跟dist馬上作比較? 05/23 23:03
saladim: control-logic(==>forwarding technique) 不過這在存取變 05/23 23:07
saladim: 數時有dependency時都可能發生...還是用profiling先? 05/23 23:08
saladim: 補充一下 不是專研計結 請老大哥別再出來幹醮惹 教學一下 05/23 23:40
saladim: 讓別人有所長好嗎.... 05/23 23:40
FRAXIS: 你說的方法是靠硬體來減少 dependency 的 delay 05/24 20:44
FRAXIS: 我的方法是手動排除 dependency.. 05/24 20:44