的Linux的perf
和GPerfTools優化C代碼pprof
給了我很多停滯前端和後端的週期在這段代碼:有很多非關聯
for(j = oL; j < oR; j++) {
T[j].v = (T[j].x/div)*K+T[j].y /div;
T[j].x = T[j].x % div;
T[j].y = T[j].y % div;
counterK[T[j].k]++;
}
給我:
9.973.660.617 stalled-cycles-frontend # 42,16% frontend cycles idle
4.874.722.502 stalled-cycles-backend # 20,60% backend cycles idle
我明白停滯週期意味着指令流水線不能真正前進,等待(也許)內存中的某些數據。我可以看到,在這段代碼中有很多解除引用的構件,這可能是一個問題,但是我擔心我缺乏足夠的知識來查看那裏的任何優化。誰能幫忙?
我不認爲這是導致問題的結構。我很確定它在全國各地都使用T [j]。如果您使用了'struct * temp =&T [j]'並且使用了'temp->',您可能會看到更好的結果。 –
由於.x和.y被修改並作爲表達式的輸入被使用,並且不清楚'counterK'是否可以替代'T',因此不可能重新排序加載和存儲(或將值緩存在寄存器中)再加上劃分和模數是相當昂貴的操作(~20個週期)。當然,正式創建了很多臨時文件,因此該結構中的類型最好是POD,或者多次複製它們。 – Damon
可能是索姆非常小的東西:使用++ var;而不是var ++;預增量更快,因爲它不會創建一個臨時變量,我同意拉馬先生。如果變量「div」是2的冪,那麼你也可以做一個好的。不幸的是,分工很慢。 – Strigidis