我從來沒有寫過SSE優化的彙編代碼,所以很抱歉,如果這是一個菜鳥問題。在this aritcle解釋瞭如何使用條件語句矢量化for
。然而,我的代碼(從here採取)的形式爲:是否可以使用SSE爲此嵌套進行矢量化?
for (int j=-halfHeight; j<=halfHeight; ++j)
{
for(int i=-halfWidth; i<=halfWidth; ++i)
{
const float rx = ofsx + j * a12;
const float ry = ofsy + j * a22;
float wx = rx + i * a11;
float wy = ry + i * a21;
const int x = (int) floor(wx);
const int y = (int) floor(wy);
if (x >= 0 && y >= 0 && x < width && y < height)
{
// compute weights
wx -= x; wy -= y;
// bilinear interpolation
*out++ =
(1.0f - wy) * ((1.0f - wx) * im.at<float>(y,x) + wx * im.at<float>(y,x+1)) +
( wy) * ((1.0f - wx) * im.at<float>(y+1,x) + wx * im.at<float>(y+1,x+1));
} else {
*out++ = 0;
}
}
}
所以,從我的理解,有與鏈接的文章的幾個不同之處:
- 在這裏,我們有一個嵌套
for
:我在vectroization中總是看到一個級別for
,從未見過嵌套循環 - if條件基於標量值(x和y)而不是數組:我怎樣才能使鏈接的示例適應此?
- 的
out
指數不是基於i
或j
(所以它不是out[i]
或out[j]
):我怎麼能以這種方式填補out
?
特別我很困惑,因爲for
索引始終用作數組索引,而在這裏被用於計算變量而矢量由週期遞增週期
我使用icpc
與-O3 -xCORE-AVX2 -qopt-report=5
和一堆其他優化標誌。根據英特爾顧問,這是不是矢量化,並使用#pragma omp simd
生成warning #15552: loop was not vectorized with "simd"
你使用哪種編譯器?你有沒有確認你的編譯器還沒有爲你自動矢量化? – Jonas
@Jonas感謝您的評論。請看看我更新的問題 – justHelloWorld
與您以前的問題非常相似http://stackoverflow.com/questions/43136182/compiler-doesnt-vectorize-even-with-simd-directive有什麼變化? –