Processing In/near Memory

缘由

  1. 指令为中心,数据移动带来的功耗墙,性能墙
  2. 内存计算的经典模式
    1. 3D的内存技术
      1. Through silicon vias
    2. ReRAM 新型结构

PIM分类

  1. 按照PIM core和memory的距离分类

  2. 新的内存工艺使得内存的最小电路单元具有计算能力(忆阻器)

  3. 基于现有的商业DRAM和处理器的设计(加速的上限低一些,但是落地推广应用的阻力也越小, 应用范围更广,编程困难低)

  4. 基于3D堆叠memory(HMC)的设计(Starting from HMC 2.0, it supports the execution of
    18 atomic operations in its logic layer.)

    1. 在每个最小存储单元融入计算能力(可以结合忆阻器)
    2. 完整的处理器核,有cache hierarchy
    3. 简单一点的应用相关的硬件计算单元
    4. 或者更简单的Functional Units (FUs)

关键技术

  1. 传统器件
    1. 地址翻译
      1. 三种不同解决思路
        1. 全部由CPU负责指令的发射和翻译
        2. 使能PIM侧页表管理,翻译机制
        3. 物理地址空间隔离(交互时需要拷贝),PIM独立管理地址空间
    2. 数据映射
      1. 物理内存地址排列的冲突(比如 GPUbank)
        1. CPU高带宽访存(会把数据分散来实现高带宽) vs PIM空间局部性(连续数据会跨多个颗粒)
      2. 纯软件方案或者软硬件结合大方案
    3. 安全性
      1. 物理内存被暴露在PIM core下,需要新的机制来确保内存安全。
    4. 数据一致性
      1. 现有一致性协议拓展差
      2. 核数量超级多,成千上万
      3. 解决方法
        1. 内存空间隔离,避免共享
        2. 弱化一致性问题,只处理特殊条件下一致性(eg.任务迁移)
        3. 批量处理一致性请求
  2. 新型器件
    1. 计算误差
    2. 外围电路大
    3. 异构编程模型
  3. 应用场景和编程模型
    1. 高能效比
    2. 高并行和NUMA访问
    3. 识别PIM函数的条件(什么函数适合用PIM做)
      1. 在所有函数中能耗最高
      2. 数据移动占据应用大比例,或者说是唯一的
      3. 访存密集型(通过LLC miss rate来判断)

根据PIM距离Memory的距离分成三类

  1. NDP GPU

论文1

https://arxiv.org/pdf/2110.01709.pdf

论文2

hardware architecture and software stack for pim based on commercial dram technology

论文3

pim-enabled instructions a low-overhead locality-aware processing-in-memory architecture

论文4

展望





问题

  1. 由于核很小,不支持OS
  2. 但是可以支持message pass(reduce等)
  3. HPC应用经过数学变化后有些变成稀疏计算的,这时候变成memory-bound。所以PIM减少了数据移动,这时提升比较大。
  4. PIM的优势在于能效比,功耗的降低。而不是绝对性能。
  5. 单chip多核怎么通过PIM的思想,软件调度来实现?(不就是减少数据移动,和更近)

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

CPU vs GPU

GPU vs CPU

CPU: latency-oriented design

低延时的设计思路

  1. large L1 caches to reduce the average latency of data
  2. 时钟周期的频率是非常高的,达到3-4GHz
  3. Instruction-level parallelism to compute partial results ahead of time to further reduce latency
    1. 当程序含有多个分支的时候,它通过提供分支预测的能力来降低延时。
    2. 数据转发。 当一些指令依赖前面的指令结果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置并且尽可能快的转发一个指令的结果给后续的指令。

相比之下计算能力只是CPU很小的一部分。擅长逻辑控制,串行的运算。

GPU: throughput-oriented design

大吞吐量设计思路

  1. GPU采用了数量众多的计算单元和超长的流水线
  2. 但只有非常简单的控制逻辑
  3. 几乎省去了Cache。缓存的目的不是保存后面需要访问的数据的,减少cache miss。这点和CPU不同,而是为thread提高服务的。
  4. GPU “over-subscribed” threads: GPU运行任务会启动远超物理核数的thread,原因是借助极小的上下文切换开销,GPU能通过快速切换Threads/warps来隐藏访存延迟。
    1. GPU线程的创建与调度使用硬件而不是操作系统,速度很快(PowerPC创建线程需要37万个周期)[^1]
    2. Cost to switch between warps allocated to a warp scheduler is 0 cycles and can happen every cycle.[^2]

