我正在嘗試構建求和區域表,以便以後在自適應閾值例程中使用。由於該代碼將用於時間關鍵型軟件,因此我試圖儘可能多地從中擠出循環。高效地構建求和區域表
對於性能,該表是無符號整數的每個像素。
當我附上我的分析器時,我發現執行x遍時發生了最大的性能瓶頸。
用於計算中的簡單的數學表達式爲:
sat_[y * width + x] = sat_[y * width + x - 1] + buff_[y * width + x]
where the running sum resets at every new y position.
在這種情況下,sat_
是表示SAT無符號整數的1-d指針,並且buff_
是一個8位的無符號的單色緩衝器。
我的實現如下所示:因爲我的編譯器(VC11)並沒有爲我做
uint *pSat = sat_;
char *pBuff = buff_;
for (size_t y = 0; y < height; ++y, pSat += width, pBuff += width)
{
uint curr = 0;
for (uint x = 0; x < width; x += 4)
{
pSat[x + 0] = curr += pBuff[x + 0];
pSat[x + 1] = curr += pBuff[x + 1];
pSat[x + 2] = curr += pBuff[x + 2];
pSat[x + 3] = curr += pBuff[x + 3];
}
}
環路手動展開。我遇到的問題是,整個分段例程花費了大量的時間,只是在循環中運行,我想知道是否有人對可能加速的內容有任何想法。我可以訪問所有SSE的設置,而AVX可以運行這個例程將運行的任何機器,所以如果有什麼東西的話,那將非常有用。另外,一旦我擠出最後的週期,然後計劃將其擴展到多核,但是我希望在使模型更復雜之前儘可能地使單線程計算更緊密。
你的代碼沒有實現你在第一個表達式中寫的東西......具體來說,你在每一行的開始處重置'curr',但這並不是表達式所暗示的。 – 2013-03-06 23:01:05
你說得對,我在數學上玩的很快而且鬆懈。如果你有一個關於如何重寫x傳球數學的建議,我就是比賽。該算法的實現是正確的,但是,只是沒有我希望實現的那麼快。 – Mranz 2013-03-06 23:06:32
好的。我問的原因是因爲這個代碼是否可以被矢量化/並行化是至關重要的。這聽起來像是你運氣不錯,因爲重置在每一行打破了依賴鏈。 – 2013-03-06 23:07:31