PCIE简介与XDMA/QDMA的对比调研

PCIE基础

*参考文献:PCIe基础知识及Xilinx相关IP核介绍_xilinx pcie-CSDN博客

PCI Express总线是为了取代PCI总线的第三代I/O技术,但是对于系统软件,PCIe是向前兼容PCI总线的,理解PCIe总线必须建立在深刻理解PCI总线的基础上。

  1. 点到点的数据传输

image-20240930163727006

PCIe总线的物理链路的一个数据通路(lane)中,有两组差分信号。 PCIe总线物理链路间的数据传送使用基于时钟的同步传送机制,但是在物理链路中没有时钟,在接收端使用时钟恢复模块(clock data recovery,CDR)提取接收时钟。 PCIe链路可以由多条lane组成,即PCIe x2 x4 x8分别代表有2,4,8条lane。

  1. PCIe总线使用的信号 这里主要是注意PCIe设备与PCIe插槽都具有REFCLK+/-信号,PCIe插槽使用这组信号与处理器系统同步。 PCIe插槽向下兼容,比如PCIex2,x4都可以插x8的插槽。

  2. PCIe总线的层次结构 上面的层次组成结构图展示了PCIe总线的层次组成结构。

数据报文首先经过事务层(Transaction layer),数据链路层(data link layer),和物理层(physical layer),最终发送出去。接收则相反,这里面每一层都会对数据进行处理。

image-20240930165119938

  • Root Complex:RC,将PCIe总线端口,存储器控制器等一系列与外部设备有关的接口都集成在一起,统称为RC。

  • Endpoint:EP,基于PCIe总线的设备。

  • Switch: 一个特殊的设备,多个虚拟PCI-to-PCI桥接设备的逻辑组件,该设备由1个上游端口和2~n个下游端口组成。

XDMA与QDMA原理对比

DMA映射方式

Xilinx的两款FPGA平台xdma和qdma-CSDN博客

  • XDMA

    • 使用流式DMA映射。这种映射方式通常涉及在每次DMA传输前后执行缓存失效或清除操作,以解决缓存一致性的问题。流式DMA映射通常在每次DMA传输前后进行,这增加了复杂性和开销。

    • 相关函数:dma_map_single 和 dma_unmap_single 用于在每次DMA传输时映射和取消映射。

  • QDMA

    • 使用一致性DMA映射。这种方式下,申请的缓存区能够使用缓存,并且保持缓存一致性。一致性映射具有较长的生命周期,在这段时间内占用的映射寄存器不会被释放,即使在这段时间内不使用也不会释放。

    • 主要用到的函数是 dma_alloc_coherent 和 dma_free_coherent,前者直接从DMA区域申请内存,后者释放申请的内存。

数据搬移方式

  • XDMAxdma使用小结-CSDN博客

    • 通过AXI4 Memory Mapped(AXI MM)或AXI Stream(AXI ST)接口进行数据搬移。

    • AXI MM接口通常用于与DDR之间的通信,而AXI Stream用于FIFO等数据缓冲区。

  • QDMAMulti-Channel PCIe QDMA Subsystem - adrifter - 博客园 (cnblogs.com)

    • 通过AXI4 Stream接口直接连接RTL逻辑,支持高达16个upstream和downstream通道,每个通道支持深度为32的DMA地址队列。

    • 除了基本的DMA功能,QDMA还允许PCIe通信绕过DMA引擎。

队列与通道机制

  • XDMA

    • 通常提供较少的专用DMA通道(如4个H2C和4个C2H通道),每个通道作为独立的DMA引擎。

    • 不支持SR-IOV20。

  • QDMA

    • 支持多达2048个队列,这些队列共享相同的DMA引擎资源。

    • 支持SR-IOV(Single Root I/O Virtualization),允许多个物理功能(PF)或虚拟功能(VF)分配队列。