对带宽大的密集计算并行性能出众,擅长的是大规模并发计算。

对比项 CPU GPU 说明
Cache, local memory 低延时
Threads(线程数)
Registers 多寄存器可以支持非常多的Thread,thread需要用到register,thread数目大,register也必须得跟着很大才行。
SIMD Unit 单指令多数据流,以同步方式,在同一时间内执行同一条指令

DRAM vs GDRAM

其实最早用在显卡上的DDR颗粒与用在内存上的DDR颗粒仍然是一样的。后来由于GPU特殊的需要,显存颗粒与内存颗粒开始分道扬镳,这其中包括了几方面的因素:

  1. GPU需要比CPU更高的带宽 GPU不像CPU那样有大容量二三级缓存,GPU与显存之间的数据交换远比CPU频繁,而且大多都是突发性的数据流,因此GPU比CPU更加渴望得到更高的显存带宽支持。位宽×频率=带宽,因此提高带宽的方法就是增加位宽和提高频率,但GPU对于位宽和频率的需求还有其它的因素。
  2. 显卡需要高位宽的显存显卡PCB空间是有限的,在有限的空间内如何合理的安排显存颗粒,无论高中低端显卡都面临这个问题。从布线、成本、性能等多种角度来看,显存都需要达到更高的位宽。 3090是384位。而内存则没有那么多要求,多年来内存条都是64bit,所以单颗内存颗粒没必要设计成高位宽,只要提高容量就行了,所以位宽一直维持在4/8bit。
  3. 显卡能让显存达到更高的频率显存颗粒与GPU配套使用时,一般都经过专门的设计和优化,而不像内存那样有太多顾忌。GPU的显存控制器比CPU或北桥内存控制器性能优异,而且显卡PCB可以随意的进行优化,因此显存一般都能达到更高的频率。而内存受到内存PCB、主板走线、北桥CPU得诸多因素的限制很难冲击高频率。由此算来,显存与内存“分家”既是意料之外,又是情理之中的事情了。为了更好地满足显卡GPU的特殊要求,一些厂商(如三星等)推出了专门为图形系统设计的高速DDR显存,称为“Graphics Double Data Rate DRAM”,也就是我们现在常见的GDDR。

内存频率

1
2
sudo dmidecode|grep -A16 "Memory Device"|grep "Speed"
Speed: 2666 MT/s

显存等效频率

因为显存可以在一个时钟周期内的上升沿和下降沿同时传送数据,所以显存的实际频率应该是标称频率的一半。

从GDDR5开始用两路传输,GDDR6采用四路传输(达到类似效果)。

GDDR6X的频率估计应该至少从16Gbps(GDDR6目前的极限)起跳,20Gbps为主,这样在同样的位宽下,带宽比目前常见的14Gbps GDDR6大一半。比如在常见的中高端显卡256bit~384位宽下能提供512GB/s~768GB/s的带宽。

RTX 3090的GDDR6X显存位宽384bit,等效频率19Gbps到21Gbps,带宽可达912GB/s1006GB/s,达到T级。(384*19/8=912)

RTX 3090 加速频率 (GHz) 1.7, 基础频率 (GHz) 1.4

1
2
19/1.4 = 13.57
21/1.7 = 12.35

消费者设备 GDDR6x DDR4 的带宽对比

  • 上一小节 RTX 3090 带宽在912GB/s1006GB/s 附近
  • DRAM Types 一文里有分析,个人主机插满4条DDR4带宽” 3.2 Gbps * 64 bits * 2 / 8 = 51.2GB/s

可见两者差了20倍左右。

GPU / CPU workload preference

通过上面的例子,大致能知道: 需要高访存带宽和高并行度的SIMD的应用适合分配在GPU上。

最佳并行线程数

$$ 144 SM * 4 warpScheduler/SM * 32 Threads/warps = 18432 $$

参考文献

https://zhuanlan.zhihu.com/p/156171120?utm_source=wechat_session

https://www.cnblogs.com/biglucky/p/4223565.html

https://www.zhihu.com/question/36825227/answer/69351247

https://baijiahao.baidu.com/s?id=1675253413370892973&wfr=spider&for=pc

https://zhuanlan.zhihu.com/p/62234511

https://kknews.cc/digital/x6v69xq.html

[^1]: 并行计算课程-CUDA 密码pa22