研究 · PS/PL 异构计算

面向边缘设备的异构向量计算

Zynq 的可编程逻辑资源有限,完整向量模型放不进去。PS 处理文本并运行轻量模型,PL 负责重复的 INT8 向量计算。双 MAC 点积现已通过 AXI DMA 完成板上批量测试。

研究 · PS/PL 异构计算

把一条检索链拆成四个部分

01

文本与模型留在 PS

分词、模型推理、向量归一化和候选元数据涉及复杂控制与软件生态,更适合由处理器和 Linux 环境承载。

02

重复计算下沉到 PL

点积的数据流固定,适合放进 PL。当前 AXI4-Stream 核心每拍接收两组 INT8 操作数,100 MHz 下的计算上限为 200 MMAC/s;这只是计算值,不是端到端实测。

03

数据通路决定实际收益

如果查询向量和候选数据在 PS 与 PL 之间频繁小块往返,传输开销可能抵消计算收益,因此 AXI、DMA 和缓冲策略必须与计算核一起设计。

04

Top-K 不能只看算子

完整检索还涉及候选组织、分值排序、结果编号和原始记录关联。单个点积核心只是链路中的第一块,不等于端到端系统已经完成。

测试环境

CPU

处理器

双核 Cortex-A9,主频 667 MHz。

PL

可编程逻辑

PL 时钟 100 MHz;双 MAC INT8 点积核心;AXI DMA 经 HP0 端口访问 PS DDR。

SW

软件

PYNQ Linux(Ubuntu 18.04)、Python 3.6.5、NumPy 1.13.3。

DATA

输入与测量

1024 维 INT8 向量,INT32 累加。CPU 取 7 组中位数;DMA 每个批量预热 10 次后测量 100 次。

实测数据

四种实测路径与一个计算上限

执行路径测试方式每向量中位延迟吞吐率
Cortex-A9 纯 Python单向量;7 组,每组 200 次1287.380 μs0.795 MMAC/s
Cortex-A9 NumPy INT32单向量;7 组,每组 5000 次28.686 μs35.697 MMAC/s
PL:JTAG + AXI GPIO单向量;5 次中位数1,202,241 μs0.000852 MMAC/s
PL:AXI DMA批量 256;100 次中位数5.838 μs175.394 MMAC/s
PL 双 MAC 核心上限(计算值)512 周期,不含传输5.120 μs200 MMAC/s

以上均为 1024 维 INT8 向量。CPU、GPIO 和 DMA 行的延迟都是端到端实测;DMA 行采用批量 256,并按向量数折算。核心上限不含 DMA 启动、DDR 访问和软件轮询。

AXI DMA 批量对比

每次传入向量数NumPy 延迟 / 向量NumPy 吞吐率PL DMA 延迟 / 向量PL DMA 吞吐率PL 相对 NumPy
125.669 μs39.892 MMAC/s187.628 μs5.458 MMAC/s0.14×
413.940 μs73.457 MMAC/s47.195 μs21.697 MMAC/s0.30×
1615.202 μs67.358 MMAC/s16.270 μs62.939 MMAC/s0.93×
6414.409 μs71.067 MMAC/s7.796 μs131.357 MMAC/s1.85×
12814.455 μs70.842 MMAC/s6.484 μs157.918 MMAC/s2.23×
25614.670 μs69.802 MMAC/s5.838 μs175.394 MMAC/s2.51×

结果说明

结果一致

DMA 板测覆盖 8、31 和 1024 维,结果与 NumPy 一致。1024 维模式支持一次传入多个向量并连续返回结果。

单次传输不占优势

批量 1 时,PL 延迟为 187.628 μs,NumPy 为 25.669 μs。批量达到 64 后,DMA 启动和轮询开销被摊薄,PL 才开始快于 NumPy。

资源与时序

DMA overlay 使用 2869 LUT、3732 个寄存器和 2 个 BRAM Tile;PL 时钟 100 MHz,WNS 为 0.139 ns。

测试范围

这些数据只说明 INT8 点积在当前软硬件和批量条件下的表现,不代表完整文本向量检索。平方范数、余弦相似度、Top-K 和 PS 侧轻量向量模型不在本次测试范围内。

← 返回研究