缓存行为

  • XDMA

    • 在每次DMA传输前后需要处理缓存一致性问题,可能涉及缓存刷新或使无效操作。

  • QDMA

    • 由于使用一致性DMA映射,可以保持缓存一致性,减少了每次传输前后的额外开销。

使用对比 - 硬件兼容性

  • XDMA

    • 支持更广泛的FPGA系列,包括较旧的系列20。

  • QDMA

    • 仅支持Xilinx的Ultrascale+系列FPGA20。

驱动与应用程序

Xilinx QDMA说明和测试-CSDN博客

  • XDMA

    • 驱动程序相对简单,主要用于配置DMA通道和传输数据。

  • QDMA

    • 驱动程序提供了更多功能,如多队列支持、SR-IOV等。

    • 应用程序方面,QDMA提供了如dma-ctl、dma-to-device、dma-from-device等工具。

XDMA/QDMA性能对比【可能存在错误】

1. 带宽
  • XDMA

    • XDMA提供了多个独立的DMA通道(例如,4个主机到设备和4个设备到主机的DMA通道),每个通道都有其自身的带宽限制。因此,总的带宽受限于这些通道的最大传输能力。

    • 实际测试表明,在某些条件下,XDMA可以达到较高的传输速率,例如,在PCIe Gen3 @ x8的情况下,从设备到主机的传输速率可以达到450MB/s左右,而从主机到设备的传输速率可以达到455MB/s左右。Xilinx FPGA PCIe XDMA性能测试报告(二)_xdma 效率-CSDN博客

  • QDMA

    • QDMA支持多达2048个队列,这意味着理论上它可以提供更高的带宽,尤其是在多任务或多队列环境中,因为队列可以并行处理数据传输。

    • 在PCIe 3.0 x16的情况下,C2H DMA速率可以达到1660MB/s,H2C DMA速率可以达到1670MB/s。而在PCIe 2.0 x8的情况下,C2H DMA速率可以达到450MB/s,H2C DMA速率可以达到455MB/s。Multi-Channel PCIe QDMA Subsystem - adrifter - 博客园 (cnblogs.com)

2. 延迟

Xilinx DMA的几种方式与架构 - Hello-FPGA - 博客园 (cnblogs.com)

  • XDMA

    • XDMA在某些情况下可能会遇到较高的延迟,特别是当多个任务竞争相同的DMA通道时。

    • 由于使用流式DMA映射,XDMA可能需要在每次DMA传输前后执行缓存失效或清除操作,这会增加延迟。

  • QDMA

    • QDMA由于支持更多的队列,可以在多任务环境下提供更好的延迟表现。此外,QDMA可以通过硬件加速来进一步提高性能,从而减少延迟。

    • 由于使用一致性DMA映射,QDMA可以在整个映射期间保持缓存一致性,从而减少每次DMA传输的开销。

3. 吞吐量
  • XDMA

    • XDMA的吞吐量受限于其DMA通道的数量。如果多个任务需要同时使用DMA通道,则可能会出现拥塞,从而降低吞吐量。

    • 在实际应用中,XDMA结合DDR4-SDRAM缓存的性能测试表明,其吞吐量可以达到几千MB/s的水平。

  • QDMA

    • QDMA的多队列设计使其在多任务环境下提供更好的吞吐量表现。由于队列可以并行处理数据传输,因此总体吞吐量可以显著提高。

    • 在PCIe 3.0 x16的情况下,QDMA的吞吐量可以达到1600MB/s以上。

4. CPU负载
  • XDMA

    • XDMA的DMA操作需要频繁地与CPU交互,尤其是在处理缓存一致性问题时。这可能导致较高的CPU负载。

    • 由于需要处理缓存一致性问题,XDMA在某些情况下可能需要更多的CPU介入。

  • QDMA

    • QDMA的设计目的是减少CPU的干预,特别是在使用一致性DMA映射时。这可以降低CPU负载,让CPU专注于其他计算密集型任务。

    • QDMA通过队列机制实现了更高效的DMA操作,减少了CPU的负担。

