Vulkan 内存管理

一、简介

内存管理对开发者来说永远是一个沉重的话题。

现有的高级语言都在通过各种努力试图让开发者摆脱内存管理的复杂工作,专注于业务逻辑的开发。这样的做法对开发者是友好的,较低的语言门槛也能适应当前越来越快的敏捷开发的节奏。

但是,世上没有免费的午餐,任何事情都有代价。除了应用,没人更清楚应用的行为,有些应用需要大量的小内存,有些应用只需要少量的大内存,有些应用会频繁释放和分频内存资源,有些应用的内存生命周期则很长。面对复杂的应用场景,我们很难有一个统一的策略可以解决所有问题。不管是通过虚拟机还是驱动程序,帮助应用进行内存管理永远是低效的。

Vulkan将内存管理的工作交给了开发者自己负责,如何分配释放内存,怎样制定内存策略都由开发者自己决定,因为没人比开发者更清楚自己想做什么。

二、内存管理

Vulkan将内存划分为两大类:Host MemoryDevice Memory

Host是运行应用程序的处理器,在PC机上就是指CPU。

Device是执行Vulkan命令的处理器,在PC机上就是指GPU。

所以,Host memory指的是对Host可见的内存,Device memory指的是对Device可见的内存。

更详细的,Vulkan系统中的内存有四种类型:

  • Host Local Memory,只对Host可见的内存,通常称之为普通内存

  • Device Local Memory,只对Device可见的内存,通常称之为显存

  • Host Local Device Memory,由Host管理的,对Device看见的内存

  • Device Local Host Memory,由Device管理的,对Host可见的内存

并不是所有设备都支持这四种类型。一些嵌入式系统、移动设备甚至是笔记本电脑的GPU,可能与CPU共享内存控制器和内存子系统。这种情况它的内存只有一种类型,我们通常称之为unified memory architecture(统一内存架构)。

image-20200803154748739.png

2.1 Host Memory

Host Memory是CPU可以访问的常规内存,一般是通过调用malloc或new分配。

Vulkan API创建的对象通常需要一定数量的Host Memory,用来储存对象和数据结构。

Vulkan对Host Memory的要求就是内存地址是对齐的!

这是因为某些高性能CPU指令在对齐的内存地址上效果最佳。通过假定存储CPU端数据结构的分配是对齐的,Vulkan可以无条件使用这些高性能指令,从而提供显著的性能优势。

如果内存没有对齐,你可能会发现程序运行一段时间后神秘崩溃!

2.2 Device Memory

任何可以由Device访问的内存,都被称为Device Memory(设备内存)。Device Memory距离Device更近,比Host Memory更有性能优势。Image object、Buffer object、UBO(uniform buffer objec)都由Device Memory分配。Vulkan中的所有资源都由Device Memory支持。

memory hierarchy

2.3 Pool

内存是一种昂贵的资源,分配操作通常会有间接的系统代价。

Vulkan中通过资源池来平摊成本,一些创建比较频繁的资源都由资源池统一管理:

  • Command Buffer Pool

  • Descriptor Pool

  • Query Pool

三、Memory and Resources

内存的作用是给资源做底层支持,不同的资源对内存的要求并不一样。

3.1 Buffer and Image

Vulkan有两种基本资源类型:Buffer和Image。

image

Buffer 是最简单的资源类型,可以用来储存线性的结构化的数据,也可以储存内存中原始字节。

Image 则相对比较复杂,具有特殊的布局(layout)和格式(format),可用来做flitering,blending,depth 和 stencil testing等。

3.2 Image Layout

Image的布局(layout)对内存有特殊需求,主要有两种主要的平铺模式(tiling modes):

  • linear - 其中的图像(Image)数据线性的排列在内存中。

  • optimal - 其中的图像(Image)数据以高度优化的模式进行布局,可以有效利用设备的内存子系统。

线性布局(linear layout)适合连续的单行的读写,但是大多数图形操作都涉及在跨行读写纹理元素(比如在计算A时,需要参考ABCD四个纹理像素),如果图像的宽度非常宽,相邻行的访问在线性布局中会有非常大的跳转。这可能会导致性能问题。

优化布局(optimal layout)的好处是内存数据根据不同内存子系统进行优化,比如将所有的纹理像素都优化到一块连续的内存区域中,加快内存处理速度。

image-20200803174232255.png

GPU硬件通常倾向于使用优化布局以实现更有效的渲染。但是优化布局(optimal layout)通常是“不透明的”,这意味着优化布局格式的详细信息不会被其他需要读取或写入图像数据的组件得知。

如果CPU如果想读取生层的图像信息,图像在被读取之前要进行布局转换,将optimal layout转换为普通布局后,CPU才能正确识别图像信息。

四、注意事项

4.1 选择最佳的内存使用方式

Vulkan不同的内存类型有不同的使用场景:

  • Device Local Memory适合优先级最高的资源,通常是纹理等频繁被使用的渲染数据。当内存空间不够时我们才会考虑是否将这些内存数据放到CPU端。

  • Device Local Host Memory 适合CPU 到 GPU的数据传递,一些顶点数据等,可以通过这种方式处理。

  • Host Local Device Memory 适合GPU 到 CPU的数据传递,截图、回写等操作可以使用这种内存内省。

4.2 内存使用的原则

在Vulkan中,我们在进行内存管理时要考虑到以下问题:

  • 内存分配通常涉及相当昂贵的系统操作

  • 内存重用要比释放重新分配更快

  • 驻留在连续内存中的对象可以享受更好的缓存利用率。

  • 内存对齐的数据能获得更快的处理

4.3 内存对齐

在使用Host Memory时,一定要注意内存对齐。不允许简单的直接把malloc hook到Vulkan的内存分配函数上!

参考文档:

  1. Vulkan Programming Guide

  2. Vulkan Cookbook

  3. Learning Vulkan

  4. Vulkan® 1.1.148 - A Specification

  5. Image Layout Transition

  6. Vulkan Memory Management

  7. USING VULKAN DEVICE MEMORY

  8. What’s your Vulkan Memory Type?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359