https://mp.weixin.qq.com/s?__biz=MzUxNzQ5MTExNw==&mid=2247493955&idx=1&sn=0e880f3d509f0b494287cb552cbdb236&poc_token=HF2xLWmjmxWlcvjIU63EIfOVEH3oFUhAvGjpKTTY

TL;DR

其实很多人在谈论ScaleUP和ScaleOut总线的时候, 更多的是在谈论网络这一块, 少了GPU Memory Model的视角. 另一方面老黄讲的:“先要ScaleUP,然后再ScaleOut”,其实上你可以理解成一个销售的话术, 反问一句NV在ScaleOut上今年GTC有啥拿的出手的东西呢?IB交换机都没了声响, 以太网交换机和网卡在RoCE上还有大量的问题...这是实质性的问题. 抛开这些, 其实本质的问题还是在内存上.

image.png

那么今天就做一些笔记,把Nvidia GPU和内存相关的问题从头到尾好好整理一下. 正好GTC25有一个Session**《CUDA Techniques to Maximize Memory Bandwidth and Hide Latency》[1], 还找到一个GTC24的Session《Advanced Performance Optimization in CUDA》[2]**

再配合Blackwell Tensor Memory引入而产生的内存模型的变化, 和Tile based IR等一系列因素进行一个汇总分析, 恰逢华为UB发布, UALink 1.0标准也发布了, 最后再来谈谈ScaleOut和ScaleUP的内存模型的需求.顺便会谈一下eRDMA在多路径时对于内存模型的实现并对比标准RC和AWS SRD.

另外GTC25的这个session还有两个非常有价值的话题, 低延迟Cluster同步和如何最大化内存带宽, 也会一并介绍, 本文结构如下:

1. 内存一致性模型
1.1 从一个基础的例子谈起
1.2 顺序一致性
1.3 Total Store Order
1.4 Relaxed Consistency
1.5 Cache一致性和Memory Model的区别

2. Nvidia GPU Memory Model
2.1 Single Thread
2.2 Multi-Thread
2.2.1 顺序一致性(SC)
2.2.2 Acquire
2.2.3 Release
2.2.4 Relaxed
2.2.5 Scope
2.3 Async Thread
2.4 Async Proxy

3. 利用memory order实现低延迟Cluster同步
3.1 Thread Block Cluster编程
3.2 Cluster低延迟同步
3.3 基于DSMEM的组播

4. 最大化内存带宽
4.1 回顾内存层次化结构
4.2 Little's Law
4.3 并行优化及异步访问

5. LD/ST指令控制Cache
5.1 LD指令
5.2 ST指令

6. ScaleUP和ScaleOut网络设计探讨
6.1 谈谈访问内存的Size
6.2 访问内存延迟
6.3 Memory Model

1. 内存一致性模型

一致性的本源来自于冯诺伊曼架构中认为:"任何的读操作应当返回最近写入的结果",但是在分布式系统中或者多核CPU系统中, 由于操作的延迟等因素带来了结果的不可预测性。

1.1 从一个基础的例子谈起

upenn有一个Sequential Consistency and TSO教程[3]讲的挺好的. 还有一个[SPCL的**Memory Model4]**的ppt也不错, 更详细的内容可以读读下面这本书

image.png

首先我们来看有两个Core的处理器, 一个做Producer,一个做Consumer的情况

image.png

是否r2能够获得Core1产生的新的数据呢? 实际执行的时候, 例如Core1的S1和S2出现了ReOrder的情况, 那么Core2的L1会使得L2更早执行, 从而r2拿到老的数据.

image.png

其实发生Reorder的情况有几类:

image.png

1.2 顺序一致性