5. 功耗
  • XDMA

    • 因为XDMA可能需要频繁处理缓存一致性问题,这可能会导致更高的功耗。

    • 在某些情况下,XDMA的功耗可能高于QDMA。

  • QDMA

    • 通过减少CPU的干预,QDMA可能在某些情况下实现更低的功耗。

    • QDMA的队列机制允许更高效的DMA操作,从而可能降低整体功耗。

6. 多任务支持
  • XDMA

    • XDMA的固定DMA通道数量限制了其多任务处理能力。

    • 在需要处理多个并发任务时,XDMA的性能可能会受到限制。

  • QDMA

    • QDMA的多队列设计使其非常适合多任务环境,可以更好地支持并发数据传输。

    • QDMA支持高达2048个队列,使得它在处理大量并发任务时表现优异。

QDMA的使用

Xilinx QDMA说明和测试-CSDN博客

1 测试工程

https://github.com/binfu1/vivado-dma/tree/master/qdma

使用QDMA的Example工程,该工程可从Github下载,使用的FPGA板卡为浪潮的F37X加速器,运行工程目录下的run.sh执行run.tcl即可完成工程的创建和编译。

在这里插入图片描述

2 驱动安装

本节主要介绍QDMA驱动的源文件、编译和安装过程。

2.1 源文件说明

1.下载地址:DMA驱动下载 2.文件说明

文件说明
apps应用文件
docs说明文件
driver驱动源文件
scripts脚本文件
RELEASE版本说明
Makefile.txtMakefile
bsd_license.txt证书
COPYING权限
license.txt证书

2.2 驱动编译安装

1.依赖库安装:QDMA驱动依赖于libaio,所以在编译驱动前需要安装该库。

sudo apt-get install libaio-dev

2.驱动编译 2.1 执行make clean && make命令完成驱动文件的编译,在文件夹会生成bin文件夹,里面包含下述文件。如果需要添加新设备,可以在driver/src/pci_ids.h文件中添加。

文件说明
dma-ctlQDMA的控制和配置应用程序
dma-to-device执行MM或ST模式的host-to-card的传输事务
dma-from-device执行MM或ST模式的card-to-host的传输事务
dma-perf测量QDMA的性能
qdma-pf.koPF驱动
qdma-vf.koVF驱动
dma-latency测量ST H2C/C2H传输的乒乓延时
dma-xfer说明QDMA传输的简单应用

2.2 如果只需要PF驱动可以执行make driver MODULE=mod_pf 2.3 如果只需要VF驱动可以执行make driver MODULE=mod_vf 2.4 如果要启用CPM5的VF 4K队列,执行make EQDMA_CPM5_VF_GT_256Q_SUPPORTED=1

3.驱动安装 3.1 执行sudo make install安装驱动和应用程序,执行完该命令后在/user/local/sbin文件下生成dma-ctl、dma-to-device等应用程序,在/lib/modules/<kernel version>/qdma文件夹下生成qdam-pf.ko和qdma-vf.ko驱动程序。 3.2 如果只安装驱动程序,可以执行sudo make install-mods 3.3 如果只安装应用程序,可以执行sudo make install-apps 3.4 如果需要卸载驱动和应用程序,可以执行sudo make uninstall

4.驱动加载 4.1 下载FPGA程序,执行lspci -vd <vendor id>找到设备的BDF号。 4.2 在加载驱动前需要生成一个qdma.conf文件放到/etc/modprobe.d文件夹下,用于参数传递。在scripts文件夹下有一个qdma_generate_conf_file.sh脚本,辅助生成配置文件。执行下述命令,脚本会自动在/etc/modprobe.d文件夹下生成qdma.conf文件。

sudo ./qdma_generate_conf_file.sh <bus_num> <num_pfs> <mod> <config_bar> <master_pf>
参数说明
bus_numBDF中的B
num_pfsPF支持的数量,默认为4
mod驱动的模式,默认为0 0-Auto;1-Poll;2-Direct Interrupt 3-Indirect Interrupt; 4-Legacy Interrupt
config_bar配置的BAR空间
master_pf主PF

4.3 执行sudo modprobe qdma-pf加载PF驱动,执行sudo modprobe qdma-vf加载VF驱动。由于在/lib/modules/<kernel version>/qdma文件夹下有qdam-pf.ko和qdma-vf.ko驱动程序,所以系统在启动时会自动加载这两个驱动。如果不需要开机加载这两个驱动,可以在/etc/modprobe.d/blacklist.cof文件中添加blacklist qdma-pfblacklist qdma-vf语句。 5.修改qmax 执行下述命令修改最大队列数,安装驱动后默认的qmax是0,在执行测试脚本时出现错误,提示“unable to open device /dev/qdma82000-MM-0”。重启系统后这个值会恢复为0。

cat /sys/bus/pci/devices/0000:01:00.0/qdma/qmax   // 显示qmax
echo 8 > /sys/bus/pci/devices/0000:01:00.0/qdma/qmax   // 设置qmax为8

6.设置VF数量

cat /sys/bus/pci/devices/0000:01:00.0/sriov_totalvfs   // 显示每个PF的VF数量
echo 3 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs   // 设置每个PF的VF数量为1024

3 调试工具

3.1 设备管理

应用dma-ctl用于管理驱动,可以实现下述功能,通过命令dma-ctl -h可查看帮助文件。

  • 列出设备信息

dma-ctl dev list        // 列出系统可使用的PF和VF,以及每个function的queue base和queue max
dma-ctl qdma<bdf> cap   // 列出硬件和软件的版本信息
dma-ctl qdma<bdf> stat  // 列出数据统计信息
  • 添加一个或多个队列

dma-ctl qdma<bdf> q add idx <N> [mode <st|mm>] [dir <h2c|c2h|bi|cmpt>]   // N-队列编号
dma-ctl qdma<bdf> q  add list <start_idx> <num_Qs> [mode <st|mm>] [dir <h2c|c2h|bi|cmpt>]
  • 开始一个或多个队列

dma-ctl qdma<bdf> q start idx <N> [dir <h2c|c2h|bi|cmpt>]
dma-ctl qdma<bdf> q start list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>]
  • 暂停一个或多个队列

dma-ctl qdma<bdf> q stop idx <N> [dir <h2c|c2h|bi|cmpt>]
dma-ctl qdma<bdf> q stop list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>]
  • 删除一个或多个队列

dma-ctl qdma<bdf> q del idx <N> [dir <h2c|c2h|bi|cmpt>]
dma-ctl qdma<bdf> q del list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>]
  • 输出一个或多个队列信息

dma-ctl qdma<bdf> q dump idx <N> [dir <h2c|c2h|bi|cmpt>]
dma-ctl qdma<bdf> q dump list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>]
  • 输出一个或多个队列描述符信息

dma-ctl qdma<bdf> q dump idx <N> [dir <h2c|c2h|bi|cmpt>] [desc <x> <y>]   // <x>-range start;<y>-range end
dma-ctl qdma<bdf> q dump list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>] [desc <x> <y>] 
  • 输出一个或多个队列完成信息

dma-ctl qdma<bdf> q dump idx <N> [dir <h2c|c2h|bi|cmpt>] [cmpt <x> <y>]
dma-ctl qdma<bdf> q dump list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>] [cmpt <x> <y>] 

输出中断信息

dma-ctl qdma<bdf> intring dump vector <N> <start_idx> <end_idx>

3.2 数据读写

  • 读寄存器

dmactl qdma<bdf> reg read bar <N> <addr>   // N-Bar号;addr-地址
  • 写寄存器

dmactl qdma<bdf> reg write bar <N> <addr>
  • 输出队列寄存器

