2012-10-22 4 views
3

이전에 SIMD 연산자를 사용하여 코드 효율성을 향상 시켰지만 해결할 수없는 새로운 오류가 발생했습니다. 이 작업에서는 속도가 가장 중요합니다.어레이 오류 - 액세스 위반 위치 읽기 0xffffffff

데이터를 가져올 때까지 배열의 크기를 알 수 없으며 매우 작거나 (100 개 값) 또는 막대한 값 (1000 만 값) 일 수 있습니다. 후자의 경우 코드가 제대로 작동하지만 130036 개 미만의 배열 값을 사용하면 오류가 발생합니다.

누구든지이 문제의 원인과 해결 방법을 알고 있습니까?

나는 (테스트 한) 코드를 첨부했다.이 코드는 나중에보다 복잡한 기능에서 사용될 것이다. 오류가 "arg1List [I] = ..."

#include <iostream> 
#include <xmmintrin.h> 
#include <emmintrin.h> 

void main() 
{ 
    int j; 
    const int loop = 130036; 
    const int SIMDloop = (int)(loop/4); 
    __m128 *arg1List = new __m128[SIMDloop]; 

    printf("sizeof(arg1List)= %d, alignof(Arg1List)= %d, pointer= %p", sizeof(arg1List), __alignof(arg1List), arg1List); 
    std::cout << std::endl; 

    for (int i = 0; i < SIMDloop; i++) 
    { 
     j = 4*i; 
     arg1List[i] = _mm_set_ps((j+1)/100.0f, (j+2)/100.0f, (j+3)/100.0f, (j+4)/100.0f); 
    } 
} 
+0

이 보고서와 같은 중개인에 값을 할당하십시오 : http://social.msdn.microsoft.com/Forums를/da/vclanguage/thread/05b765a2-ef2e-4e45-9229-266d7fe55c0f –

+0

문제가 아니지만'loop/4'는'int'를 리턴 할 것이고, 그 캐스트는 필요 없습니다. – Gorpik

답변

8

정렬이 이유에서 발생한다.

MOVAPS - 이동 정렬 팩형 단일 정밀도 부동 소수점 값

[...] 피연산자는 16 바이트 경계 또는 일반 보호 예외 (#GP)에 정렬되어야 것 생성 될 수 있습니다.

당신은 문제가 당신이 당신의 포인터 정렬 즉시 사라 볼 수 있습니다

__m128 *arg1List = new __m128[SIMDloop + 1]; 
arg1List = (__m128*) (((int) arg1List + 15) & ~15); 
+0

이것은 작동합니다. 신속한 회신에 대단히 감사합니다. 하지만 배열 크기에 1을 더한 이유는 무엇입니까? – user1765603

+0

0에서 15 개의 선두 바이트가 포인터 재 정렬로 낭비 될 수 있기 때문입니다. 이것을 보완하기 위해, 다른 끝에 여분의 바이트가 필요합니다 ... –

+0

Ok, thanks. 호기심에서 왜 이것이 매우 큰 배열의 문제가 아닌지 아십니까? – user1765603