Vitis HLS 学习笔记--控制驱动任务示例

目录

1. 简介

2. 代码解析

2.1 kernel 代码回顾

2.2 功能分析

2.3 查看综合报告

2.4 查看 Schedule Viewer

2.5 查看 Dataflow Viewer

3. Vitis IDE的关键设置

3.1 加载数据文件

3.2 设置 Flow Target

3.3 配置 fifo 深度

4. 总结


1. 简介

本文对《Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动-CSDN博客》中控制驱动任务的示例进行了详细解析。

通过分析 kernel 代码,理解了 diamond 函数及其内部各功能模块(funcA、funcB、funcC、funcD)的实现方式和并行处理机制。

2. 代码解析

2.1 kernel 代码回顾

#include "diamond.h"void diamond(data_t vecIn[N], data_t vecOut[N]) {data_t c1[N], c2[N], c3[N], c4[N];
#pragma HLS dataflowfuncA(vecIn, c1, c2);funcB(c1, c3);funcC(c2, c4);funcD(c3, c4, vecOut);
}void funcA(data_t* in, data_t* out1, data_t* out2) {
#pragma HLS inline off
Loop0:for (int i = 0; i < N; i++) {
#pragma HLS pipelinedata_t t = in[i] * 3;out1[i] = t;out2[i] = t;}
}void funcB(data_t* in, data_t* out) {
#pragma HLS inline off
Loop0:for (int i = 0; i < N; i++) {
#pragma HLS pipelineout[i] = in[i] + 25;}
}void funcC(data_t* in, data_t* out) {
#pragma HLS inline off
Loop0:for (data_t i = 0; i < N; i++) {
#pragma HLS pipelineout[i] = in[i] * 2;}
}void funcD(data_t* in1, data_t* in2, data_t* out) {
#pragma HLS inline off
Loop0:for (int i = 0; i < N; i++) {
#pragma HLS pipelineout[i] = in1[i] + in2[i] * 2;}
}

2.2 功能分析

void diamond(data_t vecIn[100], data_t vecOut[100])

{

  data_t c1[100], c2[100], c3[100], c4[100];

#pragma HLS dataflow

  funcA(vecIn, c1, c2);

  funcB(c1, c3);

  funcC(c2, c4);

  funcD(c3, c4, vecOut);

}

2.3 查看综合报告

  • diamond 主函数中,Pipelined 一列的标志为:dataflow
+ Performance & Resource Estimates: PS: '+' for module; 'o' for loop; '*' for dataflow+--------------------------+------+------+---------+-----------+----------+---------+------+----------+--------+----+------------+-----------+-----+|          Modules         | Issue|      | Latency |  Latency  | Iteration|         | Trip |          |        |    |            |           |     ||          & Loops         | Type | Slack| (cycles)|    (ns)   |  Latency | Interval| Count| Pipelined|  BRAM  | DSP|     FF     |    LUT    | URAM|+--------------------------+------+------+---------+-----------+----------+---------+------+----------+--------+----+------------+-----------+-----+|+ diamond*                |     -|  0.00|      452|  4.520e+03|         -|      175|     -|  dataflow|  4 (1%)|   -|  1433 (~0%)|  3208 (2%)|    -|| + funcA                  |     -|  0.00|      174|  1.740e+03|         -|      174|     -|        no|       -|   -|   222 (~0%)|  652 (~0%)|    -||  + funcA_Pipeline_Loop0  |     -|  0.00|      103|  1.030e+03|         -|      103|     -|        no|       -|   -|    86 (~0%)|  123 (~0%)|    -||   o Loop0                |     -|  7.30|      101|  1.010e+03|         3|        1|   100|       yes|       -|   -|           -|          -|    -|| + funcB                  |     -|  5.18|      102|  1.020e+03|         -|      102|     -|        no|       -|   -|    17 (~0%)|   81 (~0%)|    -||  o Loop0                 |     -|  7.30|      100|  1.000e+03|         2|        1|   100|       yes|       -|   -|           -|          -|    -|| + funcC                  |     -|  5.95|      102|  1.020e+03|         -|      102|     -|        no|       -|   -|    17 (~0%)|   66 (~0%)|    -||  o Loop0                 |     -|  7.30|      100|  1.000e+03|         2|        1|   100|       yes|       -|   -|           -|          -|    -|| + entry_proc             |     -|  5.46|        0|      0.000|         -|        0|     -|        no|       -|   -|     2 (~0%)|   20 (~0%)|    -|| + funcD                  |     -|  0.00|      174|  1.740e+03|         -|      174|     -|        no|       -|   -|   183 (~0%)|  692 (~0%)|    -||  + funcD_Pipeline_Loop0  |     -|  0.00|      103|  1.030e+03|         -|      103|     -|        no|       -|   -|    47 (~0%)|  131 (~0%)|    -||   o Loop0                |     -|  7.30|      101|  1.010e+03|         3|        1|   100|       yes|       -|   -|           -|          -|    -|+--------------------------+------+------+---------+-----------+----------+---------+------+----------+--------+----+------------+-----------+-----+
  • vecIn、vecOut 的映射关系,可以观察到是 m_axi_gmem 接口。
  • vecInvecOut 非本地存储器,因此采用控制驱动 TLP 模型; 
* SW-to-HW Mapping
+----------+---------------+-----------+----------+------------------------------------+
| Argument | HW Interface  | HW Type   | HW Usage | HW Info                            |
+----------+---------------+-----------+----------+------------------------------------+
| vecIn    | m_axi_gmem    | interface |          |                                    |
| vecIn    | s_axi_control | register  | offset   | name=vecIn_1 offset=0x10 range=32  |
| vecIn    | s_axi_control | register  | offset   | name=vecIn_2 offset=0x14 range=32  |
| vecOut   | m_axi_gmem    | interface |          |                                    |
| vecOut   | s_axi_control | register  | offset   | name=vecOut_1 offset=0x1c range=32 |
| vecOut   | s_axi_control | register  | offset   | name=vecOut_2 offset=0x20 range=32 |
+----------+---------------+-----------+----------+------------------------------------+

2.4 查看 Schedule Viewer

可以看到 funcB 和 funcC 被并行执行。 

2.5 查看 Dataflow Viewer

可以看到 vecOut 被设置成 FIFO,而 c1、c2、c3、c4 被设置为 PIPO。

3. Vitis IDE的关键设置

3.1 加载数据文件

需要添加验证数据文件,直接将其放在导航树 Test Bench 分支之下即可。

3.2 设置 Flow Target

将 Flow Target 设置成 Vitis Kernel Flow Target

区分 Vitis Kernel 和 Vivado IP Flow Taget

Vivado IP 流程和 Vitis 内核流程是两种不同的开发流程,它们在设计目标、灵活性和接口要求方面有所区别:

  • Vivado IP 流程

设计灵活性:Vivado IP 流程提供了更大的设计灵活性。开发者可以自定义代码以实现广泛的接口标准,以满足特定的设计目标。
接口要求:几乎没有限制,可以根据需要选择不同的接口标准。
RTL开发:Vivado IP 流程专注于RTL开发,允许开发者使用Vivado工具直接编辑RTL代码,进行仿真验证,综合布局布线,以及时序分析。
IP封装:开发者可以将RTL代码封装为IP,以便在Vivado Design Suite中使用。

  • Vitis 内核流程

特定要求和限制:Vitis 内核 (.xo) 是一种特殊类型的Vivado IP,它具有特定的要求和限制,例如必须遵循Vitis内核流程的接口标准。
自动化:Vitis HLS工具可以自动执行代码修改操作,如为函数实参生成接口,以及对代码内的循环和函数执行流水线化。
应用加速:主要用于Vitis应用加速开发流程中,在可编程逻辑中实现和最优化C/C++代码,以实现低时延和高吞吐量。
接口推断:Vitis HLS的基本作用是通过推断所需的编译指示来为函数实参生成正确的接口。

  • Vitis Kernel Flow Target 的默认接口协议

Vitis 内核流程的默认执行模式为流水打拍执行,即启用内核的重叠执行以改善吞吐量。

  • Vivado IP Flow Target 的默认接口协议

对于以上表格中范例的细化解释:

3.3 配置 fifo 深度

查看 DATAFLOW fifo 的默认深度:

也可以通过编译器指令进行配置:

# Set any optimization directives
config_dataflow -default_channel fifo -fifo_depth 2

4. 总结

本文对《Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动-CSDN博客》中的控制驱动任务示例进行了详细解析,重点分析了 kernel 代码的并行处理机制及各模块的实现。通过查看综合报告、Schedule Viewer 和 Dataflow Viewer,确认了 funcB 和 funcC 的并行执行和 vecOut 的 FIFO 设置。并介绍了 Vitis IDE 的关键设置,包括数据文件加载、Flow Target 配置及 FIFO 深度调整。总结了 Vivado IP 流程与 Vitis 内核流程的区别,帮助理解两者在设计灵活性、接口要求及应用场景上的不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【编译原理】词法分析器的设计与实现

一、实验目的 通过设计编制调试一个具体的词法分析程序&#xff0c;加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程&#xff0c;从输入的源程序中&#xff0c;识别出各个具有独立意义的单词&…

SQLmap学习以及题解运用

1.简介 SQLmap是一款开源的SQL注入工具&#xff0c;用于检测和利用Web应用程序的SQL注入漏洞。SQLmap支持多种数据库管理系统&#xff0c;包括MySQL、Oracle、PostgreSQL、Microsoft SQL Server、SQLite等&#xff0c;并支持各种不同的操作系统和平台。 这里主要分为四大部分…

同余定理性质

在算法题中碰到的这个同余定理定理&#xff0c;记录一下性质

机器学习之常用算法与数据处理

一、机器学习概念&#xff1a; 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、计算机科学等多门学科。它的核心概念是通过算法让计算机从数据中学习&#xff0c;改善自身性能。机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识…

Android Low Storage机制之DeviceStorageMonitorService

一、Android 版本 Android 13 二、low storage简介(DeviceStorageMonitorService) 设备存储监视器服务是一个模块&#xff0c;主要用来&#xff1a; 1.监视设备存储&#xff08;“/ data”&#xff09;。 2.每60秒扫描一次免费存储空间(谷歌默认值) 3.当设备的存储空间不足…

【项目】教你手把手完成博客系统(三)显示用户信息 | 实现退出登录 | 实现发布博客

文章目录 教你手把手完成博客系统&#xff08;三&#xff09;7.实现显示用户信息1.约定前后端交互接口2.前端通过ajax发起请求3.服务器处理请求 8.实现退出登录1.约定前后端的接口2.前端发起请求3.服务器处理请求 9.实现发布博客1.约定前后端的交互接口2.前端构造请求3.服务器处…

齐护K210系列教程(三十)_多任务切换

多任务切换 1&#xff0c;任务1的设定2&#xff0c;任务2的设定3&#xff0c;主程序4&#xff0c; 课程资源联系我们 在开发项目时&#xff0c;我们常会用到AIstart的多个任务来切换应用&#xff0c;比如当我识别到某种卡片时&#xff0c;要切换到别的任务&#xff0c;这样就要…

CentOS-7安装教程

目录 安装 修改主机名 配置静态IP 镜像下载地址 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso VMware Workstation Pro下载 VMware Workstation Pro各版本下载&#xff08;2024.5.5之后&#xff09;(Windows与Linux安装包不限…

【okhttp】小问题记录合集

can’t create native thread 问题描述 OkHttpClient 每次使用都new创建&#xff0c;造成OOM&#xff0c;提示can’t create native thread… 问题分析 没有将OkHttpClient单例化. 每个client对象都有自己的线程池和连接池&#xff0c;如果为每个请求都创建一个client对象&a…

视频推拉流EasyDSS系统如何在清理缓存文件的同时不影响缓存读写?

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户咨询&#xff0c;视频推…

Git 的安装和使用

一、Git 的下载和安装 目录 一、Git 的下载和安装 1. git 的下载 2. 安装 二、Git 的基本使用-操作本地仓库 1 初始化仓库 1&#xff09;创建一个空目录 2&#xff09;git init 2 把文件添加到版本库 1&#xff09;创建文件 2&#xff09;git add . 3&#xff09;g…

在SpringBoot自定义指标并集成Prometheus和Grafana监控

前沿 写这篇文章的目的是发现自己整天埋头写业务代码但忽略了主动发现问题的能力&#xff0c;这里指的是监控和报警。结合工作中发现Prometheus和Grafana还是主流一些。本文介绍如何使用自定义指标&#xff0c;并使用Prometheus进行监控并报警&#xff0c;同时在 Grafana 进行…

重学java 40.多线程 — 死锁和线程状态

—— 24.5. 一、死锁 1.死锁介绍&#xff08;锁嵌套就有可能产生死锁&#xff09; 指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁 例&#xff1a; 两线程处于互相等待的状态&a…

上位机图像处理和嵌入式模块部署(mcu常见三种烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和单纯的windows上位机开发、嵌入式linux开发不一样&#xff0c;mcu的开发&#xff0c;是需要通过烧录器把编译好的镜像烧入到开发板里面的。这是很…

STM32通用定时器的应用实例(基于STM32F103)

目录 概述 1 STM32Cube配置项目 1.1 准备环境 1.2 配置项目参数 1.3 生成Project 2 HAL函数 2.1 初始化函数&#xff1a;HAL_TIM_Base_Init 2.2 中断模式启动定时器函数&#xff1a;HAL_TIM_Base_Start 2.3 定时器回调函数&#xff1a; HAL_TIM_PeriodElapsedCallback…

ElasticSearch操作之重置密码脚本

ElasticSearch操作之重置密码脚本 #!/bin/bash # 使用样例 ./ES密码重置.sh 旧密码 新密码# 输入旧密码 es_old_password$1# 设置新的密码变量 es_password$2# 正确响应 es_reponse{"acknowledged":true}# 检查Elasticsearch是否在运行 if pgrep -f elasticsearch &g…

2024年5月计算机视觉论文推荐:包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题

我们今天总结下2024年5月发表的最重要的论文&#xff0c;重点介绍了计算机视觉领域的最新研究和进展&#xff0c;包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题。 Diffusion Models 1、Dual3D: Efficient and Consistent Text-to-3D Ge…

【C++题解】1697. 请输出n~1之间所有的整数

问题:1697. 请输出n~1之间所有的整数 类型&#xff1a;循环 题目描述&#xff1a; 从键盘读入一个整数 n &#xff0c;请输出 n∼1 之间所有的整数&#xff0c;每行输出 1 个。 比如&#xff0c;假设读入 n5 &#xff0c;输出结果如下&#xff1a; 5 4 3 2 1 输入&#xff1…

Java进阶学习笔记4——Static应用知识:代码块

代码块&#xff1a; 代码块是类的五大成员之一&#xff08;成员变量、构造器、方法、代码块、内部类&#xff09;。 Java类生命周期&#xff1a;加载、验证、准备、初始化、卸载。 代码块分为两种&#xff1a; 静态代码块&#xff1a; 格式&#xff1a;static {} 特点&…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…