如何將單個32位浮點數加載/轉換爲AVX 256 ymm寄存器,以便所有8個浮點數都來自單個源浮點數?如何將一個32位浮點數加載到AVX ymm寄存器中的所有八個位置?
此前我使用AVX 128 xmm寄存器將一個浮點數加載到4個打包浮點數中。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
如何將單個32位浮點數加載/轉換爲AVX 256 ymm寄存器,以便所有8個浮點數都來自單個源浮點數?如何將一個32位浮點數加載到AVX ymm寄存器中的所有八個位置?
此前我使用AVX 128 xmm寄存器將一個浮點數加載到4個打包浮點數中。
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
此操作有時稱爲「廣播」。 AVX有一系列的說明,它們是vbroadcast128
,vbroadcastsd
和vbroadcastss
。既然你要播放一個單精度浮點值,你想要的最後一項:
vbroadcastss ymm7, [eax]
如果你不想使用臨時存儲位置,就跨所有的廣播值寄存器的位置,你可以考慮做這樣的事情:
shufps xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
假設xmm0
包含在寄存器的開頭最低DWORD標量值。 shufps
與0作爲立即數操作數一起使用時,會將最低雙字複製到XMM寄存器的所有位置。 vinsertf128
然後用較低的xmmword替換YMM寄存器的較高的xmmword。
我還沒有檢查哪個版本實際上更快。你最好在自己的應用程序中測試自己。如果你問我,這完全說明沒有帶寄存器操作數的vbroadcast
。