《树莓派实战秘籍》——2.4 技巧24在GPU和Linux用户之间划分内存

2.4 技巧24在GPU和Linux用户之间划分内存

你从树莓派获得的性能和你分配给它的核心组件的内存数量是紧密关联的,因为它不是一个你可以放入更多RAM的系统,因此你必须根据你的项目需要以最好的方式分配有效内存。

在嵌入式硬件的世界里,内存几乎总是一个珍贵而稀缺的东西。系统性能通常和存在的(以及可访问的)内存紧密关联。此外,大多数嵌入式系统并没有提供任何用户可以维护的方法来提高物理内存的大小,而树莓派并无不同。

当B型树莓派首次发布时,它自带了256MiB1内存(可能是Hynix MobileDDR2或Samsung Mobile DRAM,取决于其何时生产)。在BCM2835片上系统的内部,该内存在物理上被放置在博通公司的媒体处理器之上,这就是所谓的叠层封装(PoP,Package on Package)。PoP允许嵌入式系统将多个球栅阵列(BGA,ball grid array)封装在垂直堆叠上。

树莓派的片上系统使用了一个混合逻辑内存堆栈,这有助于节省空间,同时也可以允许硬件供应商有更广泛的兼容选项的选择余地(并帮助他们降低成本)。这个设计让他们可以轻松地将B型树莓派的板上内存从256Mib升级到512MiB(从2012年10月15日之后,所有买到的B型产品都有更大的内存)。

如何判断你的Pi的类型

如果你手头有个Pi有段时间了,而你不确定它是哪一种,那么你可以使用cat /proc/cpuinfo命令来了解。结果看上去像下面这样?

版本(Revision)后面的信息可以告诉你手头的是哪种主板。请参考此表:

这大大地提高了树莓派的性能,但不幸的是,更换成这种大小的内存的决定只是真正适用于制造的时候,而不适合用户来自己动手。堆叠这么小的BGA元器件最好是由机器,而不是由笨拙的人手来完成焊接。

即使是较新的512MiB的内存也是一个稀缺资源,因为BCM2835片上系统的工作方式,必须要留一些内存给GPU。你可能已经在x86计算机的低端显卡上看到过这种方式,这些显卡并没有配备专门的显卡内存,因此需要分配一些系统内存供GPU使用。树莓派固件允许你自己定制分配给GPU的内存数量。

在树莓派B型产品出现之前,分配自定义内存是通过选择start.elf文件来实现的。其分配方式如表2-1所示:

在B型树莓派固件只有一种可能的内存容量(256MiB)需要支持的时候,这种方法行之有效。不过当他们开始生产512MiB的B型产品时,这种方法就不再有意义。没有继续采用这种方式的另一个原因是,最显而易见的是在512MiB产品上将会产生两倍数量的可能的内存分配方式(即使其中一些相当可笑)。此外,他们还希望固件能够同时支持这两种产品,而划分内存的start.elf模式和256MiB容量的硬编码关联紧密。

2.4.1 使用config.txt文件分配内存

当前的固件(需要512MiB产品)放弃了独立的start.elf文件的方法,而添加了由start.elf从config.txt文件中读取变量(gpu_mem)的支持,该变量用来指定用户希望分配给GPU的内存容量,以16MiB的块为阶梯,16MiB最小,448MiB最大。

要设置这个变量,请在你常用的编辑器中打开config.txt文件(在包含树莓派Linux映像的SD卡的boot分区中),使用如下语法(此处的value为一整数值,表示分配给GPU的总MiB数,以16MiB的块为阶梯,从16到128Mib):

树莓派固件默认设置gpu_mem=64,但你到底需要分配多少内存给GPU?答案取决于你的树莓派将被用来做什么。

如果你将之用于headless模式(参见技巧11),你可以将gpu_mem设置为最小值16。如果你这么设置,你需要确保start_cd.elf和fixup_cd.elf这两个文件存在,因为它们将被替换使用。这么干的时候请务必小心,因为在最小设置时视频将不能工作,它将剩下的496MiB内存全部都留给ARM CPU使用了(这将被Linux的用户空间使用)。

gpu_mem=32是一个仅仅用于轻微视频友好的选项,Linux内核可以驱动1080p的帧缓冲,但是3D和视频进程将无法正常工作。在gpu_mem=128时,你将获得出色的3D和视频解码性能,但你留给Linux用户空间的只有384MiB内存了。

在分配256MiB/256MiB的道路上,你需要给GPU分配足够的内存来处理大型结构,但是这会使得Linux用户空间竞争更趋激烈。虽然GPU内存值可以增加到高达448MiB,但是我们一般不建议其超过128MiB,除非你有一个GPU非常密集使用的场景。

虽然核心Linux内核能够在内存饥渴的环境下运行,但大多数用户空间程序(特别是图形化程序)都需要几十MiB的内存才可以正常工作,而树莓派比大多数最流行的智能手机所拥有的内存都要少(例如,Galaxy Nexus和iPhone 5有1GiB内存,而Nexus 4有2GiB的内存)。

