Я ищу наиболее эффективный способ умножить два выровненных массива int16_t, длину которых можно разделить на 16 с помощью AVX2.
После умножения на вектор x
Я начал с _mm256_extracti128_si256
и _mm256_castsi256_si128
чтобы иметь младшую и высокую часть x
и добавить их с помощью _mm_add_epi16
.
Я скопировал регистр результатов и применил _mm_move_epi64
к исходному регистру и снова добавил оба с _mm_add_epi16
. Теперь я думаю, что у меня есть:
-, -, -, -, x15+x7+x11+x3, x14+x6+x10+x2, x13+x5+x9+x1, x12+x4+x8+x0
в 128-битном регистре. Но теперь я застрял и не знаю, как эффективно суммировать оставшиеся четыре записи и как извлечь 16-битный результат.