assembly uops.info对vinserti128的看法是错误的吗?

fzsnzjdm  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(165)

根据uops.info,如果xmm参数来自内存,则vinserti128的吞吐量倒数为0.5,如果xmm参数是寄存器,则为1。这背后的根本原因是什么?是错误吗?Link
我不明白为什么端口0和1只是一个选项,如果xmm参数 * 不是 * 寄存器的话。硬件中有什么东西可以解释这一点吗?

xurqigkl

xurqigkl1#

Uops.info自动化测试不会出现错别字

如果有什么令人惊讶的,那就是它们测试的真实的效果或假象。你可以点击任何数字来查看详细的测试结果,包括用于测试吞吐量和端口的指令序列。在这种情况下,是的,内存源版本是不同的,测试结果是有意义的。
正如chtz所评论的,寄存器源代码版本的工作方式类似于shuffle,但内存源代码版本可能解码为广播加载+混合
我们知道英特尔加载端口可以免费广播到256位,因为Haswell(4、8或16字节块)vbroadcastss/d/vpbroadcastd/q是单微操作,vbroadcasti128/vbroadcastf128也是。甚至vmovddup ymm, [mem]也是英特尔(端口2或3),复制每个16字节通道的低半部分不需要ALU。(在https://uops.info/中的vbroadcast ymm上滤波)
对于混合部分,Haswell和以后的版本可以通过从vinserti128立即数构造一个控制操作数来重用vpblendd执行单元,这是一个用于任何向量ALU端口的uop(p015)。
为了避免旁路延迟,vinsertf128可以类似地使用vblendpspd执行单元。
桑迪/Ivy Bridge只能向128位XMM免费广播;它需要一个用于vbroadcastss/sd/f128 ymm, mem的port 5 shuffle(并且没有寄存器-源广播;但对于寄存器源代码vinsertvperm2f128,它将vinserti/f128 mem作为1*p05 + 1*p23运行,而将p5作为p5运行。
SnB/IvB CPU在p05上运行vblendps/pd,因此可以推测来自内存的vinsertf128在这些端口上使用FP混合单元(直到Haswell,端口1也可以运行vblendps)。
因此,它可能有一些特殊的支持,可以将128位的加载结果转发到执行单元的低通道或高通道,以便进行合并(也许混合单元的设计可以接受这种情况)。
如果它可以转发到两个通道,我会假设它通常可以做到这一点,并且不需要在load uop之上为vbroadcastf128 ymm, mem使用端口5 uop。(写入硬YMM寄存器),如果寄存器长时间未被写入,则可能会无限期地持续。但与立即数生成的混合控制输入相结合,输入可以是有点古怪的,并且只有输出需要是完全正常的并且可能是持久状态的一部分。

相关问题