2. Sandy Bridge 微架构对 AVX 指令的优化


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

2.1 Sandy Bridge 微架构改进和新增了一些部件,实现多样功能

2.2 各端口对数据的处理

使用 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 指令分配执行端口的情况:

从上面我们还可以看到,vdivps 指令的执行需要 28 个 cycle,而 vmulps 仅需要 1 cycle,说明端口 0 是原生的 256 位 multiply 端口。在端口 5 进行的各种数据杂项进行处理和端口 1 的 add/subtract 运算都是仅需要 1 cycle,而数据的 load/store 则需要最多 2 个 cycles(对于 256 位的数据)。


版权 mik 所有,转载请注明出处