【Vitis Accel】3 - HLS Kernel 示例代码分析(1/2)

本文深入分析 Vitis 加速平台中HLS Kernel的实现,以vadd为例,详细解读代码结构、关键词、参数定义和数据流dataflow,探讨如何高效实现数据在Host和Kernel间的流动,以及利用Dataflow pragma实现并行计算。


前言

前一篇文章大致介绍了 Vitis 开发环境,那么接下来通过实现向量加法的简单 Hello World 进一步了解 Vitis 的 Host 和 Kernel 结构。

工程文件:Github - Hello World (HLS C/C++ Kernel)


代码分析:Kernel - vadd.cpp

1. 代码结构

代码结构:load / compute / store
在这里插入图片描述

2. 关键词解释

  • load / store:尽可能高效地完成数据在 Kernel 和 Host 之间的流动
  • compute:表现为一系列运算函数(compute functions),数据通过 HLS streams 传递,包含一组嵌套的循环。
  • HLS steams:hls::stream在运算函数之间传递数据,具有阻塞(blocking)逻辑的特征,可以在函数之间同步变量值
  • Dataflow pragma:指示 compiler 使能任务级(task-level)流水,是并行、流水执行 load / compute / store 的必要步骤
  • vector 数据类型:hls::vector,vector 的长度由 I/O 端口的宽度决定。将计算单元的宽度设置成与 I/O 端口的宽度相同可以更高效的使用资源。

3. 代码逐段分析

3.1 参数定义

// vdd.cpp line 61-70
// Includes
#include <hls_vector.h>
#include <hls_stream.h>
#include "assert.h"

#define MEMORY_DWIDTH 512
#define SIZEOF_WORD 4
#define NUM_WORDS ((MEMORY_DWIDTH) / (8 * SIZEOF_WORD))

#define DATA_SIZE 4096

// TRIPCOUNT identifier
const int c_size = DATA_SIZE;
  • 可以在 Includes中看到我们将要使用的两种数据类型hls::streamhls::vector。前者在运算函数之间阻塞地传递数据,后者主要用于 I/O 端口。

  • 在计算NUM_WORDS时,由于一个 kernel 端口的最大值为 512 bits,因此有

    NUM_WORDS = 512 bits / (8 bits per byte * 4 byte per word)

  • DATA_SIZE规定了我们实际需要运算的数据长度,一般远长于 I/O 端口宽度。在本例中,我们待求和的数据是DATA_SIZE个 int 型数据

// host.cpp line 29
size_t vector_size_bytes = sizeof(int) * DATA_SIZE;
  • 最后一句对tripcount的设置与 HLS pragma loop_tripcount 的设置有关。语法为

    #pragma HLS loop_tripcount min=<int> max=<int> avg=<int>
    

    min, max, avg 分别对应循环迭代的最小、最大和平均次数。

    系列的第一篇文章

