2017-12-21 5 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]は正しい値を出力するのに対して、実際の値には一致しない値を印刷するのはなぜですか。私が知る限り、__m128変数のフィールドにはvar[0]を使用してアクセスすると問題が発生する可能性があります。私のコードをデバッグする必要がある時に、正しいアプローチは正確に何ですか。

答えて

1

タイプa浮動小数点== 1.0fをメモリに書き込むとき、16進数は0x3F800000、小数は1 065 353 216なので、印刷された値は有効です。_mm_extract_psはintを返します。 coutはそれを表示します。 2.0fの16進表記は、0x40000000(10進数1 073 741 824)です。floatの16進表記を10進値で出力しました。

+0

うわー、そんなことは考えなかった。もう一つの質問。 var [0]として変数にアクセスするのは、コードの値の正しさをチェックしている限り、問題ありません。 – Blue

+0

@Blueうーん、私はあなたの質問を理解していない。どういう意味ですか ?いつ値の正しさをチェックしていますか?データは塗りつぶされ、__m128にロードされ、印刷されました。 – rafix07

+0

私が意味することは、正しい値が計算後にロード/取得されているかどうかをチェックすることです。私はすべての配列が両方の出力に一致するかどうかを調べるために、自分のC++コードをsse最適化されたC++コードにマッチングしています。これは私が持っていた混乱を説明するために書いたサンプルプログラムでした。 – Blue

関連する問題