4 加速/协同处理的最佳实践
4.1 吞吐量与延迟
传统的硬件加速基于增强指令集(例如 x86 家族的 MMX 指令、AES 加密扩展以及 ARM 的 NEON 扩展)与使用外部硬件 (如 GPGPU 和 FPGA)的加速之间存在显著差异。由于增强指令集属于处理器执行流程的一部分,它们用较短的机器代码指令序列替换较 长的序列,从而减少了获得结果所需的周期数。
相比之下,外部硬件加速(包括 FPGA 加速)并 不 一定会缩短获得结果的时间,因为 数据往返于外部硬件的传输延迟(latency)相当可观。此外,由于流水线(pipelining)以及可能较低的时钟频率,处理时间也可能比处理器 长得多。
因此,外部硬件加速的优势不在于延迟(获得结果的速度),而在于吞吐量(throughput)(处理数据的速率)。要利用这 一优势,重要的是保持数据 流 进出加速硬件,而不是等待一个操作的结果再启动下一个操作。
关于使用 FPGA 进行正确加速的技术,详见以下两份文档的第 6.6 节:
4.2 数据宽度与性能
对于需要较高数据带宽的应用,建议对数据密集型流使用 32 位宽的流(或更宽)。这是因为 8 位和 16 位宽的流对主机总线 的利用效率较低。
其原因是,这些数据字以总线的速率通过 Xillybus 内部数据路径进行传输。因此,传输一个 8 位字所需的时间与传输一个 32 位字相同,这实际上使其速度慢了四倍。
这也会影响在给定时间竞争底层传输资源的其他流,因为数据路径被较慢的数据元素占用。
此指南不适用于修订版 B/XL/XXL 的 Xillybus IP 核,这些版本传输窄流时具有相同的效率。
4.3 注意事项
使用 Block Design 流程时需注意以下几个问题:
-
Block Design 流程不支持带有地址端口的流(“地址/数据流 (address/data streams)”、“可寻址流 (seekable streams)”)。如果 Xillybus IP 核包含此类流,它们不会在 GUI 中显示为端口,但在主机端会正常出现。主机尝试从这样的流读取数据将立即产生文件结束条件(end-of-file condition)。由于另一端没有数据接收端(data sink),write() 函数调用将不会返回。
因此,建议在专用于 Block Design 流程的定制 IP 核中避免使用可寻址流,以免造成混淆和 FPGA 逻辑的轻微浪费。
-
不要更改名为 “stream_clk_gen”(时钟向导)的模块,除非按照第 3.2.2 节所述必要时更改其输出频 率。
更改输入时钟频率、对配置进行其他更改,或者将其从设计中移除并替换为新的时钟向导 IP 模块,可能导致无法满足时序 约束(可能因为某些时序约束例外(timing constraint exceptions)引用了该模块的名称)。
设置不正确的输入频率可能导致 FPGA 设计行为不可靠。
-
注意时钟的连接方式至关重要。特别是不要混用 bus_clk 和 ap_clk。
-
确保 Xillybus 流是异步流(asynchronous stream)——这在默认 IP 核中以及定制 IP 核中当流的使用意图为“与协处理器进 行数据交换”时的自动选择(autoset choice)中均为此种情况。
这带来的效果之一是,当主机端的 write() 函数调用时,如果 DMA 缓冲区(DMA buffers)中有足够的空间容纳数据,该调 用会立即返回,从而确保更顺畅的数据传输和更高的带宽性能。
关于此主题的更深入理解,请参考 Xillybus Linux 主机应用程序编程指南或 Xillybus Windows 主机应用程序编程指南的第 2 节。
