그래서 SSE 함수 __mm_load_128
을 사용하려고합니다. 어리석은 실수를 저지른 경우 SSE fo for us에 대해 매우 새로운 것입니다._declspec (align (16))은 포인터를 16 바이트에 맞춰 정렬하지 않습니다.
는 여기에 내가 뭘 잘못 0xC0000005: Access violation reading location 0xFFFFFFFF.
0xFFFFFFFF
잘 보이지 않는 비주얼 스튜디오에 내가 오류 코드
void one(__m128i *arr, char *temp)
{
// SSE needs 16 byte alignment.
_declspec (align(16)) __m128i *tmp = (__m128i*) temp;
if (((uintptr_t)tmp & 15) == 0)
printf("Aligned pointer");
else
printf("%d", ((uintptr_t)tmp & 15)); // This prints as 12
arr[0] = _mm_load_si128(tmp);
}
이다.
arr
인수는, 잘 작동 _mm_loadu_128
을 사용하는 것입니다 _m128i arr[5] = { 0 }
대안으로 초기화하지만 난 그것을 이해, 그것은 movdqu
명령을 생산해야하지만이 어셈블리가
arr[0] = _mm_loadu_si128(tmp);
00D347F1 mov eax,dword ptr [tmp]
00D347F4 movups xmm0,xmmword ptr [eax]
00D347F7 movaps xmmword ptr [ebp-100h],xmm0
00D347FE mov ecx,10h
00D34803 imul edx,ecx,0
00D34806 add edx,dword ptr [arr]
00D34809 movups xmm0,xmmword ptr [ebp-100h]
00D34810 movups xmmword ptr [edx],xmm0
고마워 생성입니다 대답에서 나는 실수를 두 번이나 내 렸습니다.
- 소스는 최적화를
_alinged_malloc
컴파일을 사용 맞 춥니 다.
를 사용하여 C++ 캐스트하지 C
원본 주소를 정렬하는 데 아무 것도하지 않습니다. 저장된 주소를 변경하지 않고 포인터를 정렬하려고합니다. 'temp'가 가리키는 버퍼가 제대로 정렬되도록해야합니다. 또한 C++ 코드에서 C 스타일 캐스트를 피해야합니다. – VTT
@VTT :'(__m128i *)'는 내장 함수의 표준 스타일입니다. 'reinterpret_cast <__m128i*> (임시)'은 일반적으로 너무 부피가 크며 인텔의 내장 함수는 이미 충분히 긴 이름을 가지고 있습니다. (또한,'__m128i'는 다른 타입의 별칭을 지정할 수 있으므로 특별합니다.) –
정상적인 asm 출력을 원한다면 최적화를 사용하지 않고 컴파일하지 마십시오. 'imul edx, ecx, 0 '을내는 것은 영감을 얻지 못하는 나쁜 방법입니다. 'movups'로드를 수행하지만 스택에 임시로 쏟아져서 결과를 원하는 위치에 다시 저장하기 전에로드 된로드로 다시로드합니다. 내가 말했듯이, asm이 C++을 작성할 때 상상하는 것처럼 보이게하려면 최적화를 활성화하십시오. –