Обратный регистр AVX, содержащий двойные числа, с использованием одного встроенного AVX.

Если у меня есть регистр AVX с 4 двойными значениями, и я хочу сохранить обратное значение в другом регистре, можно ли сделать это с помощью одной встроенной команды?

Например: если бы у меня было 4 числа с плавающей запятой в регистре SSE, я мог бы использовать:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));

Могу ли я сделать это с помощью, может быть, _mm256_permute2f128_pd()? Я не думаю, что вы можете обратиться к каждому отдельному двойнику, используя вышеуказанную встроенную функцию.


person user1715122    schedule 16.11.2012    source источник


Ответы (2)


На самом деле вам нужно 2 перестановки, чтобы сделать это:

  • _mm256_permute2f128_pd() переставляет только 128-битные фрагменты.
  • _mm256_permute_pd() не пересекает 128-битные границы.

Итак, вам нужно использовать оба:

inline __m256d reverse(__m256d x){
    x = _mm256_permute2f128_pd(x,x,1);
    x = _mm256_permute_pd(x,5);
    return x;
}

Контрольная работа:

int main(){
    __m256d x = _mm256_set_pd(13,12,11,10);

    cout << x.m256d_f64[0] << "  " << x.m256d_f64[1] << "  " << x.m256d_f64[2] << "  " << x.m256d_f64[3] << endl;
    x = reverse(x);
    cout << x.m256d_f64[0] << "  " << x.m256d_f64[1] << "  " << x.m256d_f64[2] << "  " << x.m256d_f64[3] << endl;
}

Вывод:

10  11  12  13
13  12  11  10
person Mysticial    schedule 16.11.2012
comment
Ага. Стоит иметь в виду, что AVX2 добавит полную перестановку, даже если вы не можете использовать ее сегодня, VPERMPD/_mm256_permute4x64_pd. Справочные документы Intel содержат более подробную информацию. - person Stephen Canon; 17.11.2012
comment
Любая идея, как задержка двух инструкций сравнивается друг с другом? - person user1715122; 29.11.2012
comment
Я имею в виду задержку _mm_shuffle_ps() для реверсирования регистра SSE и описанную выше обратную операцию для регистра AVX. - person user1715122; 29.11.2012
comment
@ user1715122 Понятия не имею. Вероятно, вы можете добавить его из таблиц Agner Fog . Конечно, реальная производительность будет сложнее из-за других факторов. - person Mysticial; 29.11.2012

Поддержка перетасовки при пересечении дорожек с более тонкой 128-битной детализацией была новой в AVX2:

_mm256_permute4x64_pd(vec, _MM_SHUFFLE(0,1,2,3));  // i.e. 0b00011011

VPERMPD ymm1, ymm2/m256, imm8 работает с той же пропускной способностью и задержкой, что и другие перетасовки с пересечением дорожек (например, VPERM2F128) на процессорах Intel. (На AMD Excavator и Zen1 (https://uops.info/), vpermpd быстрее, чем vperm2f128 с двумя входами, поскольку они обрабатывают 256-битные векторы).


Есть несколько процессоров с FMA3, но не с AVX2, например. AMD Piledriver и Steamroller. В Intel AVX2 и FMA были новыми для Haswell. Семейство AMD Bulldozer устарело, но все еще используется на домашних компьютерах, поэтому, даже если ваша функция использует преимущества AVX1 + FMA, вы также можете потребовать AVX2 и вернуть эти несколько процессоров к чему-то еще худшему (например, AVX1 без FMA) , или сделать еще одну версию вашей функции.

person Peter Cordes    schedule 13.03.2016