Используя встроенные функции AVX / AVX2, я могу собрать наборы из 8 значений, либо 1,2- или 4-байтовые целые числа, либо 4-байтовые числа с плавающей запятой, используя:
_mm256_i32gather_epi32 ()
_mm256_i32gather_ps ()
Но в настоящее время у меня есть случай, когда я загружаю данные, которые были сгенерированы на графическом процессоре nvidia и сохранены как значения FP16. Как я могу векторизовать множество этих значений?
Пока что я нашел _mm256_cvtph_ps () встроенный.
Однако входными данными для этого внутреннего элемента является значение __m128i, а не значение __m256i.
Глядя на Intel Intrinsics Guide, я не вижу операций сбора, которые сохраняют 8 значений в регистре _mm128i?
Как я могу собрать значения FP16 в 8 дорожек регистра __m256? Можно ли векторно загрузить их как 2-байтовые шорты в __m256i, а затем как-то уменьшить это до значения __m128i, которое будет передано во встроенное преобразование? Если так, то я не нашел для этого встроенных функций.
ОБНОВЛЕНИЕ
Я пробовал использовать состав, предложенный @ peter-cordes, но получаю от этого фальшивые результаты. Кроме того, я не понимаю, как это могло работать?
Мои 2-байтовые значения int хранятся в __m256i как:
0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX 0000XXXX
так как я могу просто передать __m128i, где он должен быть плотно упакован как
XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
Будет ли это делать актерский состав?
Мой текущий код:
__fp16* fielddensity = ...
__m256i indices = ...
__m256i msk = _mm256_set1_epi32(0xffff);
__m256i d = _mm256_and_si256(_mm256_i32gather_epi32(fielddensity,indices,2), msk);
__m256 v = _mm256_cvtph_ps(_mm256_castsi256_si128(d));
Но результат не похоже на 8 правильно сформированных значений. Я думаю, что каждый второй сейчас для меня подделка?
__m256i
и использовать это как__m128i
(с приведением) . Будьте осторожны, чтобы сбор верхнего элемента вашего массива не мог перейти на неотображенную страницу. И да, единственная поддержка x86 для чисел с плавающей точкой половинной точности - это преобразование их в / из одинарной точности (до будущего AVX512). - person Peter Cordes   schedule 16.06.2020_mm256_cvtph_ps
, которая расширяет каждый элемент, имеет вход, который составляет половину ширины его вывода. - person Peter Cordes   schedule 16.06.2020_mm256_castsi256_si128
для преобразования из__m256i
в__m128i
(хотя преобразование в стиле C может работать на большинстве компиляторов). - person chtz   schedule 16.06.2020