也请记住,Linux超前的预缓存中的可用内存当前并没有被应用程序使用来提高系统的性能,这意味着你分配给ARM CPU的内存越多,你从Linux中获得的性能就会越好。

制作兼容256MiB和512MiB型号的config.txt文件

有可能制作一个在256MiB和512MiB的B型树莓派上都可以工作的config.txt文件。要设置在两类产品上都兼容的GPU内存,你需要使用gpu_mem_256和gpu_mem_512参数。gpu_mem_256参数用于256MiB的B型树莓派,并覆盖掉gpu_mem中设置的任何值,而这个参数在512MiB树莓派B型中被完全忽略。

设置gpu_mem_512参数情况完全相同,除了它是被用在512MiB产品上并被256MiB产品忽略掉之外。gpu_mem_256最大值为192,gpu_mem_512的最大值为448。

在Raspbian上,也可以使用raspi-config工具来配置可视化的内存分配:以root用户启动raspi-config,并选择Memory Split选项。

对于本书中的大部分技巧和项目,gpu_mem=128应该是一个良好的开端。这个设置在我们的大多数项目中都有着最佳的综合性能。请随意尝试吧,你所能带来的唯一害处至多是树莓派的性能下降,况且你随时都可以将它改回来。

2.4.2 自动共享内存

虽然你也许能够预期你需要如何在CPU(操作系统)和GPU(图形)之间分配内存,但也有很多的情况下,你可能并不知道真实情况。这时,你真的希望树莓派可以根据CPU和GPU的需要而快速地划分并分配内存。

2012年11月之后的固件及3.6版本的Linux内核更新之后,有一个更好的方法来管理GPU/CPU内存分配,它被称为连续内存分配器(CMA,Contiguous Memory Allocator)。CMA能够通过设置GPU的低和高水平标记来动态管理GPU和ARM CPU之间的内存分配。

config.txt文件中对应GPU低水平标记的参数是cma_lwm,而cma_hwm是GPU高水平标记的参数。为了使用这些参数,你还需要在系统启动时传递一些选项给Linux内核。你可以在cmdline.txt文件(位于SD卡的boot分区中)中通过添加这些选项来做到这一点:

cmdline.txt文件的这个变化带来的副作用是禁用了树莓派中内嵌的以太网控制器的turbo模式,不过如果你没有一个网络密集型应用案例的话,你可能不必太在意这点。而且禁用turbo模式有时也可以提高无线网络的性能(并且在某些情况下可以消除系统日志中的许多调试(DEBUG)噪音)。

在此配置下,你还需要在config.txt文件中设置如下值:

一旦你做了这些设置并重启树莓派之后,其缺省会分配给Linux用户空间466 MiB可用内存(对于256 MiB的B型树莓派,这个值是212 MiB),并可以根据需要给GPU分配更多的内存(根据高低水平标记)。

虽然CMA支持是比较新的功能,我们仍然强烈建议你尝试它,而不是像大多数常见情况下的硬编码分配方式。它将提升像Web浏览器这样的应用的性能,同时仍然可以按照需求保持高GPU内存利用率。

时间: 2024-10-23 15:39:58

《树莓派实战秘籍》——2.4 技巧24在GPU和Linux用户之间划分内存的相关文章

《树莓派实战秘籍》——导读

前 言 树莓派的灵感诞生于埃本·厄普顿在剑桥大学负责计算机科学专业学生工作期间(参见前言中的描述),他发现准大学生需要有更多的机会获得编程经验才可以达到大学水平.如我们现在所知的,关于什么将会成为Pi的第一个概念设计诞生于2006年,阿尔法版在2011年年底通过验证,最初的10块板在2012年年初被拍卖,价格高达16 000英镑. 首批10 000台树莓派于开始销售,截至2011年年底,它的SD卡映像文件已经被下载超过了50000次,暗示其普及时代即将来临.当时两家英国的销售商Premier F

《树莓派实战秘籍》——2.2 技巧22构建一个定制内核

2.2 技巧22构建一个定制内核 树莓派实战秘籍 对于很多技巧来说,标准的预购建Linux内核映像已经足够了,不过有些需要的选项或驱动并没有被标准内核启用.这个技巧打开了一些额外的选项,并将对本书中其他的技巧有用. Linux内核是因为以下几个原因而成为一个奇妙的操作系统核心的:首先是它的多功能性,而且它原生支持了大量的架构和设备:然后是其开源代码库,树莓派基金会提供了预购建的专为支持树莓派硬件的客制化的Linux内核映像及相应的源代码树,让你可以建立你自己定制的可以工作在树莓派上的内核映像.这

《树莓派实战秘籍》——1.15 技巧15连接GPIO脚到面包板上

