2012-12-11 4 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

관련 문제