【发布时间】:2021-11-28 04:36:19
【问题描述】:
avx指令中用作源的寄存器在指令开始处理后何时可以重用?
例如:我想使用 vgatherdps 指令,它消耗两个 ymm 寄存器,其中一个是位移索引。我意识到vgatherdps 需要花费大量时间来收集数据,因为数据的局部性很差。
在指令执行期间是否保留位移索引寄存器,或者我可以在后续指令中重复使用它而不挂起流水线?
【问题讨论】:
-
我的印象是,所有输入寄存器在被消耗后都可以立即使用,因为所有输入都被复制到内部寄存器/触发器,它们通过固定的硬件管道传输。即使没有乱序执行也会出现这种情况,它将 ISA 中为数不多的外部可用寄存器映射到内部可用的更大的寄存器库。
-
@AkiSuihkonen:是的,通常是这样。执行单元获取输入寄存器的副本,即使它是 SIMD 向量,也不会返回查阅架构寄存器。所以是的,即使是有序管道也可以触发聚集并在下一条指令中写入索引。 (尽管聚集故障模型的部分进展意味着有序管道必须验证索引的所有 mask=1 元素的无故障,然后再继续让后面的指令开始。但它仍然不会到期到索引上的 WAR(读后写)危险。)
标签: assembly cpu-architecture simd avx micro-optimization