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

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

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

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

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

Для этого вам действительно нужно 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 

С AVX2: VPERMPD ymm1, ymm2/m256, imm8 работает с той же пропускной способностью и латентностью, что и другие VPERM2F128 переходы (например, VPERM2F128 ) на процессорах Intel. (На AMD Excavator, если эти цифры правильные , vperm2f128 медленнее, чем один vpermpd ).

FMA – это отдельный бит функции от AVX2, но на практике нет никаких процессоров с FMA3, но не AVX2. (Семейство AMD Bulldozer имеет 4-операнд FMA4). Поэтому вы все равно должны проверять как биты функции AVX2, так и FMA, но вам не нужно беспокоиться о том, что ваша функция может использоваться на меньшем количестве моделей процессоров.


Поэтому, если ваш код уже зависит от FMA или AVX2, используйте AVX2:

 _mm256_permute4x64_pd(vec, _MM_SHUFFLE(0,1,2,3)); // ie 0b00011011 

Если вы еще не зависите от FMA или AVX2, просто от AVX, и не стоит делать еще одну версию вашей функции только для небольшого выигрыша в случайном воспроизведении, тогда используйте двухступенчатое решение Mysticial для совместимости со SnB / IvB и Прецизионный экскаватор AMD Bulldozer.