# Manycore 处理器架构分析

## 参考文档

- [Intel® Many Integrated Core Architecture (Intel® MIC Architecture) - Advanced](<https://openlab-mu-internal.web.cern.ch/02_Press_Corner/Spotlights/Spotlights_items/Copies_of_Spotlights_items/2011/ManyIntegratedCore(MIC)ArchitectureAdvanced.pdf>)
- [Intel® Xeon Phi coprocessor (codename Knights Corner)](<https://ieeexplore.ieee.org/abstract/document/7476487>)
- [https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=7453080](<https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=7453080>)
- [Knights Landing (KNL): 2nd Generation Intel® Xeon Phi™ Processor](<https://www.alcf.anl.gov/files/HC27.25.710-Knights-Landing-Sodani-Intel.pdf>)
- [Fujitsu A64FX](<https://en.wikipedia.org/wiki/Fujitsu_A64FX>)
- [Fujitsu Presents Post-K CPU Specifications](<https://www.fujitsu.com/global/about/resources/news/press-releases/2018/0822-02.html>)
- [Fujitsu High Performance CPU for the Post-K Computer](<https://web.archive.org/web/20201205202434/https://hotchips.org/hc30/2conf/2.13_Fujitsu_HC30.Fujitsu.Yoshida.rev1.2.pdf>)
- [SUPERCOMPUTER FUGAKU - SUPERCOMPUTER FUGAKU, A64FX 48C 2.2GHZ, TOFU INTERCONNECT D](<https://www.top500.org/system/179807/>)
- [Preliminary Performance Evaluation of the Fujitsu A64FX Using HPC Applications](<https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;arnumber=9229635>)
- [FUJITSU Processor A64FX](<https://www.fujitsu.com/downloads/SUPER/a64fx/a64fx_datasheet.pdf>)
- [NVIDIA A100 Tensor Core GPU Architecture](<https://images.nvidia.cn/aem-dam/en-zz/Solutions/data-center/nvidia-ampere-architecture-whitepaper.pdf>)
- [NVIDIA TESLA V100 GPU ARCHITECTURE](<https://images.nvidia.cn/content/volta-architecture/pdf/volta-architecture-whitepaper.pdf>)
- [NVIDIA A100 TENSOR CORE GPU](<https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/a100/pdf/nvidia-a100-datasheet-us-nvidia-1758950-r4-web.pdf>)

## Xeon Phi - Intel MIC

MIC: Many Integrated Core Architecture

Knights Corner:

4 路 SMT，AVX512 指令，32 KB L1I，32 KB L1D，每核心 512KB L2，乱序执行，一条 512 位计算流水线，每个周期双精度性能 `512 / 64 * 2 = 16 FLOP/cycle`。61 核 1.053GHz 双精度性能是 `16 * 61 * 1.053 = 1028 GFLOPS`。

向量寄存器分为四组，每组 128 位，两个 DP/四个 SP。SP 和 DP 计算共享乘法器，来优化面积。

Knights Landing:

核心：4 路 SMT，AVX512 指令，乱序执行，两条 512 位计算流水线，每个周期双精度性能 `512 / 64 * 2 * 2 = 32 FLOP/cycle`，如果是 64 核 1.3 GHz，总双精度性能是 `32 * 64 * 1.3 = 2662 GFLOPS`。一共 36 个 Tile，每个 Tile 有 2 Core + 2 VPU/core + 1MB 16-way L2，最大 72 个核心。

内存：6-channel 384GB DDR4 2400 RAM（理论 `2400 * 6 * 8 = 115.2 GB/s`），8-16GB 3D MCDRAM（400+ GB/s）。

## Fujitsu A64FX

内存：4 组，每组 8GB HBM2，带宽 256 GB/s（`1024 bit * 2G`），总共 32GB HBM2，带宽 1TB/s。Cache Line 大小 256 B。

核心：4 个 NUMA Node（Core Memory Group），每个 NUMA Node 包括 12 计算核，有 8MB 16 路的 L2 Cache。总共 48 计算核，4 辅助核。

指令集：ARMv8.2+SVE，512 位向量宽度，乱序执行，两个浮点流水线和两个整数流水线，每个周期双精度性能 `512 / 64 * 2 * 2 = 32 FLOP/cycle`，主频 2.2 GHz，按主频算理论双精度浮点性能 `32 * 2.2 * 48 = 3.4 TFLOPS`。文档里写的是双精度浮点性能 2.7 TFLOPS，单精度 5.4 TFLOPS，半精度 10.8 TFLOPS，8 位整数 21.6 TOPS，应该是按照实际测出来的算。TOP 500 配置是 7630848 核，对应 `7630848 / 48 = 158976` 个节点，Rpeak 是 `537212 TFLOPS`，那么每个节点是 `537212 / 158976 = 3.38 TFLOPS`，和上面的 3.4 接近。Linpack 跑出来的 Rmax 是 442010 TFLOPS，每个节点是 `442010 / 158976 = 2.78 TFLOPS`，和文档里说的比较接近。

部分主要特性：

- Four-operand FMA: ARM FMA 指令只能是 `R0=R0+R1*R2`，A64FX 可以合并 `R0=R3,R0=R0+R1*R2` 两条为一条 `R0=R3+R1*R2` 指令
- Gather/Scatter: 非连续访存，同一个 128B 内连续的 lane 可以合并访问，如果数据有局部性的话，可以得到两倍带宽

## NVIDIA GPU

| 型号 | 工艺 | Peak DP(TFLOPS) | 功耗 (W) | 性能功耗比 (TFLOPS/W) |
| --- | --- | --- | --- | --- |
| P100 | 16 nm FinFET+ | 4.7 | 250 | 0.019 |
| V100 | 12 nm FFN | 7 | 250-300 | 0.023-0.028 |
| A100 | 7 nm N7 | 9.7 | 250-400 | 0.024-0.039 |

| 型号 | 内存容量 (GB) | 内存带宽 (GB/s) | 内存类型 | L2 缓存大小 | 寄存器堆大小 |
| --- | --- | --- | --- | --- | --- |
| P100 | 12-16 | 549-732 | 4096 bit HBM2 | 4096 KB | 14336 KB |
| V100 | 16-32 | 900 | 4096 bit HBM2 | 6144 KB | 20480 KB |
| A100 | 40-80 | 1555-2039 | 5120 bit HBM2 | 40960 KB | 27648 KB |

| 型号 | SM 数量 | CUDA 核心数 | FP64 核心数 | SM 频率 (MHz) |
| --- | --- | --- | --- | --- |
| P100 | 56 | 3584 | 1792 | 1328 |
| V100 | 80 | 5120 | 2560 | 1380 |
| A100 | 108 | 6912 | 3456 | 1410 |

- CUDA 核心数 = SM 数量 \* 64
- FP64 核心数 = SM 数量 \* 32
- Peak DP = FP64 核心数 \* SM 频率 \* 2
- 寄存器堆大小 = SM 数量 \* 256 KB
