以下代码:

__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 01 1 10653532162 2 10737418243 3 10779361284 4 10821304325 5 10842275846 6 10863247367 7 10884218888 8 10905190409 9 109156761610 10 109261619211 11 109366476812 12 109471334413 13 109576192014 14 109681049615 15 109785907216 16 109890764817 17 109943193618 18 109995622419 19 110048051220 20 110100480021 21 110152908822 22 110205337623 23 110257766424 24 110310195225 25 110362624026 26 110415052827 27 110467481628 28 110519910429 29 110572339230 30 110624768031 31 110677196832 32 110729625633 33 110755840034 34 110782054435 35 110808268836 36 110834483237 37 110860697638 38 110886912039 39 110913126440 40 110939340841 41 110965555242 42 110991769643 43 111017984044 44 111044198445 45 111070412846 46 111096627247 47 111122841648 48 111149056049 49 11117527041.45875e-42 1.45875e-42 10410 0 0

我的问题是:_mm_extract_ps不是访问__m128变量内容的正确方法吗?为什么它打印与实际值不匹配的值,而var[0]打印正确的值。据我所知,使用__m128访问var[0]变量的字段是不正确的,并可能导致问题。在需要调试代码的时候,什么才是正确的方法。

最佳答案

a的类型是指向float的指针,当您将float == 1.0f写入内存时,其十六进制表示形式为0x3F800000,十进制值为1 065 353 216,因此打印的值有效,_mm_extract_ps返回int,并且cout打印它。 2.0f的十六进制表示形式是0x40000000,十进制1 073 741824。使用十进制值打印了float的十六进制表示形式。

关于c++ - SSE-_mm_extract_ps与直接访问之间不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47919738/

10-11 04:04
查看更多