一部のCコードでAVX2命令を使用しています。ソースベースのインデックスからデスティネーションベースのインデックスへの変換
VPERMD命令はidx
に基づいa
を置換することによって、2つの8整数ベクトルa
とidx
を取り、第三のいずれかを生成する、dst
。これはdst[i] = a[idx[i]] for i in 0..7
に相当します。このソースは、ソースに基づいてインデックス付けされているため、このソースをベースとしています。
ただし、計算されたインデックスは宛先ベースの形式になっています。配列を設定するのは当然ですが、これはdst[idx[i]] = a[i] for i in 0..7
に相当します。
ソースベースのフォームから宛先ベースのフォームに変換するにはどうすればよいですか?例のテストケースがある:この変換のために
{2 1 0 5 3 4 6 7} source-based form.
{2 1 0 4 5 3 6 7} destination-based equivalent
、私はYMMレジスタに滞在していますので、それは宛先ベースのソリューションが動作しないことを意味します。個別に挿入する場合でも、定数インデックスのみで動作するため、設定することはできません。
これはまさに古典的な "順列逆転"、dst [src [i]] = iの – harold
です。しかし、あなたのコードでは、宛先ベースの方法で設定する機能が必要です。私はAVX2レジスタで動作しているので私はそれをすることはできません。私はあなたが言うように、ほぼ正確にそれを行うCコードを持っていますが、私はあなたが示唆するように、宛先ベースの並べ替えを行うことができずにインデックスを変換することができる必要があります。 – eyepatch
あなたの 'a [i] = a [idx [i]]は、VPERMDの操作を正しく記述しませんでした。なぜなら、' a'への変更は 'a [idx [ i]] 'に置き換えます。例えばidx [0] = 0でなければ、元の 'a [0]'はすぐに破棄されます。私はあなたの例は、そのバグを修正するために私の編集後にはまだ正気であると思う(またはその時間全体の行動を仮定していた)。 –