ann*_*uid 1 x86 assembly sse instruction-set
是否有一个寄存器包含向量/数组中的元素数量,我必须在使用mulssor 之类的操作之前加载它addss,或者我是否必须将该数字压入堆栈?SSE 指令如何在不超过末尾的情况下知道向量的长度?
x86 SIMD 指令操作向量寄存器,而不是直接操作内存。(或具有固定宽度的内存源操作数,例如addss xmm, xmm/m32,意味着源操作数是另一个 XMM 寄存器,或 32 位内存操作数。与addps xmm, xmm/m128(打包单个而不是标量单个)采用 128 位源操作数,可以是寄存器或内存)
一些历史向量机(如 Cray)具有更像 x86 的向量指令,rep movsd您确实提供了指针 + 长度并让硬件对其进行排序1。
但是,现代的短向量SIMD指令集不一样,在所有。必须针对特定的向量长度编译(或手写)代码。
您必须编写避免越过数组末尾的循环。请参阅当矩阵维数不是 4 的倍数时如何避免 AVX2 的错误?有关处理不是矢量宽度倍数的输入的示例。
另请注意,这mulss是使用 XMM 寄存器的低元素的标量指令。英特尔 insn-set ref 手册条目的“操作”部分准确描述了它的作用:
DEST[31:0]?DEST[31:0] * SRC[31:0]
DEST[MAXVL-1:32] (Unmodified)
Run Code Online (Sandbox Code Playgroud)
其中 MAXVL 是硬件支持的最大矢量宽度。(传统的 SSE 指令由于恼人的向后兼容原因而未修改上层通道,这与 AVX 编码 ( vmulss)不同,后者将上层通道归零以避免对旧值的错误依赖。)
脚注 1:Agner Fog 提出了一种带有可变长度向量寄存器的 ISA,它可能与您想象的类似。一个设计目标是让现有的二进制文件利用具有更宽向量的未来硬件,而无需为更宽的向量长度重新编译/重写,解决简单的“垂直”问题,如向量点积或c[i] += a[i] * b[i]
在他的博客上查看有关它的讨论,包括它与 x86 SSE / ARM NEON / PowerPC Altivec 其他现代短向量 SIMD ISA 的一些比较。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |