【问题标题】:SSE - mismatch between _mm_extract_ps and direct accessSSE - _mm_extract_ps 和直接访问不匹配
【发布时间】:2017-12-21 07:11:47
【问题描述】:

以下代码:

__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 变量的字段是不正确的,可能会导致问题。什么是正确的方法,有时我需要调试我的代码。

【问题讨论】:

    标签: c++ sse


    【解决方案1】:

    a的类型是指向float的指针,当你写float == 1.0f时,它的十六进制表示是0x3F800000,十进制是1 065 353 216,所以打印的值是有效的,_mm_extract_ps返回int,然后 cout 打印它。 2.0f 的十六进制表示为 0x40000000,十进制为 1 073 741 824。您使用十进制值打印了浮点的十六进制表示。

    【讨论】:

    • 哇,没想到。另一个问题。只要我检查代码中值的正确性,以 var[0] 的形式访问变量就可以了吗?
    • @Blue 嗯,我不明白你的问题。你什么意思 ?你什么时候检查值的正确性?数据已填充,加载到 __m128 并刚刚打印。
    • 我的意思是检查计算后是否加载/获得了正确的值。我将我的 c++ 代码与我的 sse 优化的 c++ 代码匹配,以检查两个输出中的所有数组是否匹配。这是我写的一个示例程序来解释我的困惑。
    猜你喜欢
    • 2011-07-28
    • 2013-04-08
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多