如何在256位AVX(YMM)寄存器中交换低128位和高128位

Mar*_*ing 18 x86 simd avx

我正在移植SSE SIMD代码以使用256位AVX扩展,并且似乎找不到任何将混合/混洗/移动高128位和低128位的指令.

支持故事:

我真正想要的是VHADDPS/ _mm256_hadd_ps表现得像HADDPS/ _mm_hadd_ps,只有256个字.不幸的是,它就像是HADDPS对低字和高字独立行动的两次调用.

Mar*_*ing 17

使用VPERM2F128,可以交换低128位和高位128位(以及其他排列).内在的是

x = _mm256_permute2f128_ps( x , x , 1)
Run Code Online (Sandbox Code Playgroud)

第三个参数是一个控制字,为用户提供了很大的灵活性.英特尔在线文档似乎完全没有解释控制字结构是什么,但可下载的英特尔Instrinsic Guide应用程序提供了更好的解释.

  • 这回答了我的问题:[为什么两者都是?vperm2f128 (avx) 与 vperm2i128 (avx2)](/sf/ask/3756800981/) (2认同)