GPU Microarch 学习笔记【2】Unified Memory

目录

1. M3 Dynamic Caching

2. Unified Memory

3. Unified Memory是如何处理page fault的

4. Unified Memory Page Fault的相关论文

M3 Dynamic Caching


最新的Apple M3 芯片最亮眼的可能是支持dynamic caching,如下图所示。

具体说来就是传统的GPU分配内存时,不是实时的分配内存,而是在一开始就分配好固定大小的内存,这时分配的内存是按照任务需要内存上限分配的,M3新支持的dynamic caching,可以支持GPU实时的分配内存,提高了内存的利用率,因为内存的使用就像上面的图片,有波峰和波谷。

但是这个应该是叫做dynamic allocation of memory,为什么叫做caching,个人理解可能是因为内存的分配也可以看作是caching,不过是按照page的颗粒度,将需要的页缓存在memory中,内存满时,也要将选作eviction的脏页写回disk,类似于脏的数据块64B写到下一级,不同的是此时颗粒度是4KB。

Apple M3介绍自己是业界首创,但是看着这更像是一个早就该有的基本功能,于是去看看Nvidia有没有类似的技术。

Unified Memory


传统的cuda教学课教的是在CPU malloc内存分配数据块,在GPU cudaMalloc数据块,然后将数据块从CPU内存拷贝到GPU内存,启动kernel的计算,这样的程序写起来比较复杂,更像是操作外设。

Nvidia在CUDA中引入了Unified Memory,将CPU内存和GPU内存视为一个大内存:

  • CUDA4引入了Unified Virtual Addressing可以访问一个pinned在CPU内存中的memory

  • CUDA6 引入了Unified Memory, CPU和GPU可以同时访问整个内存,但是不能同时访问一页内存,并且Unified Memory仅限于GPU memory的大小

  • CUDA8 增加了虚拟寻址的范围到49bit,并且支持了page fault。通过page fault,GPU可以实现像CPU一样的按需分配。

这样理想的情况下,CUDA的编写不再需要手动的在CPU和GPU侧分配内存,拷贝内存,kernel执行完毕后再拷贝回来,而是可以直接共享memory的指针。此外这个也可以减少CUDA对指针,链表,树,图这种需要深拷贝的内存的编程复杂度。

我们介绍最新的基于按需分配demand paging的unified memory,这个概念很像M3说的dynamic caching。

Unified Memory是如何处理page fault的


这里的demand paging的概念和CPU的相同,就是访问页时,发生page fault,然后获取page,也被称为memory oversubscription,但是与CPU不同,因为GPU没有处理precise exception的能力,也没有处理page fault的能力。当一个warp的遇到page fault时,GPU可以:

  • 暂停所有warp的执行

  • 或者暂停当前warp的执行,调度其他可以执行的warp

显然第一种代价更大,因此GPU按照第二种执行,内部也就需要存放一个page fault queue。而后具体的处理page fault,搬运page的操作,超出了GPU的能力范围,需要CPU执行或者CPU发送命令到GPU执行。

具体的流程:

  • GPU内部单元向TLB发起虚实地址转换请求,TLB miss,而后在GPU MMU page walk,查询页表,依然miss后,触发page fault。

  • GPU MMU向内部单元发送该地址翻译失败响应,挂起该warp。

  • GPU将page fault存到page fault queue中,向CPU发起page fault异常请求。

  • CPU执行GPU runtime程序从page fault queue中读取page fault的请求,不同于CPU处理CPU page fault的直接处理方式,GPU可能会同时发生多个page fault,于是:

    • 对page fault queue中的地址进行排序sort

    •  Sort之后,方便在CPU的页表中进行查找

  • 不同于CPU处理CPU page fault的另一点是,不仅会处理GPU的page fault对应的页,也会进行prefetch其他的页,预取一些页进入GPU内存,提高page fault的利用效率

  • 而后根据该page的属性,CPU需要unmap这个page,将该页放到GPU的内存中,同时在GPU的页表中增加这个page,并flush 这个GPU uTLB

  • 完成上述操作后,GPU才可以重新将page fault的warp重新调度

上述操作如下图左侧所示:

图源自[4]

这个过程十分繁琐,如果此时GPU的内存已满,还需要将GPU中的一页evict到CPU中,如上图右侧所示。

