访存优化实践 三 : IOMMU与异构平台的内存/缓存一致性

前言-异构计算平台

异构计算(Heterogeneous computing) 指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。
     通常将CPU与其他如GPU、DPU、DSP、FPGA等组成的异构平台。 随着CPU频率和内核数量的提升对计算效力带来的 边际效用递减逐渐显现,单纯依靠CPU的提升已经无法满足实际需求。与此同时, GPU等专用计算单元在逐渐发展中功能变得更加强悍。CPU擅长于处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序等这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤;而GPU擅于处理规则数据结构、大规模并行、可预测存取模式。行业内表现突出异构平台是以英伟达 、寒武纪、华为等为代表的公司设计开发的GPU算力板卡+CPU服务器的形式出现在用户面前。
         

一、无IOMMU通路

如上图①所示,在没有IOMMU的平台上,使用 SWIOTLB技术实现 一种纯软件的地址映射方案,其作用在于使得寻址能力较低、无法直接寻址到内核所分配的DMA buffer的那些设备,也能够进行DMA操作。
假设一个64位系统,其内存的基地址是0x80000000,内存大小是4G,则内存的物理地址范围是0x80000000-0x180000000,同时该系统中某个外设的DMA只能按32 bits地址寻址,即寻址范围为0-0xFFFFFFFF,如果恰好非给该外设DMA的内存地址超过了这个范围,该外设DMA实际无法使用该地址。swiotlb维护了一块低地址的buffer,该buffer的大小可以由bootloader通过swiotlb参数传递给内核,也可以使用默认值,默认值是64M。如果给DMA分配的物理地址(这里记做phyaddr1)超过了其寻址能力,那么swiotlb技术将从其buffer中分配同样大小的一块空间,给DMA使用,其物理地址记做phyaddr2,swiotlb会维护phyaddr1和phyaddr2的映射关系。
  1. 在函数mem_init的一开始,就调用swiotlb_init做swiotlb的初始化,swiotlb_init中就会分配所需要的buffer,也确实保证buffer在 低地址区间
  2. swiotlb维护了一张io_tlb_orig_addr表,这张表维护了原始物理地址和swiotlb分配物理地址之间的映射关系。当DMA将数据写入swiotlb分配的物理地址后,一般会以中断的方式通知CPU,CPU在查看DMA写到内存的数据之前,需要先做一个sync,该sync操作就会触发swiotlb将数据拷贝到原始物理地址处,这样就保证了CPU能够看到正确的数据,可以想见,这种需要CPU深度参与方式效率不高。
在以上过程中,需要确保low buffer的访问的缓存一致性。以DMA Streaming Mapping举例:
  1. 申请到一块 high buffer记作 Data Buffer
  2. 通过map_single从swiotlb里找到一块low buffer记作 Bounce Buffer
  3. 把CPU访问的Data Buffer与Bounce Buffer映射起来
  4. 最后通过swiotlb同步机制把这两个buffer中的数据做个拷贝(memcpy)
    • DMA 写 - CPU 读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值