神威太湖之光 系统分析
内存子系统
0. 推荐阅读
1. 神威太湖之光简介
- 每个节点有2片SW26010处理器
- 每片SW26010有4个CGs(核组, Core-Groups)
- 每个CG有1个MPE(主核, 运算控制核心, Management Processing Element)
- 每个CG有8x8=64个CPEs(从核, 运算核心, Computing Processing Elements)
讲道理这SW26010确实像把4片PS3上的IBM Cell处理器用胶水糊在了一起
2. Cache
主核存储系统:
| 存储器 | 容量 |
|---|---|
| L1 Cache | 指令32KB 数据32KB |
| L2 Cache | 512KB |
从核存储系统:
| 存储器 | 容量 |
|---|---|
| L1 Cache | 指令16KB |
| L2 Cache | CG内共享指令64KB |
| Scratch Pad Memory | 64KB |
这SPM真的是和Cell处理器一毛一样了,现在我也能感受PS3开发者的恐惧了www
PS: cache是由硬件控制,对程序员不可见,其实我们只需要榨干Scratch Pad Memory
3. 访存延迟
| 项目 | Cycle |
|---|---|
| 主核到L1 | 4 |
| 主核到L2 | 13 |
| 主核到主存 | 154 |
| 主核到LDM | 94 |
| 从核到主存 | 177-278 |
| 从核到自己的LDM | 4 |
| 从核到其他核的LDM | 10 |
| LDM到主存(DMA方式) | 25 |
| 从核行广播 | 14 |
| 从核列广播 | 14 |
官网的文档,直接说,这部分的描述就是一坨狗屎,还好找到了CPC2018的培训资料
4. 存储模型
SW26010运算核心的用户虚空间分为
LDM空间和主存空间,主存空间进一步可以分为系统区、用户连续区和用户交叉区。
| 虚空间内存地址 | 主核 | 从核 | C语言修饰 |
|---|---|---|---|
| 0x00 0000 0000 | 系统连续(可Cache) | LDM空间 | __thread_local __thread __thread_local_fix __thread_local_kernel |
| 0x20 0000 0000 | 用户私有连续(可Cache) | 用户私有连续 | __thread |
| 0x4F F000 0000 | 用户共享连续(可Cache)(只读) | 用户共享连续(只读) | 不加修饰 |
| 0x50 0000 0000 | 用户共享连续(可Cache)(读写) | 用户共享连续(读写) | 不加修饰 |
| 0x60 0000 0000 | 用户共享交叉(不可Cache) | 用户共享交叉 | __thread_group |
| 0x80 0000 0000 | 核组IO空间 | ? | ? |
| 0xA0 0000 0000 | 芯片IO空间 | ? | ? |
OpenACC内存模型:
| 空间名称 | 存储位置 | OpenACC修饰 |
|---|---|---|
| 主线程数据空间 | 主存 | 加速区外定义的变量 |
| 加速线程私有空间 | 主存 | private firstprivate |
| 加速线程本地空间 | LDM | local copy 等 |
5. DMA
DMA命令模式
| 命令模式 | 代码 |
|---|---|
| 单运算核心模式 | PE_MODE |
| 广播模式 | BCAST_MODE |
| 行模式 | ROW_MODE |
| 广播行模式 | BROW_MODE |
| 行集合模式 | RANK_MODE |
好了官方文档的作者估计写到这里饿了,又开始写得不清不楚了,还好我大Google帮我找到了高级优化技术进阶