単一の 32 ビット浮動小数点を AVX 256 ymm レジスタにロード/変換して、8 つの浮動小数点すべてが単一のソース浮動小数点からのものになるようにするにはどうすればよいですか?
以前は、AVX 128 xmm レジスタを使用して、1 つの float を 4 つのパックされた float にロードしていました。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
単一の 32 ビット浮動小数点を AVX 256 ymm レジスタにロード/変換して、8 つの浮動小数点すべてが単一のソース浮動小数点からのものになるようにするにはどうすればよいですか?
以前は、AVX 128 xmm レジスタを使用して、1 つの float を 4 つのパックされた float にロードしていました。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
この操作は「ブロードキャスト」と呼ばれることがあります。vbroadcast128
AVX には、まさにそれを行う命令がたくさんありvbroadcastsd
ますvbroadcastss
。単一の単精度浮動小数点値をブロードキャストする必要があるため、次の最後の値が必要です。
vbroadcastss ymm7, [eax]
レジスタのすべての場所に値をブロードキャストするためだけに一時メモリの場所を使用したくない場合は、次のようなことを検討できます。
shufps xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
xmm0
先頭のレジスタの最下位 dword にスカラー値が含まれていると想定されます。shufps
0 を即値オペランドとして使用すると、最下位の dword が XMM レジスタのすべての位置にコピーされます。vinsertf128
次に、YMM レジスタの上位 xmmword を下位 xmmword に置き換えます。
どちらのバージョンが実際に速いかは確認していません。自分のアプリケーションで自分自身をテストするのが最善です。あなたが私に尋ねるvbroadcast
と、レジスタオペランドを持つ a がないのは完全に最悪です。