4つの倍精度値を持つAVXレジスタがあります。今は、各要素ごとに個別に算術演算を行う必要があります。私がしなければならないことの半分化は以下の通りです。AVXレジスタの内容を無効にする
Situation:
a = [a4 a3 a2 a1]
w = [ 0 0 0 w1]
x = [ 0 0 0 x1]
y = [ 0 0 0 y1]
z = [ 0 0 0 z1]
Desired result:
w = [-- -- -- w1+a1]
x = [-- -- -- x1+a2]
y = [-- -- -- y1+a3]
z = [-- -- -- z1+a4]
目的の結果は、2つの値の合計だけではなく、それらのより複雑な算術式を除いています。私が--
と書いたところでは、私はそれらの値を気にしないで捨てるという意味です。
私は、置換演算を使用してレジスタa
を並べ替えることができました(例:Reverse a AVX register containing doubles using a single AVX intrinsicを参照)。私の唯一の問題は、これらのコンパイラ組み込み関数がこの操作を動的に実行する必要がある間に、コンパイル時の値を即座に必要とすることです。
私は_mm256_permutevar_pdのように、他のレジスタに含まれる整数で動作する順列組み込み関数を発見したが、並び替えるレーン間でそれらのどれも(例えば、それは最初の場所でa3
を持つように、これらの命令を使用しては不可能であろう。何を行うための唯一の方法
if
の条件に従う128ビットのレーンで並べ替えを行い、その後にレーン内の動的並べ替えを行う必要がありますか、それとも良い解決策がありますか?私はパフォーマンスと保守性の両方に興味があります。私はAVX2命令まで使うことができます。組み立てはオプションですが、私は組み込み関数が好きです。
メモリにベクトルとして格納し、スカラーとして読み込みますか? –
私はそのような解決策から離れたときに、私のアプリケーションに大きなスピードアップがありました。私はすでに「メモリ内のストア」ソリューションを実装しました。今度は、全体の操作がレジスタで行われるときの違いを見たいと思います。 – Spiros
結果は4つの独立したスカラー倍として結果が必要ですか? (これは、他の要素が関与していないベクトルの低い要素にあるのと同じことです)。非コンパイル時定数シャッフルはどこに入っていますか?なぜあなたは 'vextractf128'を使って解凍し、' __m128d'の上位半分を 'vmovhlps'などでスカラー' double'にすることができないのか分かりません。あなたはどのベクトル要素がどの変数名になるか知っています... –