端口 7 可以存储 AGU 在最新的 Intel x86 上处理什么类型的地址?
What type of addresses can the port 7 store AGU handle on recent Intel x86?
从 Haswell 开始,Intel CPU 微架构有一个 dedicated store-address unit on port 7 可以处理一些存储操作的地址生成 uop(另一个 uop, 存储数据 总是去端口 4)。
最初认为这可以处理任何类型的地址,但事实并非如此。该端口可以处理哪些类型的地址?
此答案适用于 Haswell 和 Skylake (/Kaby Lake / Coffee Lake)。未来的 ISA(Cannon Lake / Ice Lake)可用时必须进行检查。端口 7 AGU 在 Haswell 中是新的。
对于完全可以使用端口 7 的指令(例如不是 vextracti128
),任何非索引寻址模式 都可以使用端口 7。
这包括 RIP 相对和 64 位绝对(mov [qword abs buf], eax
,即使在 PIE 可执行文件中加载超过 2^32,所以地址确实不适合 32 位),以及正常 [reg + disp0/8/32]
或绝对 [disp32]
.
索引寄存器总是阻止使用端口 7,例如[rdi + rax]
,或 [disp32 + rax*2]
。甚至 [NOSPLIT disp32 + rax*1]
也不能使用端口 7(因此 HSW/SKL 不会在内部将 scale=1 且没有基址寄存器的索引转换为 base+disp32 寻址模式。)
我在 Skylake i7-6700k 上用 ocperf.py stat -etask-clock,context-switches,cpu-migrations,page-faults,cycles,instructions,uops_dispatched_port.port_2,uops_dispatched_port.port_3,uops_dispatched_port.port_7 ./testloop
测试了自己。
[+0, +2047]
位移范围对商店没有影响:mov [rsi - 4000], rax
可以使用端口 7。
具有小正位移的非索引负载的延迟降低 1c。英特尔的优化手册中没有提到商店的特殊情况。 Skylake 的可变延迟存储转发(当负载试图在存储后立即执行时延迟更差)使得构建包含存储延迟但不受存储地址微指令与负载竞争更少的微基准测试变得困难端口。我还没有想出一个微基准测试,它通过存储地址 uop 而不是通过存储数据 uop 带有循环携带的依赖链。大概是可能的,但可能需要一个数组而不是单个位置。
有些指令根本不能使用port7:
vextracti128 [rdi], ymm0, 0
包含存储地址 uop(当然),但它只能在端口 2 或端口 3 上 运行。
Agner Fog 的指令表在这里至少有一个错误:他将 pextrb/w/d/q
列为仅 运行ning p23 上的存储地址 uop,但实际上它可以使用 p237 中的任何一个在 HSW/SKL.
我还没有对此进行详尽的测试,但是 我发现 HSW 和 SKL 之间的一个区别1 是 VCVTPS2PH [mem], xmm/ymm, imm8
。 (指令更改为使用更少的 ALU 微指令,因此这并不表示 HSW 和 SKL 之间的 p7 发生了变化)。
在 Haswell 上:VCVTPS2PH
是 4 uops(融合和非融合域):p1 p4 p5 p23(Agner Fog 是对的)。
在 Skylake 上:VCVTPS2PH xmm
是 2 个融合/3 个未融合的微指令:p01 p4 p237
在 Skylake 上:VCVTPS2PH ymm
是 3 个融合/3 个未融合的微指令:p01 p4 p237
(Agner Fog 将 VCVTPS2PH v
列为 3F/3U(两个矢量宽度的一个条目),缺少与 xmm 版本的微融合,并错误地将端口故障列为 p01 p4 p23)。
总的来说,请注意 Agner 最近的更新似乎有点草率,例如 copy/paste 或拼写错误(例如,Ryzen vbroadcastf128 y,m128
吞吐量为 5 而不是 0.5)。
1:HSW 测试是在一台不再可用的旧笔记本电脑上进行的(我用它的 RAM 升级了另一台仍然经常使用的机器)。我没有要测试的 Broadwell。这个答案中的所有内容在 Skylake 上绝对正确:我刚才仔细检查过。我不久前在 Haswell 上测试了其中的一些内容,并且仍然保留着我的笔记。
从 Haswell 开始,Intel CPU 微架构有一个 dedicated store-address unit on port 7 可以处理一些存储操作的地址生成 uop(另一个 uop, 存储数据 总是去端口 4)。
最初认为这可以处理任何类型的地址,但事实并非如此。该端口可以处理哪些类型的地址?
此答案适用于 Haswell 和 Skylake (/Kaby Lake / Coffee Lake)。未来的 ISA(Cannon Lake / Ice Lake)可用时必须进行检查。端口 7 AGU 在 Haswell 中是新的。
对于完全可以使用端口 7 的指令(例如不是 vextracti128
),任何非索引寻址模式 都可以使用端口 7。
这包括 RIP 相对和 64 位绝对(mov [qword abs buf], eax
,即使在 PIE 可执行文件中加载超过 2^32,所以地址确实不适合 32 位),以及正常 [reg + disp0/8/32]
或绝对 [disp32]
.
索引寄存器总是阻止使用端口 7,例如[rdi + rax]
,或 [disp32 + rax*2]
。甚至 [NOSPLIT disp32 + rax*1]
也不能使用端口 7(因此 HSW/SKL 不会在内部将 scale=1 且没有基址寄存器的索引转换为 base+disp32 寻址模式。)
我在 Skylake i7-6700k 上用 ocperf.py stat -etask-clock,context-switches,cpu-migrations,page-faults,cycles,instructions,uops_dispatched_port.port_2,uops_dispatched_port.port_3,uops_dispatched_port.port_7 ./testloop
测试了自己。
[+0, +2047]
位移范围对商店没有影响:mov [rsi - 4000], rax
可以使用端口 7。
具有小正位移的非索引负载的延迟降低 1c。英特尔的优化手册中没有提到商店的特殊情况。 Skylake 的可变延迟存储转发(当负载试图在存储后立即执行时延迟更差)使得构建包含存储延迟但不受存储地址微指令与负载竞争更少的微基准测试变得困难端口。我还没有想出一个微基准测试,它通过存储地址 uop 而不是通过存储数据 uop 带有循环携带的依赖链。大概是可能的,但可能需要一个数组而不是单个位置。
有些指令根本不能使用port7:
vextracti128 [rdi], ymm0, 0
包含存储地址 uop(当然),但它只能在端口 2 或端口 3 上 运行。
Agner Fog 的指令表在这里至少有一个错误:他将 pextrb/w/d/q
列为仅 运行ning p23 上的存储地址 uop,但实际上它可以使用 p237 中的任何一个在 HSW/SKL.
我还没有对此进行详尽的测试,但是 我发现 HSW 和 SKL 之间的一个区别1 是 VCVTPS2PH [mem], xmm/ymm, imm8
。 (指令更改为使用更少的 ALU 微指令,因此这并不表示 HSW 和 SKL 之间的 p7 发生了变化)。
在 Haswell 上:
VCVTPS2PH
是 4 uops(融合和非融合域):p1 p4 p5 p23(Agner Fog 是对的)。在 Skylake 上:
VCVTPS2PH xmm
是 2 个融合/3 个未融合的微指令:p01 p4 p237在 Skylake 上:
VCVTPS2PH ymm
是 3 个融合/3 个未融合的微指令:p01 p4 p237(Agner Fog 将
VCVTPS2PH v
列为 3F/3U(两个矢量宽度的一个条目),缺少与 xmm 版本的微融合,并错误地将端口故障列为 p01 p4 p23)。
总的来说,请注意 Agner 最近的更新似乎有点草率,例如 copy/paste 或拼写错误(例如,Ryzen vbroadcastf128 y,m128
吞吐量为 5 而不是 0.5)。
1:HSW 测试是在一台不再可用的旧笔记本电脑上进行的(我用它的 RAM 升级了另一台仍然经常使用的机器)。我没有要测试的 Broadwell。这个答案中的所有内容在 Skylake 上绝对正确:我刚才仔细检查过。我不久前在 Haswell 上测试了其中的一些内容,并且仍然保留着我的笔记。