この問題は次のように説明できます。
入力
__m256d a, b, c, d
出力
__m256d s = {a[0]+a[1]+a[2]+a[3], b[0]+b[1]+b[2]+b[3],
c[0]+c[1]+c[2]+c[3], d[0]+d[1]+d[2]+d[3]}
今までやってきた仕事
簡単そうに思えた: 2 つの VHADD の間にいくつかのシャッフルがあるが、実際には、AVX によって特徴付けられるすべての順列を組み合わせても、その目標を達成するために必要な順列そのものを生成することはできない。説明させてください:
VHADD x, a, b => x = {a[0]+a[1], b[0]+b[1], a[2]+a[3], b[2]+b[3]}
VHADD y, c, d => y = {c[0]+c[1], d[0]+d[1], c[2]+c[3], d[2]+d[3]}
x と y を同じ方法で並べ替えて取得できましたか?
x1 = {a[0]+a[1], a[2]+a[3], c[0]+c[1], c[2]+c[3]}
y1 = {b[0]+b[1], b[2]+b[3], d[0]+d[1], d[2]+d[3]}
それから
VHADD s, x1, y1 => s1 = {a[0]+a[1]+a[2]+a[3], b[0]+b[1]+b[2]+b[3],
c[0]+c[1]+c[2]+c[3], d[0]+d[1]+d[2]+d[3]}
これは私が望んでいた結果です。
したがって、実行する方法を見つける必要があります
x,y => {x[0], x[2], y[0], y[2]}, {x[1], x[3], y[1], y[3]}
残念ながら、VSHUFPD、VBLENDPD、VPERMILPD、VPERM2F128、VUNPCKHPD、VUNPCKLPD の任意の組み合わせを使用しても、これはおそらく不可能であるという結論に達しました。問題の核心は、__m256d のインスタンス u で u[1] と u[2] を入れ替えることができないということです。
質問
これは本当に行き止まりですか?または、置換命令を見逃しましたか?