從英特爾的Compiler Autovectorization Guide有一個與我不明白的對齊有關的例子。該代碼是Autovectorization alignment
double a[N], b[N];
...
for(i = 0; i < N; i++)
a[i+1] = b[i] * 3;
它說
如果兩個陣列的第一個元素在一個16字節邊界對齊, 然後從b或不對齊的元件的任一個未對齊加載 將元素存儲到a,必須在矢量化之後使用。 然而,程序員可以執行如下所示的對準,這 將導致兩個對準的訪問模式矢量 (假設雙打一個8字節的大小)後
_declspec(align(16, 8)) double a[N];
_declspec(align(16, 0)) double b[N];
如何看到錯位配矢量化之後?對齊不會取決於數組的大小嗎?
嗯,是的,一個有意將索引[]超出範圍的代碼片段確實令人困惑。我認爲這是試圖說這個循環總是導致錯位的訪問。如果b [i]對齊,那麼[i + 1]將會失準。或者相反。所以它提出的做法是在內存中有意識地錯誤對齊[8],而現在這兩個訪問都是對齊的。 –
那麼這個例子本身沒有錯位?我的意思是,我不明白它會如何產生錯位或爲何會產生錯位。 – BRabbit27