Как передать самое низкое слово из __m256i? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь написать код AVX2 с использованием встроенных функций.Хотите знать, как использовать встроенные функции Intel для передачи самого низкого слова в YMM всему YMM.Я знаю, что с ассемблерным кодом я мог бы просто написать

vpbroadcastw ymm1, xmm0

, потому что самое низкое слово ymm0 также является самым низким словом xmm0.У меня есть переменная х, которая является значением в YMM.Но

_mm256_broadcastw_epi16((__m128i) x)

, где x - это __m256i, возвращает ошибку - не может преобразовать две вещи разных размеров.

rq_recip3_new.c:381:5: error: can’t convert a value of type ‘__m256i {aka __vector(4) long long int}’ to vector type ‘__vector(2) long long int’ which has different size

Я не думаю,это важно, но мои машины используют gcc 6.4.1 и 7.3 (Fedora 25 и Ubuntu LTS 16.04 соответственно).

1 Ответ

0 голосов
/ 29 декабря 2018

Должно работать следующее:

__m256i broadcast_word(__m256i x){
    return _mm256_broadcastw_epi16(_mm256_castsi256_si128(x));
}

Для встроенных функций _mm256_castsi256_si128 - это правильный способ приведения от 256 до 128 бит.

С Godbolt Compiler Explorer компилируется в (gcc 7.3):

broadcast_word:
  vpbroadcastw ymm0, xmm0
ret
...