Могу ли я работать с 4 int32_t, содержащимися в __m128i?

0

Я хотел бы иметь переменную __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 переменными и являются первыми, вторыми, третьими и четвертыми 32 битами четырех значений. Это возможно?

Теги:
x86
sse
simd

1 ответ

0

Вы можете использовать

int _mm_extract_epi32( 
   __m128i a,
   const int ndx 
);

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

EDIT: Обратите внимание, что это работает только для int SSE векторов, я вижу, что здесь довольно много дебатов. Получите член __m128 по индексу? , который относится к __m128, но в вашем случае это должно быть возможно использовать. Тем не менее, всегда стоит поднять голову, что это не является достаточно общим для поплавков.

Для записи вы можете использовать эквивалентный _mm_insert_epi32, как вы указываете.

  • 1
    Вопрос спрашивает о назначении, а не только о чтении отдельных элементов.
  • 1
    Это может работать в сочетании с _mm_insert_epi32 msdn.microsoft.com/en-us/library/bb514012%28v=vs.90%29.aspx . Тем не менее, SSE4 не входит в мои возможности на данный момент, жаль ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню