高性能DMA并没有一种统一的设计方法,根据不同的应用场景,大体上可以分为2种:用于传递报文的多通道DMA和用于块数据传输及运算。
他们的主要区别其实是buffer descriptor的差别。首先是用于传递报文的DMA。这种设计的典型代表是intel网卡的DMA实现方式,他的实现机制一般是这样:每个通道一般分为收和发两个方向独立的队列。队列中的报文描述符一般包含以下信息:报文在CPU的主内存中的地址,长度信息,报文在FPGA上需要做的处理动作、处理结果状态等。由于报文的特点是数量巨大,而每个报文都不大,一般是在2K以下(更大的报文可以用多个buffer链在一起的方式实现),因此每个描述符描述对应的buffer一般是2K左右。第2种就是用于计算加速协处理的块传输DMA,这个典型芯片有mellanox的网卡芯片。一般也是通过多个队列进行设计,队列中的描述符一般包含几个信息:取数据的位置、长度,回写数据的地址;需要加速处理的action动作编码、及计算携带的参数;处理结束后状态回写等。当需要计算大量的小块数据时,可以在一个描述符中携带多个数据块信息以提升性能。