19

できるだけ少ないクロックサイクルで回転操作を実行する必要があります。__m128i最初のケースでは、sourceおよびdestタイプとして次のように想定します。

ソース:|| A0 || A1 || A2 || A3 ||
  dest:|| A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));

今、私はAVX組み込み関数で同じことをしたいと思います。したがって、今回__m256iはsourceおよびdestタイプとして想定します。

ソース:|| A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
  dest:|| A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||

AVX組み込み関数には、対応するSSE整数演算のほとんどがありません。おそらく、浮動小数点バージョンで目的の出力を機能させる方法があります。

私は試しました:

dest = (__m256i)_mm256_shuffle_ps((__m256)source, (__m256)source, _MM_SHUFFLE(0,3,2,1));

しかし、私が得るものは次のとおりです。

|| A0 || A2 || A3 || A4 || A5 || A6 || A7 || A1 ||

これを効率的な方法で解決する方法についてのアイデアはありますか?(SSEとAVXの操​​作を混合せず、「手動で」反転せずA0A1

前もって感謝します!

4

2 に答える 2

16

私の解決策:

__m256 tmp =  ( __m256 ) _mm256_permute_ps((__m256)_source, _MM_SHUFFLE ( 0,3,2,1 ));
* ( _dest ) =  ( __m256i) _mm256_blend_ps(tmp, _mm256_permute2f128_ps ( tmp,tmp,1 ), 136);  
于 2012-12-02T00:48:22.590 に答える
3

AVXの状況はまだ確認していませんが、少なくともSSEについては検討しました_mm_align*か?

たとえば、これはバイトベクトルを2バイト回転します。

__m128i v;
v = _mm_alignr_epi8 (v, v, 2) // v = v[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]

これは単一の命令にすることができます。また、そのような操作はlat 1 / tp 1、つまり高速です。

AVXは、このアプローチでは少し面倒である可能性が高いため、適応は役に立たない場合があります。

于 2017-05-05T07:32:35.127 に答える