2013-03-20 233 views
3

我正在研究C++中的多重網格解算器,現在我正在嘗試改進串行性能。這裏最耗時的部分是平滑的,在我的情況下是連續的過度鬆弛求解器。這看起來如下(我希望這是相當自我解釋):優化3D循環(C++)

int idx; 
int strideY = stride_[level][0]; 
int strideZ = stride_[level][1]; 
for(int i = 0; i < steps; ++i) { 

    for(int z = 1; z <= innerGridpoints_[level][2]; ++z) { 
     for(int y = 1; y <= innerGridpoints_[level][1]; ++y) { 
      idx = getIndexInner(level, 1,y,z); 
      for(int x = 1; x <= innerGridpoints_[level][0]; ++x, ++idx) { 
       grid[idx] = (1. - omega) * grid[idx] + omega * 1./6. * (grid[idx+1] + grid[idx-1] + 
            grid[idx + strideY] + grid[idx - strideY] + 
            grid[idx + strideZ] + grid[idx - strideZ] - 
            spacing_[level] * spacing_[level] * rhs[idx]); 
      } 
     } 
    } 
} 

我已經做了一些優化:這些環定位使得內環給出了最本地條目(即相鄰元素是沿x維度)和預先計算idx(即使這是一個內聯函數,它可以節省相當一段時間)。 我也嘗試過阻塞,即不是遍歷整個網格,而只是在小塊上增加局部性,但這沒有任何影響。 我最後的想法是嘗試一些循環展開,但我實際上並不期望從中得到很大的改進。我在想,也許在內存訪問方面有一些可能的改進。任何tipps歡迎:)

只是供參考:網格大小會從非常小到255x255x255不等。此外,網格在每個維度都有一些邊界,由少量的行組成,即迭代不在整個網格上。

+0

您是否打算在(10,10,10)處進行平滑以在同一平滑過程中更改(10,10,11)處的結果? – Yakk 2013-03-20 22:17:54

+0

@Yakk:對不起,我不太明白你的意思? (10,10,10)處的平滑僅改變此值。你的意思是像紅黑一樣嗎?這是通常用於並行化,但我保持純串行 – Chris 2013-03-20 22:35:51

+0

不,我的意思是你修改'grid [10,10,10]',然後在設置'grid [10,10,11]'(I' m使用'[a,b,c]'來表示「做所有的索引計算以找出a,b,c處的項目是''grid [getIndexInner(level,10,10,10)]'而不是'格[10,10,10]'是剛剛被詳細說明) – Yakk 2013-03-20 23:38:17

回答

7

一個好的優化編譯器會爲你做大部分簡單的事情,所以總是衡量你所做的改變是否實際上改善了事情。並且,檢查(並學會理解)生成的彙編代碼,以查看編譯器實際上在做什麼。

但也有幾件事情我想嘗試,因爲表情是複雜的,甚至是很好的優化有時需要一點幫助: -

首先,是提升內部循環中是不變出來的子表達式周圍的環路。在你的例子中,明顯的是spacing_[level] * spacing_[level]omega * 1./6.

另一件事是嘗試使idx是一個指針而不是數組索引,並增加循環中的指針。

int *idx = &grid[getIndexInner(level, 1,y,z)]; // assuming grid is array of ints. 

你的表情,然後開始像這樣

*idx = (1. - omega) * *idx + omega * 1./6. * (idx[1] + idx[-1] + 
           idx[strideY] + idx[- strideY] + // etc... 

你的優化器(假設它是打開???)可能已經在這麼做了。但值得一試。正如我所說,沒有測量,這是毫無意義的練習。

而且,正如@AkiSuihkonen在上面的評論中提到的「首先讓它工作」。調試高度優化的代碼要困難得多,所以請確保您的算法正好執行在開始擔心性能之前應如何執行。

+0

謝謝,我會定義。試一試。當然,我測量每一步,到目前爲止,我提到的優化總是給我一些加速 – Chris 2013-03-20 22:37:03