根据uops.info,如果xmm参数来自内存,则vinserti128的吞吐量倒数为0.5,如果xmm参数是寄存器,则为1。这背后的根本原因是什么?是错误吗?Link我不明白为什么端口0和1只是一个选项,如果xmm参数 * 不是 * 寄存器的话。硬件中有什么东西可以解释这一点吗?
vinserti128
xurqigkl1#
如果有什么令人惊讶的,那就是它们测试的真实的效果或假象。你可以点击任何数字来查看详细的测试结果,包括用于测试吞吐量和端口的指令序列。在这种情况下,是的,内存源版本是不同的,测试结果是有意义的。正如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可以类似地使用vblendps或pd执行单元。桑迪/Ivy Bridge只能向128位XMM免费广播;它需要一个用于vbroadcastss/sd/f128 ymm, mem的port 5 shuffle(并且没有寄存器-源广播;但对于寄存器源代码vinsert或vperm2f128,它将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寄存器),如果寄存器长时间未被写入,则可能会无限期地持续。但与立即数生成的混合控制输入相结合,输入可以是有点古怪的,并且只有输出需要是完全正常的并且可能是持久状态的一部分。
vbroadcastss/d
vpbroadcastd/q
vbroadcasti128
vbroadcastf128
vmovddup ymm, [mem]
vbroadcast ymm
vpblendd
vinsertf128
vblendps
pd
vbroadcastss/sd/f128 ymm, mem
vinsert
vperm2f128
vinserti/f128 mem
1*p05 + 1*p23
p5
p05
vbroadcastf128 ymm, mem
1条答案
按热度按时间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
可以类似地使用vblendps
或pd
执行单元。桑迪/Ivy Bridge只能向128位XMM免费广播;它需要一个用于
vbroadcastss/sd/f128 ymm, mem
的port 5 shuffle(并且没有寄存器-源广播;但对于寄存器源代码vinsert
或vperm2f128
,它将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寄存器),如果寄存器长时间未被写入,则可能会无限期地持续。但与立即数生成的混合控制输入相结合,输入可以是有点古怪的,并且只有输出需要是完全正常的并且可能是持久状态的一部分。