使用SSE内部函数复制少量数据时出现问题

时间:2018-07-10 16:05:48

标签: c++ sse simd

我在这里看过类似的问题,并尝试使用类似的代码,但是在某个地方出错了。顺便说一下,这只是一个学习练习。这是代码:

struct alignas(16) Data
{
    union
    {
      int field1;
      int field2;
      int field3;
      int field4;
      int field5;
      int field6;
      int field7;
      int field8;
      __m128 v[2];
   };
};

void copy((__m128* __restrict b, const __m128* __restrict a)
{
    *b++ = *a++;
    *b++ = *a++;
}

int main(int, char**)
{
   Data dst={0};
   Data src={0};
   src.field1=1;
   src.field2=500;
   src.field3=200;
   src.field4=393;
   src.field5=29383;
   src.field6=3838;
   src.field7=128484;
   src.field8=111;

   copy(dst.v,src.v);


   std::cout<<" before copy   dst.field1=" << dst.field1 <<" dst.field2=" << dst.field2 << std::endl;
   return 0;
}

在复制之前,field1和field2都显示为0,但是复制后两者都为111?我对c ++相当陌生,因此看来它是将结构的最后32位复制到dst结构的64位上,但是不确定为什么吗?

1 个答案:

答案 0 :(得分:4)

您的并集不正确,它具有1个整数或__m128的数组。 field1field2等都指向同一内存。除了上一个field8以外的所有作业都将被覆盖。

您可以改用它:

struct alignas(16) Data
{
    union
    {
      int fields[8];
      __m128 v[2];
   };
};