dmactl qdma<bdf> reg dump [dmap <Q> <N>]   // Q-队列号;N-队列数量
  • 写入数据

dma-to-device [OPTIONS]
-d (--device) device path from /dev. Device name is formed as qdmabbddf-<mode>-<queue_number>
-a (--address) the start address on the AXI bus
-s (--size) size of a single transfer in bytes, default 32 bytes
-o (--offset) page offset of transfer
-c (--count) number of transfers, default 1
-f (--data input file) filename to read the data from.
-w (--data output file) filename to write the data of the transfers
-h (--help) print usage help and exit
-v (--verbose) verbose outpu
  • 读出数据

dma-from-device [OPTIONS]
-d (--device) device path from /dev. Device name is formed as qdmabbddf-<mode>-<queue_number>
-a (--address) the start address on the AXI bus
-s (--size) size of a single transfer in bytes, default 32 bytes.
-o (--offset) page offset of transfer
-c (--count) number of transfers, default is 1.
-f (--file) file to write the data of the transfers
-h (--help) print usage help and exit
-v (--verbose) verbose output

4 测试分析

4.1 测试脚本

执行脚本qdma_run_test_pf.sh完成对PF的测试,执行命令如下,整个测试流程包括获取设备、设置复位、h2c和c2h的mm接口测试、h2c的st接口测试和c2h的st接口测试。

sudo ./qdma_run_test_pf.sh <bdf> <qid_start> <num_qs> <desc_bypass_en> <pfetch_en> <pfetch_bypass_en> <flr_on>
参数说明
bdf设备的BDF号
qid_start队列的起始ID
num_qs从qid_start开始的队列数量,默认为04
desc_bypass_en使能描述符旁路,默认为0
pfetch_en使能预取,默认为0
pfetch_bypass_en使能预取旁路,默认为0
flr_on启用function level reset,默认为0
  • 获取设备:get_dev 执行dma-ctl dev list获取设备信息。

  • 设置复位:set_flr 如果设置了function level reset,则对修改系统中的reset文件对PCIe设备进行复位。

  • MM测试:run_mm_h2c_c2h 1.找到AXI Lite的bar空间:get_user_bar 2.设置设备:dev_mm_c2h、dev_mm_h2c、out_mm 3.开始队列传输:queue_start,执行dma-ctl q adddma-ctl q start 4.传输数据到FPGA:dma_to_device 5.从FPGA中取出数据:dma_from_device 6.比较两个文件的内容是否相等,结束测试。 7.清理队列:cleanup_queue,执行dma-ctl q stopdma-ctl q del

  • H2C测试 1.找到AXI Lite的bar空间:get_user_bar 2.设置设备:dev_st_h2c 3.开始队列传输:queue_start,执行dma-ctl q adddma-ctl q start 4.传输数据到FPGA:dma_to_device 5.读取FPGA的数据对比结果dma-ctl reg read,结束测试。 6.清理队列:cleanup_queue,执行dma-ctl q adddma-ctl q start

  • C2H测试 1.找到AXI Lite的bar空间:get_user_bar 2.设置设备:dev_st_c2h、out_st 3.开始队列传输:queue_start,执行dma-ctl q adddma-ctl q start 4.传输数据到FPGA:dma_from_device 5.比较两个文件的内容是否相等,结束测试。 6.清理队列:cleanup_queue,执行dma-ctl q adddma-ctl q start

4.2 测试结果

  • 查看PCIe设备

    在这里插入图片描述

  • 查看驱动加载情况

    在这里插入图片描述

  • 查看驱动绑定的设备信息, 如果qmax为0,则需要设置非零的qmax,否则无法找到设备。