1.15 技巧15连接GPIO脚到面包板上 树莓派实战秘籍 在你构建电子项目的时候,免焊面包板是一个相当有用的朋友,尤其是在原型设计或只是测试设备的时候更是如此.让我们动手做一个简单的到树莓派的连接. 虽然你可以直接通过常见的跳线或者直接在添加的设备和GPIO的引脚之间焊接一个线来简单地连接树莓派GPIO引脚和设备,但让你工作的空间越大,你可以发挥的余地就会越多,我们可靠的老朋友面包板正可以在这方面给你提供帮助.面包板如图1-7所示,即使你以前从未做过任何一个电子项目,你应该也注意到这家伙那白色

《树莓派实战秘籍》——1.2 技巧02挂载SD卡

1.2 技巧02挂载SD卡 树莓派实战秘籍 你当然可以直接从正在运行的树莓派上访问其文件,但使用SD卡读卡器将SD卡挂载到一台独立的计算机上,将会使很多任务(如添加或编辑文件)变得更容易. 虽然树莓派就是一台独立的Linux计算机,不过如果你手头有另外一台计算机的话确实可以为你提供帮助,在有的情况下,它甚至可能是不可或缺的.幸运的是,现在许多计算机都带有内置的SD卡读卡器,即使你的计算机没有内置,它们的价格也不贵并且很容易买到.所以,即使你买的是预装系统的SD卡,你也应该拥有一个SD卡读卡器以及

《树莓派实战秘籍》——1.12 技巧12连接SSH

1.12 技巧12连接SSH 树莓派实战秘籍 对于任何headless项目.以及任何从方便的角度来说和你相距较远的项目,或者仅仅只是因为你懒得穿过房间,这些情况下你都需要知道如何SSH到你的树莓派上. OpenSSH,由OpenBSD项目为安全通信所创建的开源的工具集,很可能在你选择的任何发行版上都有效. 如果你有一点点复古倾向,请注意"Squeeze"这个在"Wheezy"之前的版本,它并没有在默认情况下运行SSH. 如果你不能确定,你要做的就是尝试SSH到你的P

《树莓派实战秘籍》——1.7 技巧07使用过压获得更高的性能

1.7 技巧07使用过压获得更高的性能 树莓派实战秘籍过压,也被称为"动态电压缩放来增加电压",是一个从电子元器件中获取更多性能的小窍门. 树莓派的电路是由充当逻辑门和开关的晶体管组成的,在正常操作元器件时这些节点的电压会在高电压和低电压之间切换.当切换发生时,晶体管的电容和所施加的电压影响了切换输出变换的速度.使用更高的电压("过压")配置电路会让电路的反应速度更快,你可以获得比正常方法下对硬件超频的更好效果. 树莓派固件提供了一些可配置电压,在/boot/con

《树莓派实战秘籍》——1.5 技巧05监测树莓派的硬件

1.5 技巧05监测树莓派的硬件 树莓派实战秘籍你是否担心你不在家时你的Pi投身疯狂派对?这个技巧是关于如何弄个摄像头对准它并将视频传输到Internet上的.开个玩笑!这个技巧中的工具只能监测你的这个小巧硬件的物理状态. 一个"正常的"Linux计算机可能会包括板载健康监测传感器,有相当多的监控芯片和元器件被用在各种系统上,但是对于树莓派来说,所有的硬件完全隐藏在Broadcom片上系统里面,因此你无法使用通常的方式访问它. 为了能够使用这些元器件监视你的Pi的健康,需要使用vcge

《树莓派实战秘籍》——1.3 技巧03解码LED灯

1.3 技巧03解码LED灯 树莓派实战秘籍每个树莓派都有一组藏在角落中的LED灯,它们可以告诉你设备正在发生什么或什么也没发生.A型只有两个灯,而B型提供了更多的情报和确定故障所需要的宝贵的信息. B型树莓派有个状态LED灯(如图1-2所示,并在表1-1中描述),当它无法启动或出现其他问题时,这些灯可以帮助你定位问题.由于Pi没有BIOS,在Pi成功启动之前屏幕上不会显示任何信息,这时就是这些小灯显示身手的时候了. 当你想确定你的问题是不是很简单的"有没有插好"时,前两个灯(D5和D

《树莓派实战秘籍》——2.1 技巧21建立交叉编译器工具链

2.1 技巧21建立交叉编译器工具链 树莓派实战秘籍树莓派适合用来做很多事情,不过编译速度可不是它的强项.如果希望在一个合理的时间内从源代码生成什么的话,这时候你就需要在一台更高速的计算机上运行交叉编译器了. 交叉编译器是一种建立并运行在某一架构上,但是生成另一种架构上适用的二进制文件的编译器(及其依赖库),而这两种架构通常是不相容的.在本例中,你需要建立一个交叉编译器,以为树莓派的Linux环境生成优化过的二进制文件. 类似于Linux上的大多数任务,你可以有几种方法构建交叉编译器,只要能保证