我對圖像的子區域進行了大量操作。例如,如果我有一個100x100的圖像,我可能想迭代這個圖像並處理10x10像素的塊。例如:顯式預取非連續數據
for(each 10x10 block)
{
for(each pixel in the block)
{
do something
}
}
這種方法的問題是,小塊不是連續的內存塊(即,圖像的像素被存儲以行優先順序,所以,當我訪問10×10塊,每行中的像素的塊是連續的,但塊的行不是連續的,有什麼可以做的,以加速訪問這些塊中的像素?或者是不可能快速訪問數據的一個區域像這樣的結構?
從我讀過的很多讀物中,聽起來像是第一次讀取像素,因爲循環中唯一的操作可能是有用的:
// First read the pixels
vector<float> vals(numPixels);
for(pixels in first row)
{
val[i] = pixels[i];
}
// Then do the operations on the pixels
for(elements of vals)
{
doSomething(vals[i])
}
與我在做什麼這是兩者同時進行公正:
// Read and operate on the pixels
for(pixels in first row)
{
doSomething(pixels[i])
}
,但我無法找到任何實際的代碼示例(與理論解釋)是如何做到這一點。有沒有道理呢?
將像素複製到矢量中會將它們放入連續的內存區域,如果它們適合高速緩存線,則通常會對其進行高速緩存。 – chradcliffe
@chradcliffe,但如果他們只使用一次會幫助什麼? –
我認爲@MvG對此有正確答案。 '__builtin_prefetch'將是正確的使用。我已經忘記了那個內建。它將保存副本並在您僅使用一次值的情況下工作。 – chradcliffe