xzb*_*667 3 c++ optimization avx
如何将单个32位浮点加载/转换为AVX 256 ymm寄存器,以便所有8个浮点数来自单个源浮点数?
以前我使用AVX 128 xmm寄存器将一个浮动加载到4个打包浮动中.
movss xmm7,[eax];
shufps xmm7,xmm7,0;
add eax, 0x4;
Run Code Online (Sandbox Code Playgroud)
小智 13
该操作有时被称为"广播".AVX有一堆指令就是这样做的,这些都是vbroadcast128,vbroadcastsd和vbroadcastss.由于您要广播单个单精度浮点值,因此您需要最后一个:
vbroadcastss ymm7, [eax]
Run Code Online (Sandbox Code Playgroud)
如果您不想仅使用临时存储位置来跨寄存器的所有位置广播值,则可以考虑执行以下操作:
shufps xmm0, xmm0, 0
vinsertf128 ymm0, ymm0, xmm0, 1
Run Code Online (Sandbox Code Playgroud)
假定xmm0在开始时在寄存器的最低dword中包含标量值。shufps,当与0作为立即操作数一起使用时,将最低的dword复制到XMM寄存器的所有位置。vinsertf128然后用较低的xmmword替换YMM寄存器的较高的xmmword。
我没有检查哪个版本实际上更快。最好在自己的应用程序中进行测试。如果您问我,那真是糟透了,没有vbroadcast一个寄存器操作数。
| 归档时间: |
|
| 查看次数: |
2449 次 |
| 最近记录: |