【问题标题】:Can I work on the 4 int32_t contained in a __m128i?我可以处理 __m128i 中包含的 4 个 int32_t 吗?
【发布时间】:2013-10-24 16:36:10
【问题描述】:

我想要一个 __m128i 变量, 并做一些这样的操作:

unsigned char* myArray;
__m128i fourValues;

//Do some strange reference assignment, e.g.:
//int32_t& a = *((int32_t*) &fourValues);
//int32_t& b = *(((int32_t*) &fourValues) + 1);
//int32_t& c = *(((int32_t*) &fourValues) + 2);
//int32_t& d = *(((int32_t*) &fourValues) + 3);

for (int i =0; i < someSize; i+=4) {
  a = d + myArray[i];
  b = a + myArray[i+1];
  c = b + myArray[i+2];
  d = c + myArray[i+3];
  //Do something with fourValues;
  }

其中 a,b,c,d 是(或表现为)int32_t 变量,并且是fourValues 的第一个、第二个、第三个和第四个32 位。这可能吗?

【问题讨论】:

  • 使用显式加载和存储操作。这样,您的 __m128i 变量实际上将存在于 SSE 寄存器中,这是最有效的。还要寻找使用 SSE 指令进行操作的方法,这样您就不需要加载和存储......但是单个加载/存储对比别名更有效。
  • 注意:如果您为此发布当前的 实际 标量代码,那么您可能会使用 SSE 获得更具体的解决方案。

标签: c++ x86 sse simd


【解决方案1】:

你可以使用

int _mm_extract_epi32( 
   __m128i a,
   const int ndx 
);

见- http://msdn.microsoft.com/en-us/library/bb531460%28v=vs.90%29.aspx

编辑:请注意,这仅适用于 int SSE 向量,我看到这里有很多争论 - Get member of __m128 by index? ,它指的是 __m128,但在你的情况下应该可以使用它。不过,总是值得提醒一下,这对于浮点数来说还不够通用。

正如您所指出的,对于写作,您可以使用等效的 _mm_insert_epi32。

【讨论】:

  • 这个问题询问的是作业,而不仅仅是阅读单个元素。
  • 这可能与 _mm_insert_epi32 msdn.microsoft.com/en-us/library/bb514012%28v=vs.90%29.aspx 结合使用。不过,SSE4暂时不在我的选择之列,可惜……
  • 啊,没注意写的部分。无论如何,既然你想避免 SSE4 - 就我个人而言,我会使用直接内存访问和不安全的转换,因为我是一个糟糕的程序员,但这是非常特定于平台的,不会在这个网站上作为答案,抱歉
猜你喜欢
  • 2014-01-13
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多