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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/140744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的SQL预编译及防SQL注入

文章目录 1 SQL语句的执行处理1.1 即时SQL1.2 预处理SQL1.2.1 预编译SQL的实现步骤1.2.2 预编译SQL的C使用举例1.2.3 MYSQL_BIND()函数中的参数类型: 2 SQL注入2.1 什么是SQL注入2.2 如何防止SQL注入 1 SQL语句的执行处理 SQL的执行可大致分为下面两种模式&#xf…

计算机毕业设计选题推荐-课程学习微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Centos7 升级到 Centos8 教程以及关于dnf包管理工具的若干问题解决方案

目录 为什么升级一、参考文档二、升级步骤三、安装git编码错误缓存问题安装git依赖冲突问题解决办法 为什么升级 jenkins 2.4版本需要CentOS8 一、参考文档 点我 二、升级步骤 1.安装epel源 yum -y install epel-release2.安装rpmconf和yum-utils yum -y install rpmco…

基于RK3568的跑步机方案

I 方案简介 一、跑步机的来历 跑步机是家庭及健身房常备的健身器材,而且是当今家庭健身器材中最简单的一种,是家庭健身器的最佳选择。1965年北欧芬兰唐特力诞生了全球第一台家用的跑步机,设计师根据传速带的原理改变而成。 二、…

岗前酒精检测仪

岗前酒精检测仪:集“酒精检测智能测温人脸考勤”三合一智能检测仪。 酒精检测功能:采用电化学传感器检测检测酒精浓度,具有吹气中断及吹气流量侦测,吹气防欺骗设计,吹气温度及吸气侦测;响应时间≤20毫秒&am…

NIO的浅了解

一、五种IO类型 1、阻塞IO 用户进程一直等待数据准备好,在复制完成之前都是阻塞的 2、非阻塞IO 用户进程需要不断轮询查看是否数据准备好 优化了提升并发连接数量,但是每一个请求都需要创建一个socket建立连接,每个线程都需要去遍历轮询&am…

数字三角形模型 笔记

方格取数 走两次的最大值 f[k][i1][i2]来表示 k i1 j1 i2 j2; 每一个状态可由四种状态转换来,分别为 第一条路走下,第二条路走下 第一条路走下,第二条路走右 第一条路走右,第二条路走下 第一条路走右,第二条…

三国杀中的概率学问题4——曹冲

前言 这篇文章是围绕曹冲的称象技能展开的一些数学上的讨论,将涉及到积分、概率论等知识,并会做很多拓展。 值得说明的是,本文受到了这篇文章的一些启发。 连续情形1 先来看一个连续情形的问题。 问题一:假设每张牌的点数是0~1…

力扣刷题-二叉树-对称二叉树

101 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 思路 我的思路…

Unity--互动组件(Button)

1.组件的可交互 2.组件的过渡状态 3.组件的导航 4.组件的Event Button “”组件的可交互:“” Interactable: 该组件是否可点击(设置为false时,将禁用交互,并且过渡状态将设置为禁用状态);…

深入理解C++关联式容器:set、multiset、map和multimap详解

序列式容器 与 关联式容器 我们知道: C 中,我们将 vector、list、queue 这种底层为线性序列的数据结构叫做 序列式容器,其存储的就是元素本身。而 关联式容器 以键-值对的形式存储数据。每个键在容器中必须是唯一的,而值则与相应…

Windows没有USB启动选项很常见,但解决方法更常见

当试图在计算机上重新安装Windows 11/10操作系统,或从安装介质启动时,一些用户看到错误–系统没有任何USB启动选项,请在启动管理器菜单中选择其他启动选项。此错误出现在不同OEM的多个设备,原因包括启用了安全引导、禁用了Legacy/CSM支持、联想服务引擎、未正确制作可引导U…

本地化小程序运营 同城小程序开发

时空的限制让本地化的线上平台成为一种追求,58及某团正式深挖人们城镇化、本地化的信息和商业需求而崛起的平台,将二者结合成本地化小程序,显然有着巨大的市场机会。本地化小程序运营可以结合本地化生活需求的一些信息,以及激发商…

linux下使用Docker Compose部署Spug实现公网远程访问

📑前言 本文主要是linux下使用Docker Compose部署Spug实现公网远程访问的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &am…

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行,给用户带来困扰。那么,当我们遇到这个问题时,应该如何修复呢?下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…

【PWN · heap | unlink | free_hook】[SUCTF 2018 招新赛]unlink

在前期学习了unlink后,今天翻NSSCTF找到一道名为unlink的题目,尝试不看wp做。过程很顺利! 前言 题目对于知识点unlink还是非常裸的,很直接,思路很清晰。 一、题目 二、思路浅析 通过对该程序的反编译,我们…

前端案例-css实现ul中对li进行换行

场景描述: 我想要实现,在展示的item个数少于4个的时候,则排成一行,并且均分(比如说有3个,则每个的宽度为33.3%),如果item 个数大于4,则进行换行。 效果如下&#xff1a…

4.0 Linux进程前导知识

个人主页:Lei宝啊 愿所有美好如期而遇 冯.诺依曼体系 CPU:运算器,控制器 输入设备:键盘,麦克风,摄像头,鼠标,网卡,磁盘等。 输出设备:显示器&#xff0…

KMP算法理论

KMP算法理论 前缀:包含首字母不包含尾字母的都称为前缀 例如 前缀 后缀:只包含尾字母不包含首字母的的称为后缀 后缀 寻找最长相等的前缀和后缀 前缀表 所谓next数组就是前缀表,在遇到冲突时next数组会告诉我们要回退到哪里 next数组的不同…

Java基础-基础语法

1、概述 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;…