3

単一の 32 ビット浮動小数点を AVX 256 ymm レジスタにロード/変換して、8 つの浮動小数点すべてが単一のソース浮動小数点からのものになるようにするにはどうすればよいですか?

以前は、AVX 128 xmm レジスタを使用して、1 つの float を 4 つのパックされた float にロードしていました。

    movss    xmm7,[eax];
    shufps   xmm7,xmm7,0;

    add eax, 0x4;
4

2 に答える 2

13

この操作は「ブロードキャスト」と呼ばれることがあります。vbroadcast128AVX には、まさにそれを行う命令がたくさんありvbroadcastsdますvbroadcastss。単一の単精度浮動小数点値をブロードキャストする必要があるため、次の最後の値が必要です。

vbroadcastss ymm7, [eax]
于 2012-05-19T14:15:21.147 に答える
5

レジスタのすべての場所に値をブロードキャストするためだけに一時メモリの場所を使用したくない場合は、次のようなことを検討できます。

shufps      xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1

xmm0先頭のレジスタの最下位 dword にスカラー値が含まれていると想定されます。shufps0 を即値オペランドとして使用すると、最下位の dword が XMM レジスタのすべての位置にコピーされます。vinsertf128次に、YMM レジスタの上位 xmmword を下位 xmmword に置き換えます。

どちらのバージョンが実際に速いかは確認していません。自分のアプリケーションで自分自身をテストするのが最善です。あなたが私に尋ねるvbroadcastと、レジスタオペランドを持つ a がないのは完全に最悪です。

于 2012-06-02T00:28:22.830 に答える