2. 开发环境与工具链搭建

Agilex 算法加速开发不是“装一个 IDE 就能跑”的流程,而是由主机侧编译、设备侧综合、板级运行三层工具共同支撑。主机侧负责 OpenCL/HLS/oneAPI 源码编译与主机程序构建,设备侧由 Quartus Prime Pro 完成 RTL 综合、布局布线和比特流生成,板级则依赖 BSP 与驱动把加速器真正加载到 FPGA 上。本节按“安装—验证—上板”的顺序,把这条工具链搭起来,并用一个向量加法加速器完成首次上板验证。

一、工具链组成与版本匹配

Agilex 的加速开发通常涉及以下组件,它们之间存在严格的版本对应关系,混用版本是后续报错的主要来源:

  • Quartus Prime Pro:负责 Agilex 器件的综合、布局布线、时序分析和比特流生成,需选择支持目标器件(如 AGF014、AGIB027 等)的版本,例如 23.4 或 24.1。
  • Agilex 器件支持包:在 Quartus 安装器中勾选对应器件系列,否则打开工程时会提示“device not supported”。
  • OpenCL/HLS/oneAPI 工具链:Intel FPGA SDK for OpenCL 或 oneAPI DPC++/C++ 编译器,用于把内核代码编译为 RTL 或直接生成可编程比特流。
  • 板级支持包(BSP):由板卡厂商提供,包含引脚约束、时钟定义、DDR 接口、PCIe 配置以及板级驱动,是加速器能“落到具体板子”的关键。
  • 驱动与运行时:主机侧需要安装 PCIe 驱动和 OpenCL 运行时,才能通过 clGetPlatformIDs 枚举到 Agilex 加速卡。
建议先确定板卡型号和 BSP 版本,再反推 Quartus 与 oneAPI 版本,而不是先装最新版 Quartus。BSP 的 release note 中通常会写明“已验证的 Quartus 版本”。

二、安装与基础验证

安装完成后,先做三项基础验证,确认工具链本身可用:

# 1. 检查 Quartus 版本与器件支持
quartus_sh --version
quartus_sh --list_devices | grep -i agilex

# 2. 检查 oneAPI/OpenCL 编译器
dpcpp --version
aoc --version

# 3. 检查主机是否能枚举到加速平台
aocl diagnose

aocl diagnose 会输出平台名称、设备数量、PCIe 链路宽度和驱动状态。若显示 DIAGNOSTIC_PASSED,说明主机侧驱动与运行时已就绪;若显示 No devices found,优先检查 PCIe 是否被 BIOS 识别、驱动是否加载(lsmod | grep fpga)。

三、BSP 与驱动安装要点

BSP 通常以压缩包形式提供,解压后需要设置环境变量并安装板级驱动:

export AOCL_BOARD_PACKAGE_ROOT=$PWD/agilex_board_pkg
export PATH=$AOCL_BOARD_PACKAGE_ROOT/bin:$PATH
source $AOCL_BOARD_PACKAGE_ROOT/init_env.sh

# 安装 PCIe 驱动(需 root 权限)
cd $AOCL_BOARD_PACKAGE_ROOT/driver
sudo ./install.sh

安装后再次执行 aocl diagnose,应能看到板卡名称和 Board Interface Test 通过。若驱动安装失败,常见原因是内核头文件缺失或 Secure Boot 未关闭,需先解决系统层面问题再继续。

四、首个向量加法加速器上板验证

用一个最小内核验证整条链路:C[i] = A[i] + B[i]。内核代码保存为 vector_add.cl:

__kernel void vector_add(__global const float *A,
                         __global const float *B,
                         __global float *C,
                         const int N) {
    int i = get_global_id(0);
    if (i < N) C[i] = A[i] + B[i];
}

主机程序负责分配缓冲区、拷贝数据、设置 NDRange 并读回结果。编译命令如下:

# 生成中间 RTL 并综合为比特流
aoc -march=emulator vector_add.cl -o vector_add_emu
aoc vector_add.cl -o vector_add.aocx --board=$AOCL_BOARD_PACKAGE_ROOT

# 运行主机程序
./host vector_add.aocx

首次编译耗时较长(示例中约 40~90 分钟,取决于器件规模与主机性能),属于正常现象。运行后应输出类似:

Platform: Agilex PCIe Acceleration Card
Device  : AGF014
N = 1024
C[0] = 3.000000  (expected 3.000000)
C[1] = 5.000000  (expected 5.000000)
...
PASS: all 1024 elements match

判断上板成功的依据有三条:aocl diagnose 通过、主机程序能枚举到设备、向量加法结果与 CPU 参考值逐元素一致。若结果不一致,优先检查 NDRange 是否覆盖全部元素、缓冲区是否使用了正确的 CL_MEM_READ_WRITE 标志,以及内核参数顺序是否与主机调用一致。

Agilex 加速开发工具链与上板验证路径 主机侧(Host) vector_add.cl 内核源码 host.cpp 主机程序 aoc / dpcpp 编译器 设备侧(Device) Quartus Prime Pro 综合 布局布线 / 时序分析 生成 .aocx 比特流 板级(Board) BSP 引脚/时钟约束 PCIe 驱动 + 运行时 Agilex 加速卡 AGF014 上板验证流程与判断依据 ① 环境检查 aocl diagnose ② 编译内核 aoc → .aocx ③ 运行主机程序 ./host vector_add.aocx ④ 结果比对 C[i] vs A[i]+B[i] 若结果不一致:检查 NDRange 覆盖、缓冲区标志、参数顺序 若设备未枚举:检查 PCIe 识别、驱动加载、Secure Boot

五、常见问题与排查顺序

首次搭建环境时,问题往往集中在版本、驱动和约束三处。建议按以下顺序排查:

  1. 器件不支持:确认 Quartus 安装时勾选了 Agilex 器件包,且 BSP 声明的器件型号与板卡一致。
  2. aocl diagnose 找不到设备:检查 lspci | grep -i altera 是否有输出,若无输出说明 PCIe 枚举失败,需检查插槽、供电和 BIOS 设置。
  3. 驱动加载失败:查看 dmesg | tail -50,常见原因是内核版本与驱动不匹配,需重新编译驱动模块。
  4. 编译报错“board package not found”:确认 AOCL_BOARD_PACKAGE_ROOT 已正确导出,且路径下存在 board_env.xml。
  5. 结果不一致:先用 -march=emulator 在 CPU 上验证内核逻辑,再上板运行,可快速区分是算法问题还是硬件问题。
首次上板编译时间较长,建议先用小规模 N(如 1024)验证流程,确认无误后再扩大数据规模。不要在第一次编译时就使用完整数据集,否则一旦失败,排查成本很高。