<think>好的,我现在要处理用户的问题:运行`./host.exe kernel.hw.xclbin`时出现错误,提示无法打开索引为0的设备,导致核心转储。用户之前已经遇到了缺少库的问题,现在解决了库的问题后又遇到新的错误。我需要分析可能的原因,并提供解决方案。 首先,错误信息显示`Could not open device with index &#39;0&#39;`。这通常意味着应用程序尝试访问FPGA设备时失败。可能的原因有几个: 1. **Xilinx Runtime (XRT) 未正确安装或配置**:XRT是管理FPGA设备通信的关键组件,如果安装不正确或者版本不匹配,可能导致无法识别设备。 2. **FPGA设备未被系统正确识别**:可能设备驱动未加载,或者用户没有足够的权限访问设备。 3. **设备索引错误**:应用程序可能默认使用索引0的设备,但实际设备索引可能不同,或者根本没有设备可用。 4. **XCLBIN文件问题**:提供的xclbin文件可能与当前硬件或XRT版本不兼容。 接下来,我需要逐步排除这些可能。首先,检查XRT的安装是否正确,用户之前可能已经安装了XRT,但需要验证是否安装完整,版本是否匹配。然后,确认FPGA设备是否被系统识别,使用`xbutil list`命令查看设备列表。如果设备未列出,可能是驱动问题或硬件连接问题。 另外,用户权限也是一个常见问题,尤其是在Linux系统中,普通用户可能需要添加到特定的用户组(如`render`组)才能访问设备。此外,检查设备索引是否正确,有时可能需要指定不同的索引或通过BDF(总线-设备-函数)来定位设备。 还要考虑xclbin文件是否正确生成,是否与目标设备兼容。如果使用旧版本的XRT或Vitis工具生成的xclbin文件,可能与当前环境不匹配,需要重新编译。 最后,确保所有环境变量设置正确,例如`XILINX_XRT`指向正确的安装路径,并且相关库路径已正确配置。 总结解决步骤: 1. 确认XRT正确安装并配置。 2. 检查FPGA设备是否被识别,驱动是否正确加载。 3. 验证用户权限,确保有访问设备的权限。 4. 检查xclbin文件的兼容性。 5. 调整设备索引或使用BDF指定设备。</think>### 错误分析及解决方案 这个错误表明程序试图通过Xilinx Runtime (XRT) 访问FPGA设备时失败,具体原因为 `Could not open device with index &#39;0&#39;`。以下是详细原因和解决方法: --- ### 一、核心原因分析 1. **XRT未正确安装或版本不匹配** - Xilinx Runtime (XRT)FPGA设备通信的核心依赖,若未安装、安装不完整或版本与硬件/工具链不兼容,会导致无法识别设备。 2. **FPGA设备未被系统识别** - 设备未连接、驱动未加载、权限不足或硬件未正确初始化。 3. **设备索引错误** - 程序默认使用索引 `0` 的设备,但实际系统中可能不存在该设备,或索引编号与预期不符。 4. **XCLBIN文件不兼容** - `kernel.hw.xclbin` 文件未正确生成,或与当前FPGA硬件/XRT版本不匹配。 --- ### 二、详细解决步骤 #### 1. **验证XRT安装及版本** - **检查XRT安装状态**: ```bash dpkg -l | grep xrt # Ubuntu/Debian rpm -qa | grep xrt # CentOS/RHEL ``` 如果未安装,需从[Xilinx官网下载XRT](https://www.xilinx.com/support/download.html)并安装。 - **检查XRT版本兼容性**: ```bash xbutil --version ``` 确保XRT版本与Vitis工具链及FPGA硬件(如Alveo卡)的文档要求一致。 #### 2. **确认FPGA设备状态** - **列出所有FPGA设备**: ```bash xbutil list ``` - 若输出为空,说明设备未识别,需检查: 1. 设备是否通电并正确连接。 2. 驱动程序是否加载(如Alveo卡需加载`xocl`驱动): ```bash lsmod | grep xocl ``` 3. 重启系统或重新加载驱动: ```bash sudo modprobe xocl ``` - 若设备存在但未激活,尝试重置设备: ```bash xbutil reset -d <设备BDF> ``` - **检查用户权限**: - 普通用户可能无权访问设备,需加入`render`或`fpga`用户组: ```bash sudo usermod -aG render $USER sudo usermod -aG fpga $USER ``` - 注销后重新登录以生效。 #### 3. **验证XCLBIN文件兼容性** - **检查xclbin文件生成环境**: - 确保该文件由当前系统的Vitis工具链生成,且目标设备(如`xilinx_u200_xdma_201830_2`)与物理设备型号一致。 - **验证xclbin文件有效性**: ```bash xclbinutil --info --input kernel.hw.xclbin ``` 输出中应显示支持的设备型号和平台信息。 #### 4. **调整设备索引或指定设备BDF** - **手动指定设备BDF**: 如果设备索引 `0` 无效,可通过总线-设备-函数(BDF)定位设备: ```bash xbutil list # 获取设备的BDF编号(如0000:01:00.0) ./host.exe kernel.hw.xclbin --device 0000:01:00.0 ``` - **修改程序代码**(若为自定义主机代码): 在调用`xclOpen`时,替换设备索引为有效的BDF或索引值。 #### 5. **设置XRT环境变量** - 确保`XILINX_XRT`指向XRT安装路径: ```bash export XILINX_XRT=/opt/xilinx/xrt echo &#39;export XILINX_XRT=/opt/xilinx/xrt&#39; >> ~/.bashrc ``` --- ### 三、附加调试方法 1. **启用XRT调试日志**: ```bash export XRT_DEBUG=1 ./host.exe kernel.hw.xclbin ``` 日志会显示详细的设备初始化过程。 2. **检查dmesg日志**: ```bash dmesg | grep xocl ``` 查看内核是否有设备加载错误(如PCIe通信失败)。 --- ### 四、常见问题示例 1. **设备被其他进程占用**: - 关闭其他使用FPGA的进程,或重启系统释放资源。 2. **多设备冲突**: - 若系统中有多个FPGA设备,明确指定目标设备的BDF。 3. **旧版本XRT残留文件**: - 完全卸载旧版XRT并重新安装: ```bash sudo apt purge xrt # Ubuntu sudo yum remove xrt # CentOS ``` --- ### 五、总结流程图 ``` 设备无法访问问题排查流程 ├─ 检查XRT安装 → 重装/升级XRT ├─ 列出设备 → 设备未识别 → 检查连接/驱动 ├─ 设备存在但无权限 → 加入用户组 ├─ 设备索引错误 → 使用BDF指定设备 └─ XCLBIN不兼容 → 重新生成xclbin文件 ``` 通过以上步骤,应能定位并解决FPGA设备访问失败的问题。如果问题仍然存在,建议提供`xbutil list`和`dmesg`输出以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值