2012-12-11 41 views
-1

我正在使用以下代碼使用SSE以常數因子劃分所有int數組元素。SSE指令給出了錯誤

void sse_div(int *arr,int num_shift,int N) // devide all array elements by 2 
{ 
     num_shift=1; 
    int nb_iters = N/4;  
    __declspec(align(32))int *a1=arr; 

     __m128i* l = (__m128i*)a1; 
    for (int i = 0; i < nb_iters; ++i, ++l) 
      _mm_store_si128(l, _mm_srai_epi32(*l,num_shift)); //Error line 

} 

但我收到以下錯誤

enter image description here

我無法擺脫這個問題。 任何人都可以幫助解決這個問題。 任何幫助將不勝感激。

由於提前

+2

以您所做的方式聲明a1不會導致基礎數組arr被對齊32字節。您顯示的特定錯誤似乎表明輸入數組無論如何都是無效指針。 –

+1

學習使用調試器 – hirschhornsalz

回答

2

由於您的輸入數組顯然是對準你可以使用未對齊的加載/存儲例如:

void sse_div(int *arr, int N)  // divide all array elements by 2 
{ 
    for (int i = 0; i < nb_iters; i += 4) 
    { 
     __m128i v = _mm_loadu_si128(&arr[i]); 
     v = _mm_srai_epi32(v, 1); 
     _mm_storeu_si128(&arr[i], v); 
    } 
} 

注意,有可能是使用未對齊的加載/保存一個顯著的性能影響(取決於你在哪個CPU上運行),所以如果可能的話,你應該讓你的arr陣列16字節對齊,當你分配內存。

+0

感謝您的回覆。此代碼有效。 – geeta