张冬:OpenPOWER CAPI为什么这么快?(一)



张冬:OpenPOWER CAPI为什么这么快?(一)

PMC公司数据中心存储架构师张冬

     张冬,《大话存储》系列图书作者,PMC公司数据中心存储架构师。张冬先生是《大话存储》系列图书作者,该书屡次获奖,包括2008年十大IT畅销书排名第一,2009年全国技术品种畅销书。张冬在存储领域有多年的从业经验,主持并参与过多项创新存储技术的设计。


       在第七届云计算大会的PMC技术专场上演讲嘉宾连续进行了七场技术演讲,其中,PMC数据中心存储架构师张冬没有过多谈论市场和行业问题,而是从底层技术出发,对OpenPowerCAPI进行了分析和阐述,为我们介绍了CAPI为什么能这么快。

       之前,POWER CPU只是IBM在做小型机的时候使用,OpenPOWER开放后,成立了OpenPower基金会,基金会大部分成员都非常专注于CAPI(相干加速器处理器接口)上的利用,比如将外置的网络、GPU、闪存等设备通过CAPI直接与CPU相连接,并在此基础上根据不同的主流应用场景进行开放的、定制化的系统设计,PMC除了关注这些外,还关注CAPINVMe进行协作的问题。

传统架构的缺点和瓶颈

      现在无论是2路、4路、8路还是32路服务器,他们架构中的CPU之间的互联有的是直联,有的通过NCNC就类似以太网络里面的网桥)。核心之间要传输数据方式中,最高效的是共享内存,代码里写死。最低效的方法就是走网络,封装一堆的包出去,发送一个数据给远端的某个线程,调用一堆接口,走到协议栈,再到设备驱动,然后到网络,接着收包解析,这个过程非常慢。所以超级计算机没法做到CPU之间进行高速网络共享内存因为成本太高,没法将几万个CPU连接起来,只能走网络了,这也是松耦合系统的一个妥协。

没有CAPIFPGA为什么也不太行

      面对现在大数据分析、模式匹配、热点识别等,要求非常大的计算量,传统CPU出现瓶颈。普通的CPU其实也能计算,但是计算速度太慢,比如,只有64位宽来处理1GB数据,那便需要循环拆分N次才能算完,普通的CPU无法迅速处理这么大的运算量。

 

       在多路CPU系统中,线程看到的都是单一的虚拟地址空间,这个虚拟地址空间会被操作系统映射到真实的物理空间里,但是所有的CPU看到都是同一份物理地址空间

  • 所有CPU看到单一物理地址空间;

  • 所有Threads看到单一虚拟地址空间;

  • PCIE物理地址空间映射到CPU物理地址空间;

  • CPU物理地址空间也映射到PCIE物理地址空间。

       有人想到硬件加速,做法就是把某个专业计算在电路层面展开,展开成更宽的位宽,更多的并行计算单元,去除一些不必要的缓存优化和流水线优化等,其实这就是专用运算芯片所做的,FPGAFieldProgrammableGate Array,即现场可编程门阵列)是现场可编程的专用芯片上述就是所谓的硬加速。

      CAPI之前的FPGA怎么接入系统使用的呢?它是把FPGA做到一块PCIe卡里,FPGA通过CPUPCIe控制器访问到主机内存空间。PCIeCPU各自有各自的地址空间,CPU不能直接访问PCIe的地址,要先访问自己的地址,PCIE物理地址空间映射到CPU物理地址空间,反之CPU物理地址空间也需要映射到PCIE物理地址空间,这是个很费劲的过程。


       CAPI之前的FPGA怎么接入系统使用的呢?它是把FPGA做到一块PCIe卡里,FPGA通过CPUPCIe控制器访问到主机内存空间。PCIeCPU各自有各自的地址空间,CPU不能直接访问PCIe的地址,要先访问自己的地址,PCIE物理地址空间映射到CPU物理地址空间,反之CPU物理地址空间也需要映射到PCIE物理地址空间,这是个很费劲的过程。

      数据出了ALU,面对复杂的路由网络,目的地址为内存地址,但是其相对外部网络的复杂性在于,目标的位置是不固定的,还可能有多份拷贝。Need Coherency!硬件透明搞定Cache CoherencyCC不负责多线程并发访问cache line时的互斥,互斥需要程序显式发出lock,底层硬件会锁住总线访问周期。

      如图所示是个四核CPU,每个CPU内部还有很多东西,每一个CPU的每个核心都有各自的缓存控制器,三级缓存控制器,每个CPU还包含内存控制器,PCIe控制器,QPI控制器(互联CPU相关),还有缓存一致性的控制器,他们全都接入一个高速的总线里面。多个线程看到的数据应该是时刻一致的,需要广播许多信息,这就是CacheCoherencyCache Coherency Agent 负责把消息推送出去以及接受其他CPU发出的探寻。

      CPU之间广播量非常大,所以需要一个目录来记录本地的核心里面都有哪些缓存地址被缓存下来了。其他的CPU如果发广播来探寻,本地直接把目录查一下,如果没有命中缓存就直接不再往后端核心缓存控制器发消息,这样可以提升性能。所以说CCCache Coherency)很重要的,要确保线程看到同样的东西,同一个时刻,这叫实时一致性,且不允许异步。但是它不负责两个线程,如果互相都在写这份数据,会出现相互覆盖,这要靠(CacheConsistancy)软件解决。PCIe写内存也需要做CCCache Coherency),写入数据到某一地址,这个地址在其他的CPU缓存里,要把它作废掉。

      在把FPGA做在一张PCIe卡上,PCIe卡总线接到CPU的情况下,PCIe要做哪些工作呢?

PCIe设备与CPU交互

  • BusDriverPCIE设备地址空间映射到CPU物理地址空间并将PCIE地址空间写入PCIE设备寄存器;

  • HostDriver读出PCIE设备寄存器获取该设备对应的PCIE物理地址空间并ioremap()到内核虚拟地址空间;

  • HostDriver 申请DMA缓存并向PCIE设备映射的虚拟地址空间写入控制字、基地址等,这些信息便被写入设备寄存器,从而触发PCIE设备根据基地址从主存DMA拿到需要的指令和数据后进行处理;

  • PCIE设备对主存DMA时,RC自动执行Probe操作以保证Cache Coherency

       按照上面的过程走下来,缺点非常明显:

      首先执行路径长而且全软件参与:应用call、传输协议栈、Host驱动、PCIe设备、DMA、中断服务、Host驱动、传输协议栈(如有)、应用buffer

      再就是PCIE设备和CPU看到不同的物理地址空间,RC进行映射和转换。驱动程序申请内存之后得用pci_map_single()映射成PCIE物理地址。虽然对于诸如Intel体系下,两个空间映射成一样的地址,但是仍需要在软件里做映射,这对性能有一定的影响。

      另外,用户态程序必须主动从内核地址空间mmap()才可以直接与PCIE设备DMA互传数据。用户态程序必须区分不同的地址段,要分清哪一块内存是DMA映射的,哪一块是自己私有的的。

      最后,FPGA上不能有Cache(缓存),FPGA自己可以有自己的Cache,但是不能把主存里的数据放在自己这边,每次访问内存都要用复杂的过程访问主存里,这也是一个关键的缺点。

        所以我们看到为了让FPGA做一件事,进行了太多操作,开销很大,很费时间,这需要别的技术来解决之。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值