kok电竞|百度嵌入式AI解决方案EdgeBoard之内存驱动设计介绍 - KOK官网_KOK平台_kok电竞

当前位置:首页 > 探索 > 奇闻

kok电竞|百度嵌入式AI解决方案EdgeBoard之内存驱动设计介绍

2020-10-13 19:19:02

KOK平台_1.背景讲解由于FPGA不具备可编程和高性能计算出来的特点,基于FPGA硬件的AI计算出来加快,于是以普遍地应用于到计算机视觉处置领域。其中极具代表性的部署方式之一就是用于FPGA和CPU人组包含异构计算系统,并在CPU上配备Linux操作系统,运营AI推理小说引擎框架及视频图片处置等各种业务。其中,如何协商CPU和FPGA的计算出来关系,沦为这套异构系统的关键,而这部分关键技术则是由驱动系统来已完成的。协商CPU和FPGA这对异构兄弟的计算出来关系,可以有许多模式,根据有所不同的应用于场景不会有相当大的变化。

一般在末端外侧,整个系统的应用于较为单一高效率,较较少考虑到所发及虚拟世界的情形。根据这一情况,EdgeBoard应运而生。2.EdgeBoard讲解EdgeBoard是百度打造出的基于FPGA的嵌入式AI解决方案及基于此方案构建的系列硬件。

作为端侧的解决方案,没在PL外侧为FPGA设计专用的内存,而是使用了PS和PL外侧共用DDR内存的结构。因此,对这种异构系统的CPU和FPGA的协商就落在了内存的管理方面,这就是驱动系统中关于内存管理的子系统。3.全文阐述本文将重点讲解EdgeBoard中关于CPU和FPGA内存驱动设计的关键技术。

KOK官网

右图是整体EdgeBoard的软件框架图,其中内存驱动坐落于内核部分。下面将从内存的分配、获释、重复使用等方面来逐步讲解。4.内存的特点和FPGA的内存市场需求在FPGA芯片PS外侧,CPU用于多级内存来采访DDR,在Linux操作系统中,用于内存同构页面(通过页表来管理),而对DDR的物理连续性没拒绝,它们被同构到虚拟世界倒数的地址空间中。

而在PL外侧的FPGA一般并未用于任何内存机制,它们在计算出来中都是必要采访DDR。每一次读写操作都是读书或写出一个倒数的内存空间,而且拒绝这片内存的接续地址要偏移在一个特定的地址位移处(位移0x10)。一次计算出来中的多次读取都拒绝采访的DDR是完全一致倒数的。针对CPU和FPGA这样的内存市场需求,我们设计Linux驱动内存的子系统时,就要充份考虑到:1)cache的影响;2)FPGA用于内存的物理连续性;3)传送给FPGA用于的内存块要符合位移拒绝(segmentalignments)。

5.保有系统内存针对上述市场需求,我们使用隔开物理内存的设计方案,从整体系统中保有其中的一部分内存,让Linux只用于另一部分内存。这部分被保有的内存,分配权归内存驱动,驱动从保有部分中分配的内存块在Linux系统中和FPGA系统中都可以采访。在此期间,分配时要确保物理倒数和接续位移特性,使其能符合FPGA的市场需求。

在EdgeBoard实践中,我们使用的是Xilinx的ZynqMP系列的FPGA芯片,用于PetaLinux工具链来编译器Linux内核,并使用DeviceTree中的reserved-memory节点来构建内存的保有。例如,系统总体2GB内存,保有1GB给FPGA,留给1GB给Linux操作系统,DeviceTree中涉及节点的原作就是这样的:下面就从驱动设计构建的各个方面讲解。

6.初始化内存的内部同构FPGA总体设备驱动是使用字符设备platformdriver的形式来撰写的:在Device的probe阶段,对驱动内所保有的内存块作好内存同构(memremap),并用于合理的数据结构,留存好各个参数,以供先前用于。例如:mem_start、mem_end、base_addr等结构成员的定义如下:7.内存的分配关于内存的分配,使用了mmap调用的方式:在FPGA设备的初始化期间,初始化字符设备时传送了file_operations结构变量,这个结构变量的mmap指针初始化为我们的内存分配函数。内存分配中,我们用于了内核获取的bitmap数据结构,来管理我们保有的内存区域——bitmap位数组中的每一位代表着16k的一个内存块,另外还用于完全相同长度的数组来管理内存被分配的客户owner(即file指针)、内存分配的块的数量等信息。另外,在分配的内存对应的vma(VMMMemoryArea)中,我们还登记了自己的私有数据privatedata来记录对应内存的适当信息:如对应内存块的总线物理地址范围和同构地址、bitmap位数组的索引等,用作地址切换;再行如对应内存块的一些finger信息,用来标识保有内存块。

同时,我们也为VMA的vm_ops登记了close函数,用作为对该块内存的重复使用作好打算。关于内存分配的代码量较小,这里就不一一列举了。8.内存的重复使用已分配过来的内存块都必须重复使用,其中有两种最不具代表性的情况,一种是用户release一块内存的处置,另一种则是用户重开设备时对未release的内存块的清扫重复使用。

当用户release一个内存块时,对应的vma的close函数不会被自动继续执行。为此,我们登记这个函数作为内存获释处理函数:函数构建中,首先检测privatedata防止错误处理,然后完全恢复对应的bitmap位数组中的位信息,清扫owner和块数量信息,使得这块保有内存又返回了待分配的状态。当用户重开设备时,不会调用设备登记的release函数。

因此,在设备的release函数中,我们迭代owner数组来清扫owner与设备的file指针完全相同的内存块,以此超过批量重复使用的目的。9.内存的地址切换内存的地址切换,是已完成总线物理地址和虚拟世界逻辑地址的双向切换,为内存cache的flush/invalidate、以及交由FPGA之时要展开的处置等获取承托。系统也通过两个IOCTL向用户层曝露这两个切换操作者。

KOK官网

地址切换操作者中,首先寻找对应的vma,然后计算出来出有offset,最后检查vma对应的标识是不是保有的内存块——如果是,就用于我们vma留存的private_data中的信息及offset已完成涉及的计算出来。10.内存内存的flush和invalidate操作者在CPU及其异构兄弟FPGA之间,用于DDR内存来传送数据时,必须用于flush或invalidate来避免对应内存的影响。

首先,我们的驱动代码是运营在CPU上面的,当针对一片内存的处置从CPU移往到FPGA之前,必须对这片内存的cache继续执行flush操作者,使得内存cache中的所有改动都载入到DDR,然后FPGA开始对它的处置工作。其次,当针对一片内存的处置从FPGA移往到CPU之前,必须对这片内存的cache继续执行invalidate操作者,使得cache内容违宪,下次CPU必要加载即从DDR中去主动load从而创下cache。这样,CPU就可以很好地跟FPGA共处了。

对于flush和invalidate操作者,则是CPU体系涉及的。EdgeBoard用于的是A53v8(对应于AArch64继续执行集),cacheflush和invalidate的代码如下:11.内存驱动中其它功能设计及考虑到上文中提及的保有内存区域中每个保有内存块的大小是16K,只不过这里是可以落成多规格的,这样用户在用于上就不会更为便利,用途也不会更加多。但是关于内存管理部分就必须更好的数据来展开管理了。

另外,我们可以通过创建一些IOCTL的方式为有所不同进程之间的内存分享作出一些较慢、简练的方案,这也是我们可以在内存驱动中设计考虑到的。:KOK平台。

本文来源:kok电竞-www.whytvonline.com

热门推荐