为了保证页表的顺序更新,evict旧页操作和fetch新页的操作还需要顺序执行,如下图所示,需要PageX被eviction之后,pageA才能allocation。

Unified Memory 处理Page Fault相关论文


最开始提出这个unified memory的论文[1],做出的贡献是

  • 每次page fault不是只处理一个页,而是将page fault放入queue中

  • 每次处理多个page fault时,因为时间比较长,因此可以同时增加prefetch,提高性能,他提供了sequential prefetch和random prefetch

后来的论文[2]发现GPU处理evict和fetch的操作是顺序的,以保证正确性,因此他们提出可以在中断处理时,先evict一个页,因为GPU内存向CPU内存写,比读要快,因此evict和fetch操作可以并行执行。

同时该论文还提出了我们还可以增加thread oversubscription,这样当所有的thread都page fault时,可以调度其他的thread block进入,类似于CPU的context switch。

Nvidia的GPU的prefetcher提供一种Tree Based Prefetcher,但是evict时使用的是LRU策略,有的论文[3]为了改进,也增加了tree based eviction的策略。

[1] Towards High Performance Paged Memory for GPUs
[2] Batch-Aware Unified Memory Management in GPUs for Irregular Workloads
[3] Interplay between Hardware Prefetcher and Page Eviction Policy in CPU-GPU Unified Virtual Memory
[4]https://developer-blogs.nvidia.com/wp-content/uploads/2021/09/Page-fault-service-data-eviction.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: xilinx_unified_2020.2_1118_1232是指Xilinx公司于2020年2月发布的软件版本,该版本的编译日期为2020年11月18日,编译时间为12:32。这个版本的Xilinx软件包含了数个工具,其中最主要的是Vivado和Vitis软件。 Vivado是一种用于设计、验证和实现可编程逻辑设备(FPGA)和系统级集成电路(SoC)的综合工具。使用Vivado可以设计FPGA和SoC的硬件,并且可以进行逻辑仿真、综合、验证和实现等一系列步骤。 而Vitis是一种针对嵌入式CPU器件的软件套件,它可以加速开发过程,简化嵌入式软件和硬件的开发,以便更快地将产品推向市场。 总之,xilinx_unified_2020.2_1118_1232是Xilinx在2020年发布的集成软件版本,它提供了丰富的工具和资源,以帮助设计人员更快、更有效地完成计算和开发工作。 ### 回答2: xilinx_unified_2020.2_1118_1232是指赛灵思公司2019年发布的第二个综合性设计软件版本。它包括了新的工具和功能,以支持开发人员在嵌入式系统和高级互联应用领域进行设计、验证和部署。该软件提供了一个统一的设计环境,可以更好地处理不同级别的设计和验证。 该版本的最大亮点是Scala语言的支持。Scala是一种基于Java的面向对象静态类型编程语言,能够支持函数式编程和并发式编程。使用Scala可以提高开发人员的效率,同时也可以提高程序的可维护性和可重用性。 此外,该版本还引入了新的多处理器软件开发套件,包括了操作系统、驱动程序和应用程序的源代码,可以协助开发人员快速构建高性能的软件系统。 总的来说,xilinx_unified_2020.2_1118_1232是一款功能强大的设计软件,可以有效提高开发人员的工作效率和设计品质。它不仅可以满足各种高级互联应用的需求,而且还具备极强的扩展性和可定制性,可以满足不同公司和个人的需求。 ### 回答3: xilinx_unified_2020.2_1118_1232是指2020年11月18日发布的Xilinx Unified软件版本,其版本号为2020.2,而后面的数字1118和1232可能是该版本中的修复或增强功能的编号。Xilinx Unified是Xilinx公司的一款软件工具套件,用于设计FPGA、SoC、MPSoC等硬件系统。它包括了许多工具,如Vivado Design Suite、Vitis等,用于构建、仿真、验证、调试和部署这些系统。Xilinx Unified的特点是集成度高,用户可以在同一界面下完成多种工作,从而提高设计效率和设计质量。此外,Xilinx Unified还提供了丰富的文档和社区支持,帮助用户解决各种问题和挑战。总之,xilinx_unified_2020.2_1118_1232是Xilinx Unified软件的一个版本号,它代表了Xilinx公司对FPGA和SoC设计领域的不断创新和发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值