2017-12-21 16 views
0

다음 코드 조각 사이의 불일치 :는 SSE - _mm_extract_ps 및 직접 액세스

__m128 var1; 
float *a = (float*)malloc(50*sizeof(float)); 
float *ptr = a; 

//Initialise a with some values 
for(int i = 0; i < 50; i++) 
    *(a+i) = i; 

//print those values 
for(int i = 0; i < 50; i+=4,ptr+=4) 
{ 
    var1 = _mm_loadu_ps(ptr); 
    cout<<(*ptr)<<" "<<var1[0]<<" "<<_mm_extract_ps(var1, 0)<<endl; 
    cout<<(*ptr+1)<<" "<<var1[1]<<" "<<_mm_extract_ps(var1, 1)<<endl; 
    cout<<(*ptr+2)<<" "<<var1[2]<<" "<<_mm_extract_ps(var1, 2)<<endl; 
    cout<<(*ptr+3)<<" "<<var1[3]<<" "<<_mm_extract_ps(var1, 3)<<endl; 
} 

수익률이 출력 : 0 0 0 1 1 1065353216 2 2 1073741824 3 3 1077936128 4 4 1082130432 5 5 1084227584 6 6 1086324736 7 7 1088421888 8 8 1090519040 9 9 1091567616 10 10 1092616192 11 11 1093664768 12 12 1094713344 13 13 1095761920 14 14 1096810496 15 15 1097859072 16 16 1098907648 17 17 1099431936 18 18 1099956224 19 19 1100480512 20 20 1101004800 21 21 1101529088 22 22 1102053376 23 23 1102577664 24 24 1103101952 25 25 1103626240 26 26 1104150528 27 27 1104674816 28 28 1105199104 29 29 1105723392 30 30 1106247680 31 31 1106771968 32 32 1107296256 33 33 1107558400 34 34 1107820544 35 35 1108082688 36 36 1108344832 37 37 1108606976 38 38 1108869120 39 39 1109131264 40 40 1109393408 41 41 1109655552 42 42 1109917696 43 43 1110179840 44 44 1110441984 45 45 1110704128 46 46 1110966272 47 47 1111228416 48 48 1111490560 49 49 1111752704 1.45875e-42 1.45875e-42 1041 0 0 0

내 질문에

은이 :에 액세스 할 수있는 올바른 방법 _mm_extract_ps 아닌가 변수 __m128의 내용? var[0]이 올바른 값을 인쇄하는 반면 실제 값과 일치하지 않는 값을 인쇄하는 이유는 무엇입니까? 내가 아는 한 var[0]을 사용하여 __m128 변수의 필드에 액세스하는 것은 올바르지 않으므로 문제가 발생할 수 있습니다. 내 코드를 디버깅해야 할 때 정확한 접근 방법은 무엇입니까?

답변

1

유형 a은 부동 소수점 == 1.0f를 메모리에 쓸 때 16 진수 값은 0x3F800000이고 10 진수 값은 1 065 353 216이므로 인쇄 된 값은 유효하며 _mm_extract_ps은 int를 반환하고 cout이 그것을 출력합니다. 2.0f의 16 진수 표현은 십진수 1 073 741 824 인 0x40000000입니다. 10 진수 값을 사용하여 float의 16 진수 표현을 인쇄했습니다.

+0

와우는 그렇게 생각하지 않았습니다. 다른 질문. var [0]으로 변수에 액세스하는 것은 코드에서 값의 정확성을 검사하는 한 괜찮습니까? – Blue

+0

@Blue 흠, 나는 당신의 질문을 이해하지 못합니다. 무슨 소리 야? 언제 값의 정확성을 확인하고 있습니까? 데이터가 채워지고 __m128에로드되어 인쇄됩니다. – rafix07

+0

무슨 뜻입니까 계산 후 올바른 값이로드되는지 확인해야합니다. 모든 배열이 두 출력에서 ​​일치하는지 확인하기 위해 내 C++ 코드를 내 sse 최적화 된 C++ 코드와 비교합니다. 이것은 내가 가진 혼란을 설명하기 위해 쓴 샘플 프로그램이었습니다. – Blue