Sandy Bridge 微架构提供了 AVX 原生的优化架构,为了支持 AVX 指令的 256 位计算,Sand Bridge 新增了 256 位的处理单元,见下图:

使用 iaca 工具观察下面的实验输出:
|
| Num of | Ports pressure in cycles | | | Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | | ------------------------------------------------------------ | 1 | | | 1 | | | | | | | | vaddps ymm1, ymm2, ymm3 | 1 | | | | | | | | | 1 | | vandps ymm1, ymm2, ymm3 | 1 | | | | | | | | | 1 | | vblendps ymm1, ymm2, ymm3, 0x0 | 2^ | | | | X | X | 1 | 1 | | 1 | | vbroadcastf128 ymm1, xmmword ptr [rax] | 2 | | | 1 | | | | | | 1 | | vcvtpd2ps xmm1, ymm2 | 1 | | | 1 | | | | | | | | vcmpps ymm1, ymm2, ymm3, 0x0 | 3 | 3 | 28 | | | | | | | X | CP | vdivps ymm1, ymm2, ymm3 | 1 | | | | | | | | | 1 | | vextractf128 xmm1, ymm2, 0x0 | 1 | | | | | | | | | 1 | | vinsertf128 ymm1, ymm2, xmm3, 0x0 | 1^ | | | | X | X | 1 | 1 | | | | vlddqu ymm1, xmmword ptr [rax] | 3^ | 1 | | X | 1 | | X | | 2 | | | vmaskmovps ymmword ptr [rax], ymm1, ymm2 | 1 | | | | 1 | 2 | X | X | | | | vmovaps ymm1, ymmword ptr [rax] | 1 | | | | | | | | | 1 | | vmovaps ymm1, ymm2 | 1 | 1 | | | | | | | | | | vmulps ymm1, ymm2, ymm3 | 1 | | | | | | | | | 1 | | vpermilps ymm1, ymm2, 0x0 | 1 | | | | | | | | | 1 | | vperm2f128 ymm1, ymm2, ymm3, 0x0 | 1 | 1 | | | | | | | | X | | vpunpcklqdq xmm1, xmm2, xmm3 | 1 | | | 1 | | | | | | | | vroundps ymm1, ymm2, 0x0 | 1 | | | | | | | | | 1 | | vshufps ymm1, ymm2, ymm3, 0x0 | 1 | | | 1 | | | | | | | | vsubps ymm1, ymm2, ymm3 | 1 | | | | | | | | | 1 | | vunpcklps ymm1, ymm2, ymm3 | 0* | | | | | | | | | | | vzeroupper |
我们可以看到 Sandy Bridge 对 AVX 指令分配执行端口的情况:
| vmovaps ymm1, ymmword ptr [rax] |
如上面这条指令从内存中 load 256 位数据,那么它将使用到端口 2 或者端口 3 进行两次 load 操作(花费 2 cycle),同时还需要经过 AGU 单元产生内存地址值,它最终将花费 2 cyles
从上面我们还可以看到,vdivps 指令的执行需要 28 个 cycle,而 vmulps 仅需要 1 cycle,说明端口 0 是原生的 256 位 multiply 端口。在端口 5 进行的各种数据杂项进行处理和端口 1 的 add/subtract 运算都是仅需要 1 cycle,而数据的 load/store 则需要最多 2 个 cycles(对于 256 位的数据)。