FPGA accelerators on the NIC enable the offloading of expensive packet processing tasks from the CPU. However, FPGAs have limited resources that may need to be shared among diverse applications, and programming them is difficult. We present a solution to run Linux's eXpress Data Path programs written in eBPF on FPGAs, using only a fraction of the available hardware resources while matching the performance of high-end CPUs. The iterative execution model of eBPF is not a good fit for FPGA accelerators. Nonetheless, we show that many of the instructions of an eBPF program can be compressed, parallelized or completely removed, when targeting a purpose-built FPGA executor, thereby significantly improving performance. We leverage that to design hXDP, which includes (i) an optimizing-compiler that parallelizes and translates eBPF bytecode to an extended eBPF Instruction-set Architecture defined by us; a (ii) soft-CPU to execute such instructions on FPGA; and (iii) an FPGA-based infrastructure to provide XDP's maps and helper functions as defined within the Linux kernel. We implement hXDP on an FPGA NIC and evaluate it running real-world unmodified eBPF programs. Our implementation is clocked at 156.25MHz, uses about 15% of the FPGA resources, and can run dynamically loaded programs. Despite these modest requirements, it achieves the packet processing throughput of a high-end CPU core and provides a 10x lower packet forwarding latency.
翻译:NIC 上的 FPGA 加速器能够卸载来自 CPU 的昂贵的包处理任务 。 但是, FPGA 的资源有限, 可能需要在不同应用程序中共享, 程序程序难度很大 。 我们提出了一个解决方案, 用于运行在 FPGA 上的eBPF eBPF eBGA eXpress Data Path 程序, 运行用在 eBPFGA 上的 eBGA eX 数据路径 eBBGA 程序, 仅使用现有硬件资源的一小部分, 与高端CPFPFGA 的功能匹配。 eBPFP 的迭接合执行模式不适合 FPGA 节节节加速器。 然而, 我们显示, eBPFP 程序的许多指示可以被压缩、 平行或完全删除, 当目标为 FPGA eFGA 执行时, 运行的 eFGA Q IM 程序可以实现 IM 10 IM IM IMD IMD IMD IMFS 和 IMFS 运行 的运行 10 IM IMD IMD IMFS IMD 10 IMD IMFS 的运行 IMD IMD IMD IMD IMFS 的功能, 10 IMD IMFS IMFS 10 IMD 运行 运行 的运行 10 IM IM IM 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 IMS 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 运行 10