2012-11-03 78 views
2
int main() 
{ 
    const int STRIDE=2,SIZE=8192; 
    int i=0; 
    double u[SIZE][STRIDE]; 
    #pragma vector aligned 
    for(i=0;i<SIZE;i++) 
    { 
     u[i][STRIDE-1]= i; 
    } 
    printf("%lf\n",u[7][STRIDE-1]); 
    return 0; 
} 

編譯器在這裏使用xmm寄存器。有stride 2訪問,我想讓編譯器忽略這一點,然後定期加載內存,然後屏蔽交替位,這樣我就可以使用SIMD寄存器的50%。我需要它可以用來加載,然後內在存儲回內存組件固有的做掩碼加載

PS之前屏蔽寄存器按位:我從來沒有做過裝配編碼你不能做一個蒙面加載之前

+0

請注意,您的代碼存在錯誤。您可以訪問'u [i] [STRIDE]',這與'u [i] [2]'相同。 '2'是錯誤的:你只能訪問'u [i] [0]'或'u [i] [1]'。對'u [i] [2]'的訪問可能會進入'u [i + 1] [0]',除非當'i == SIZE-1'時,它訪問數組的末尾。 –

+0

感謝您指出。在fortran世界裏已經有相當長的一段時間了,所以當遇到stride 2訪問時,會被'C' – arunmoezhi

回答

2

一名蒙面店屏蔽值作爲0xAA(10101010)

0

(只有一個蒙面店)。最簡單的選擇是做一個負載,然後自己屏蔽它(例如使用內部函數)。

一個潛在更好的選擇是將您的數組更改爲「double u [STRIDE] [SIZE];」所以你不需要屏蔽任何東西,也不會因爲一半的XMM寄存器被浪費/屏蔽而導致結果。

+0

生鏽,如果使用float或者double,那麼最終如果使用這種方法,最終只使用50%的寄存器並不重要。此外,數組結構是'u [SIZE] [STRIDE]' – arunmoezhi

0

沒有AVX,半SIMD寄存器只有一個雙無論如何,所以似乎與普通64位商場的小錯誤。

如果您想要使用屏蔽存儲(MASKMOVDQU/MASKMOVQ),請注意,它們直接寫入DRAM,就像非暫存存儲(如MOVNTPS)一樣。這可能是也可能不是你想要的。如果數據適合緩存並且您計劃儘快閱讀,最好不要使用它們。

某些AMD處理器可以使用MOVNTSD從XMM寄存器執行64位非臨時存儲;與MASKMOVDQU相比,這可能會稍微簡化一些事情)。