高性能DMA设计

       高性能DMA并没有一种统一的设计方法,根据不同的应用场景,大体上可以分为2种:用于传递报文的多通道DMA和用于块数据传输及运算。他们的主要区别其实是buffer descriptor的差别。

       首先是用于传递报文的DMA。这种设计的典型代表是intel网卡的DMA实现方式,他的实现机制一般是这样:每个通道一般分为收和发两个方向独立的队列。队列中的报文描述符一般包含以下信息:报文在CPU的主内存中的地址,长度信息,报文在FPGA上需要做的处理动作、处理结果状态等。由于报文的特点是数量巨大,而每个报文都不大,一般是在2K以下(更大的报文可以用多个buffer链在一起的方式实现),因此每个描述符描述对应的buffer一般是2K左右。

        第2种就是用于计算加速协处理的块传输DMA,这个典型芯片有mellanox的网卡芯片。一般也是通过多个队列进行设计,队列中的描述符一般包含几个信息:取数据的位置、长度,回写数据的地址;需要加速处理的action动作编码、及计算携带的参数;处理结束后状态回写等。当需要计算大量的小块数据时,可以在一个描述符中携带多个数据块信息以提升性能。

        这些描述符设计完成后,如何利用CPU多核的性能呢?一种方法是设计一种通道绑定机制,把不同通道绑定到不同的核中。当然也可以用散列的方式把单通道数据散列到多个核上。另外队列深度的设计也会影响到性能和延迟,要在这两个中间找到平衡。有没有进一步提升的办法呢?其实软件上也可以做些优化,在初始化时固定分配一些内存,这样就不必每次向系统申请内存。

        硬件上如何支持虚拟化,一个就是DMA的通道间要做隔离,当一个通道创建或者拆除时要做好内部信息隔离,避免通道间互相影响。第2个就是支持逻辑地址,一般可以选用那些支持IOMMU的CPU。

        另外一个经常会被忽略的设计是PCIE接口适配器的设计,这个性能差距很大,比如Tagid取多大、是否要进行不同传输类型帧的流控设计、是否要做乱序重排等等。。。

        DMA的设计包含东西挺多,他是软硬件融合进行高性能设计的一个关键部分,但可惜的是相当多的公司都不太愿意在上面做长期积累,其实我们的很多企业更愿意做各种集成,而不愿意做某个领域的工匠。

 




猜你喜欢

转载自blog.csdn.net/weixin_38712697/article/details/80289483