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.rhkb.cn/news/331513.html

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

相关文章

零拷贝(Zero-Copy)

1.背景 现在有这样一个场景&#xff0c;我们需要在本地选择一个文件后&#xff0c;然后上传到网络上。 我们再看看文件的内容数据的具体搬运过程&#xff1a; 你会发现&#xff0c;在整个文件搬运的过程中&#xff0c;发生了多次的数据拷贝和上下文转换。 4次数据拷贝&#…

Git总结超全版

最近想系统的回顾一下Git的使用&#xff0c;如果只想快速的集成git到idea&#xff0c;可以参考另一篇我的博客中的git部分 目录 版本管理工具简介Git安装与配置Git远程仓库配置 Git常用命令为常用命令配置别名(可选)Git忽略文件.gitignore一些概念*本地仓库操作删除仓库内容 *远…

Wireshark 4.2.5:发现 QUIC 和 VXLAN 协议的新功能

Wireshark 是一种先进且广泛使用的网络协议分析仪&#xff0c;最近发布了新版本 4.2.5&#xff0c;它提供了许多新功能和改进。 Wireshark 4.2.5 发行说明 什么是 Wireshark&#xff1f; Wireshark 是世界上最流行的网络协议分析器。它用于故障排除、分析、开发和教育。 Wiresh…

Elasticsearch 分析器的高级用法一(同义词,高亮搜索)

Elasticsearch 分析器的高级用法一&#xff08;同义词&#xff0c;高亮搜索&#xff09; 同义词简介分析使用同义词案例 高亮搜索高亮搜索策略unifiedplainvh 同义词 简介 在搜索场景中&#xff0c;同义词用来处理不同的查询词&#xff0c;有可能是想表达相同的搜索目标。 例…

系统架构师考试(九)

TCP/IP协议族 SMTP是简单邮件传输协议 DNS 域名解析协议 URL - IP&#xff0c;通过URL解析ip是哪一台电脑 DHCP 动态IP地址分配的协议 SNMP 简单网络管理协议 TFTP 简单文件管理协议 ICMP 是网络中差错校验&#xff0c;差错报错的协议 IGMP G是组&#xff0c;组…

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…

了解K8s集群kubectl命令进行陈述式资源管理

前言 在 Kubernetes 集群中&#xff0c;通过陈述式和声明式资源管理是确保应用程序高效运行的关键。认识这两种管理方法&#xff0c;能够更好地掌握 Kubernetes 集群的运维和管理。 目录 一、K8s 资源管理操作分类 1. 陈述式 2. 声明式 3. K8s 集群管理常用命令概览 二…

Docker Desktop安装和如何在WSL2中使用Docker

最近在使用WSL的过程中&#xff0c;想使用docker遇到了一些问题&#xff0c;在WSL中安装Linux版本的docker&#xff0c;启动镜像之后不能从Windows机器的端口映射出来&#xff0c;查了一圈之后&#xff0c;发现应该使用Docker Desktop软件&#xff0c;下面是安装和使用的方式 …

2、xss-labs之level2

1、打开页面 2、传入xss代码 payload&#xff1a;<script>alert(xss)</script>&#xff0c;发现返回<script>alert(xss)</script> 3、分析原因 打开f12&#xff0c;没什么发现 看后端源码&#xff0c;在这form表单通过get获取keyword的值赋给$str&am…

基于Keras的手写数字识别(附源码)

目录 引言 为什么要创建虚拟环境&#xff0c;好处在哪里&#xff1f; 源码 我修改的部分 调用本地数据 修改第二层卷积层 引言 本文是博主为了记录一个好的开源代码而写&#xff0c;下面是代码出处&#xff01;强烈建议收藏&#xff01;【深度学习实战—1】&#xff1a…

Spring Web MVC(2)

响应 Http响应的结果可以是数据也可以是静态页面可以针对响应设置状态码 Header信息 返回静态页面注解RestController和Controller 我们创建一个前端页面 package com.example.demo.demos.web.controller;import org.springframework.web.bind.annotation.RequestMapping; i…

Rolla‘s homework:Image Processing with Python Final Project

对比学习Yolo 和 faster rcnn 两种目标检测 要求 Image Processing with Python Final Project Derek TanLoad several useful packages that are used in this notebook:Image Processing with Python Final Project Project Goals: • Gain an understanding of the object …

海康威视硬盘录像机NVR连接公网视频监控平台,注册失败,抓包发现有403 forbidden的问题解决

目录 一、问题描述 二、问题定位 1、查看DVR的配置 2、查看需要使用的端口是否开放 3、查看日志 4、抓包 &#xff08;1&#xff09;找出错误 &#xff08;2&#xff09;查看数据包内容 三、问题分析 1、国标28181中的域的概念 2、域应该如何定义 &#xff08;1&am…

蓝桥杯备赛——DP【python】

一、小明的背包1 试题链接&#xff1a;https://www.lanqiao.cn/problems/1174/learning/ 问题描述 输入实例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 37 问题分析 这里我们要创建一个DP表&#xff0c;DP&#xff08;i&#xff0c;j&#xff09;表示处理到第i个物品时消耗j体…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG&#xff0c;知道它的工作原理就是一个12位递减计数器不断递减计数&#xff0c;当减到0之前还未进行喂狗的话&#xff0c;产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似&#xff0c;它是一个7位递减计数器不断的往…

C语言之指针进阶(3),函数指针

目录 前言&#xff1a; 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结&#xff1a; 前言&#xff1a; 本文主要讲述C语言指针中的函数指针&#xff0c;包括函数指针变量的概念、创建…

aws msk加密方式和问控制连接方式

msk加密方式 msk提供了两种加密方式 静态加密传输中加密 创建集群时可以指定加密方式&#xff0c;参数如下 aws kafka create-cluster --cluster-name "ExampleClusterName" --broker-node-group-info file://brokernodegroupinfo.json --encryption-info file:/…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统&#xff0c;数据库为mysql&#xff0c;可用于日常学习和毕设&#xff0c;系统分为管理员、房东、用户&#xff0c;部分截图如下所示&#xff1a; 部分界面截图 用户 管理员 联系我 微信&#xff1a;Zzllh_

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…