Как совместить два значения __m128 с __m256? - программирование
Подтвердить что ты не робот

Как совместить два значения __m128 с __m256?

Я хотел бы объединить два значения __m128 в один __m256.

Что-то вроде этого:

__m128 a = _mm_set_ps(1, 2, 3, 4);
__m128 b = _mm_set_ps(5, 6, 7, 8);

к чему-то вроде:

__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 };

Есть ли какие-либо внутренние функции, которые я могу использовать для этого?

4b9b3361

Ответ 1

Это должно делать то, что вы хотите:

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);

__m256 c = _mm256_castps128_ps256(a);
c = _mm256_insertf128_ps(c,b,1);

Если порядок отменен с того, что вы хотите, просто переключите a и b.


Представляющим интересом является _mm256_insertf128_ps, который позволит вам вставить 128-битный регистр в нижнюю или верхнюю половину 256-битного регистра AVX:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_avx_insertf128_ps.htm

Полное их семейство находится здесь:

Ответ 2

Даже этот будет работать:

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);

__m256 c = _mm256_insertf128_ps(c,a,0);
c = _mm256_insertf128_ps(c,b,1);

Вы получите предупреждение, так как c не инициализирован, но вы можете его игнорировать, и если вы ищете возможности, это решение будет использовать меньше тактового цикла, а затем другого.

Ответ 3

Можно также использовать перестановочную внутреннюю строку:

__m128 a = _mm_set_ps(1,2,3,4);
__m128 b = _mm_set_ps(5,6,7,8);
__m256 c = _mm256_permute2f128_ps(_mm256_castps128_ps256(a), _mm256_castps128_ps256(b), 0x20);

Я не знаю, какой путь быстрее.