### 回答1: FPGA(Field Programmable Gate Array)可以通过硬件编程实现各种功能,包括高性能数据传输。在FPGA中使用XDMA(eXtensible DMA)技术可以大大提升数据传输的性能。 首先,XDMA技术采用了专门的硬件架构,其中包括DMA控制器、数据缓冲区和数据传输引擎。这些硬件模块可以直接外部设备进行数据传输,而无需CPU的干预,从而减少了数据传输的开销,提高了性能。 其次,FPGA中的XDMA技术充分利用了FPGA的并行计算和时钟管理能力。通过在FPGA中并行计算多个数据块的指令,XDMA可以显著提高数据传输速度。同时,XDMA还利用了FPGA的高速时钟管理能力,可以精确地控制数据的采样和发送速率,从而进一步提高性能。 此外,FPGA中的XDMA技术还可以灵活地适应各种数据传输需求。通过对硬件的编程设置,可以根据具体的应用场景和数据传输要求来调整XDMA的性能。例如,在大数据传输时可以配置更大的缓冲区来提高传输速率,而在低延迟的应用中可以减小缓冲区来降低延迟。 总之,通过在FPGA中使用XDMA技术,可以实现高性能的数据传输。这种技术利用了FPGA的并行计算和时钟管理能力,通过硬件编程灵活调整,能够满足不同应用场景的数据传输需求。 ### 回答2: FPGA实现XDMS性能可以由以下几个方面来考量: 1. 灵活性:FPGA具有可编程性的特点,可以根据需要进行灵活的配置和定制。因此,在实现XDMS时,可以根据具体的应用需求对FPGA进行适当选择和优化,以实现最佳的性能。 2. 并行计算:FPGA中的资源可以高度并行地利用,可以将XDMS的任务划分为多个子任务,并通过并行计算的方式来加速计算过程。这样可以充分利用FPGA的并行计算能力,提高XDMS的性能。 3. 高速通信:FPGA的IO通路可以实现高速、低延迟的数据通信。在实现XDMS时,可以利用FPGA的高速通信通道,实现主机或其他设备的快速数据传输,从而提高XDMS的性能。 4. 优化算法:FPGA的硬件设计可以根据算法的特点进行优化,以提高运算速度和资源利用率。在实现XDMS时,可以对其中涉及到的算法进行硬件级别的优化,以提高XDMS的性能。 5. 硬件资源利用:FPGA具有丰富的硬件资源,包括片上存储器、DSP片上模块、硬件乘法器等。在实现XDMS时,可以充分利用FPGA的硬件资源,将一些常用的运算和存储操作放在FPGA内部进行,从而提高XDMS的性能。 总的来说,FPGA实现XDMS可以通过优化硬件设计、并行计算、高速通信和资源利用率等方式来提高性能。这些方法可以根据具体的应用需求进行选择和优化,以实现最佳的XDMS性能。 ### 回答3: FPGA实现XDMA(eXtensible DMA)技术可以显著提升系统的性能。 首先,FPGA具有可编程性,可以根据应用的需求灵活地实现和配置XDMA。这意味着可以根据具体场景选择最优的数据传输方式、内存管理策略和通道配置等。这种灵活性使得XDMA可以根据不同的数据处理要求进行高效优化,因而提高了系统的性能。 其次,FPGA中的硬件逻辑和并行处理结构使得它在数据传输任务中具有卓越的处理能力。FPGA可以通过并行处理单元和高速数据通道来实现多通道的DMA,充分发挥硬件的计算资源和高带宽的特性。这样一来,数据能够以更高的速率在设备和主机之间传输,从而提高系统的性能。 此外,FPGA实现的XDMA还可以通过硬件加速技术提高系统性能。例如,可以通过FPGA内的硬件逻辑和高速缓存实现数据的压缩和解压缩、计算加速等功能。这样可以减少数据传输带宽的需求,降低延迟,并且能够在一些特定应用场景中大幅提升系统性能。 总而言之,FPGA实现XDMA可以通过灵活配置、并行处理和硬件加速等方式提升系统性能。它不仅可以加快数据传输速率,还可以优化内存管理和计算处理等方面,为各种应用场景提供高性能的数据传输解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值