Vitis HLS 学习笔记--Schedule Viewer 调度查看器

news2024/11/25 16:22:18

目录

1. 简介

2. Schedule Viewer详解

2.1 视图说明

2.1.1 Operation\Control Step

2.1.2 周期关系图

2.1.3 Schedule Viewer 菜单栏

2.1.4 属性视图

2.2 内容说明

2.2.1 实参(b)解释

2.2.2 实参(a)解释

2.2.3 变量(i)解释

2.2.4 数组操作解释

2.2.5 a*xin[i] 解释

3. 总结


1. 简介

Schedule Viewer 是一个非常有用的工具,它用于展示高级合成过程中算法的执行时间表(即调度)。它有助于您识别阻碍并行化的任意循环依赖关系、时序违例以及数据依赖关系。

大体上,schedule viewer 的用途包括:

可视化展示:Schedule viewer以图形化的方式展示了算法的执行顺序和并行执行的操作,可以看到各个操作是如何在时间线上被安排和执行的。

性能分析:分析设计中的性能瓶颈,设计者可以了解到哪些操作是并行执行的,哪些操作是顺序执行的。

资源利用:Schedule viewer还展示了各个操作使用的资源(如加法器、乘法器等),这有助于优化设计,以减少资源消耗,提高资源利用效率。

调试与优化:当设计未能达到预期性能或存在问题时,schedule viewer可用来识别问题(如数据依赖导致的延迟),并对设计进行相应的调整和优化。

2. Schedule Viewer详解

2.1 视图说明

2.1.1 Operation\Control Step

  • 在视图左侧,显示的是将在 RTL 层级中作为逻辑来实现的操作和循环的名称。
  • 括号里的名称表示操作名称。
  • 操作按拓扑顺序执行。

2.1.2 周期关系图

  • 竖轴虚线,由时钟不确定性而保留的时钟周期部分。
  • 每项操作在表中均显示为灰框。
  • 多周期操作的灰框,中间有一条水平线贯穿。
  • 灰框长度,由操作延迟占总时钟周期百分比来设置。
  • 运算符数据依赖关系显示为蓝色实线,选中时可见。

2.1.3 Schedule Viewer 菜单栏

  • 在报告视图右上角,可提供许多便捷功能。
  • 焦点控制
  • 筛选

按类型筛选可根据操作的功能来限制显示的操作。例如,仅将加法器、乘法器和函数调用可视化会移除“和”与“或”之类的所有小操作。

按集群筛选的作用是充分利用调度程序的功能对基本操作进行分组,然后将其作为单个组件来调度。可启用集群筛选设置来为集群上色,甚至可在查看器内将集群折叠为单一大型操作。这样即可提供更简洁的调度视图。

2.1.4 属性视图

可查看“Schedule Viewer”中选中的特定函数、循环或操作的详细信息。

对于函数或循环,属性视图会显示: 

  • Initiation Interval (II)(启动时间间隔)。
  • Loop Iteration Latency(循环迭代时延):表示完成循环的单次迭代所需的时钟周期数。
  • Latency(时延):表示函数计算所有输出值或者循环完成所有迭代所需的时钟周期数。
  • Pipelined(流水打拍):表示在 RTL 设计中对函数或循环进行流水打拍。
  • Slack(裕量):表示函数或循环的时序裕量。
  • Tripcount(循环次数):表示循环完成的迭代数。
  • Resource Utilization(资源利用):显示用于实现函数或循环的 BRAM、DSP、LUT 或 FF 的数量。

对于运算和存储映射,属性视图会显示:

  • Name(名称):对应包含代码的位置。
  • Op Code(运算码):表示调度的运算,例如,add、sub 和 mult。
  • Op Latency(运算时延):显示运算或存储的绑定的默认时延或指定时延。
  • Bitwidth(位宽):对应运算的位宽。
  • Impl(实现):定义用于指定运算或存储的实现。

2.2 内容说明

以下示例HLS加速代码,实现了一个简单的线性函数y = ax + b,对输入数组xin中的每个元素应用这个函数,然后将结果存储在输出数组yo中。

#include <ap_int.h>

void func(ap_int<8>  xin[3],
          ap_int<8>  a,
          ap_int<8>  b,
          ap_int<17> yo[3])
{
    int i = 0;
loop:
    for(i = 0; i < 3; i++)
    {
        yo[i] = a * xin[i] + b;
    }
}

完成C Synthesis后,单击Schedule Viewer可启动视图。

2.2.1 实参(b)解释

实参(b)共包含三个操作:

  • 读取操作,8bit
  • 带符号的位宽扩展(sign extension),16bit
  • 加法操作,Impl=dsp48,Op Latency=1

注:名称sext_In10,命名包含了此代码的位置信息,虽然此信息可能不准^_^。。。

2.2.2 实参(a)解释

实参(a)同样包含三个操作: 

  • 读取操作,8bit
  • 带符号的位宽扩展,16bit
  • 乘法操作,Impl=dsp48,Op Latency=2

lhs(left-hand side),左值是指赋值语句中被赋值的变量。lhs(sext)结合起来表示,将符号扩展后的值赋值给一个变量或表达式。

2.2.3 变量(i)解释

变量(i)共包含五个操作:

  • load操作,2bit
  • 整数比较icmp,输出1bit,Impl=auto,用于决定执行分支(br)
  • 加法操作,2bit,Impl=fabric,变量i的自增
  • 强制类型转换(zero extension),输出64bit,用于寻址xin数组
  • 回写操作

注:零扩展(zero extension)是一种常见的操作,用于将无符号数的低位扩展到更高的位数上,以便进行算术或逻辑运算。

关于分支(br, branch)的分析:

  • for(i = 0; i < 3; i++),i是循环变量
  • i最大值3(i=2时有效),所以占2bit
  • i被扩展为64bit,只是在HLS工具中生效,并不代表硬件实现

2.2.4 数组操作解释

从C综合报告来看,xin和yo均被映射为存储器。与FIFO的直接读取不通,操作存储器牵涉到寻址操作。

* SW-to-HW Mapping
+----------+--------------+---------+----------+
| Argument | HW Interface | HW Type | HW Usage |
+----------+--------------+---------+----------+
| xin      | xin_address0 | port    | offset   |
| xin      | xin_ce0      | port    |          |
| xin      | xin_q0       | port    |          |
| a        | a            | port    |          |
| b        | b            | port    |          |
| yo       | yo_address0  | port    | offset   |
| yo       | yo_ce0       | port    |          |
| yo       | yo_we0       | port    |          |
| yo       | yo_d0        | port    |          |
+----------+--------------+---------+----------+

存储器操作步骤:

  • xin_addr(getelementptr), get element pointer, 获取指针的偏移量,即xin数组的寻址地址。
  • rhs(load),右值是指赋值语句中的值或表达式。

该操作通常用于访问数组、结构体或其他复合数据类型中的元素,以实现指针的偏移和访问。

对于yo的操作遵循同样的逻辑。

2.2.5 a*xin[i] 解释

a*xin[i]共包含五个操作: 

  • 从lhs(sext)_In10(sext)中取得a的值
  • 从sext_In232(sext)中取得xin[i]的值
  • ret_V(*)执行乘法运算

3. 总结

简而言之,Vitis HLS中的schedule viewer是设计和优化硬件加速器过程中的一个关键工具,它通过提供算法执行的详细视图,帮助设计者理解、分析和优化他们的设计。

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

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

相关文章

# Windows 环境变量 Path 显示样式更改

Windows 环境变量 Path 显示样式更改 1、传统 Path 环境变量显示&#xff1a; ---》键盘上按【WIN I 】打开系统【设置】 ---》依次点击 ---》【系统】 ---》【系统信息】 ---》【高级系统设置】 ---》【高级】 ---》【环境变量】。或者依次点击&#xff1a; ---》右键 【我…

利用kimi等大模型进行运维参数解析和调优

在运维时&#xff0c;经常遇到很多参数&#xff0c;有些参数不知道意义&#xff0c;知道意义的也有些不知道合理参考值是多少。利用kimi等大模型来当老司机&#xff0c;轻松解决运维难题。 例如在运维hive参数时&#xff0c;有些不知道作用&#xff0c;提示次如下 你的角色是…

iOS上的UI是如何渲染出来的? 深入浅出UIKit渲染

我们在代码中写的View、Image等组件&#xff0c;最终是如何一步步渲染到屏幕上的呢&#xff1f;触摸、动画等是如何实现的&#xff1f;我们可以利用这些知识做哪些优化呢&#xff1f; 本文先从屏幕物理层原理出发&#xff0c;一步步介绍渲染流程&#xff0c;然后介绍iOS的UIKi…

go idea 不同区域的字体行距设置

1、代码区域的设置&#xff1a; 2、左侧project导航栏的设置&#xff1a; 3、问&#xff1a;go idea 底部的窗口&#xff0c;比如run、terminal、debug、version control等的设置&#xff1a;

pytorch 实现语义分割 PSPNet

语意分割是指一张图片上包含多个物体&#xff0c;通过语义分割可以识别物体分类、物体名称、像素识别的任务。和物体检测不同&#xff0c;他不会将物体框出来&#xff0c;而是根据像素的归属把物体标注出来。PSPNet 的输入是一张图片&#xff0c;例如300500&#xff0c;那么输出…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别&#xff1a; 默认输出级别为1&#xff0c;需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7&#xff0c;第二行把输出方式该为“serial”串口输出

QT:小项目:登录界面 (下一个连接数据库)

一、效果图 登录后&#xff1a; 二、项目工程结构 三、登录界面UI设计 四主界面 四、源码设计 login.h #ifndef LOGIN_H #define LOGIN_H#include <QDialog>namespace Ui { class login; }class login : public QDialog {Q_OBJECTpublic:explicit login(QWidge…

区块链技术下的DApp与电商:融合创新,开启商业新纪元

区块链技术的蓬勃发展正引领着一种新型应用程序的崛起——去中心化应用程序&#xff08;DApp&#xff09;。DApp并非传统的中心化应用&#xff0c;它构建于去中心化网络之上&#xff0c;融合了智能合约与前端用户界面&#xff0c;为用户提供了全新的交互体验。智能合约&#xf…

Leetcode—1146. 快照数组【中等】(ranges::lower_bound、std::prev函数)

2024每日刷题&#xff08;121&#xff09; Leetcode—1146. 快照数组 思路 题意很绕&#xff0c;解释一下&#xff1a; 拍一次照&#xff0c;复制出一个新数组&#xff0c;set 都在这个新的上面进行get 目标是得到第 id 个数组的特定位置的值 实现代码 class SnapshotArray…

ROS 2边学边练(39)-- 调试tf2

前言 这节还是围绕tf2来进行&#xff0c;只不过针对调试相关&#xff0c;把之前有过一面之缘的问题再次拿出来重点说明一下&#xff0c;此过程中我们会碰到之前几期中认识但还不怎么熟络的朋友比如tf2_echo、tf2_monitor、view_frames。 动动手 我们会利用一个有不少问题的例子…

Python-100-Days: Day06 Functions and Modules

函数的作用 编程大师Martin Fowler先生曾经说过&#xff1a;“代码有很多种坏味道&#xff0c;重复是最坏的一种&#xff01;”&#xff0c;要写出高质量的代码首先要解决的就是重复代码的问题。可以将特定的功能封装到一个称之为“函数”的功能模块中&#xff0c;在需要的时候…

JavaScript代码挑战#4

// 编程挑战 #4 /* 朱莉亚和凯特仍在研究狗&#xff0c;这次她们研究的是狗是否吃得太多或太少。 吃得太多意味着狗当前的食物份量比推荐份量大&#xff0c;吃得太少则相反。 吃得适量意味着狗当前的食物份量在推荐份量的正负 10% 的范围内&#xff08;参见提示&#xff09;。 …

企业邮箱哪个性价比高?2024年国内五大企业邮箱功能、价格对比

对于企业来说&#xff0c;更换企业邮箱的成本很高&#xff0c;包括企业邮箱数据迁移&#xff0c;新的通讯录导入等&#xff0c;都会耗时耗力。那么选择能稳定且性价比高的企业邮箱就至关重要&#xff0c;国内的Zoho Mail企业邮箱、网易企业邮箱、阿里企业邮箱、腾讯企业邮箱和新…

2024年宠物行业未来发展趋势(宠物行业增长风口深度报告)

近期&#xff0c;小红书联合第一财经发布了宠物行业洞察报告。报告中指出了宠物行业的三大消费新趋势&#xff1a;科学养宠、专宠专用和双向奔赴。而实际上&#xff0c;这三大趋势在2024年已经有明显的凸显。 趋势一&#xff1a;科学养宠 科学养宠主要体现在宠物主粮的选择上&…

Linux进程概念(七):进程替换 自主shell的编写

目录 进程替换 六种替换函数 自主shell的编写 shell解析命令行字符串的过程 创建makefile 打印输出命令行 获取与分割命令行字符串 多次执行命令 完善工作 完整代码 进程替换 原因&#xff1a;fork创建子进程后&#xff0c;执行的是和父进程相同的代码&#xff0c;…

Spring6 当中 获取 Bean 的四种方式

1. Spring6 当中 获取 Bean 的四种方式 文章目录 1. Spring6 当中 获取 Bean 的四种方式每博一文案1.1 第一种方式&#xff1a;通过构造方法获取 Bean1.2 第二种方式&#xff1a;通过简单工厂模式获取 Bean1.3 第三种方式&#xff1a;通过 factory-bean 属性获取 Bean1.4 第四种…

一例MFC文件夹病毒的分析

概述 这是一个MFC写的文件夹病毒&#xff0c;通过感染USB设备传播&#xff0c;感染后&#xff0c;会向c2(fecure.info:443)请求指令来执行。 样本的基本信息 Verified: Unsigned Link date: 19:52 2007/7/5 MachineType: 32-bit MD5: 4B463901E5858ADA9FED28FC5…

基于SpringBoot+Vue笔记记录分享网站设计与实现

项目介绍&#xff1a; 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代…

Docker-Compose单机多容器应用编排与管理

前言 Docker Compose 作为 Docker 生态系统中的一个重要组件&#xff0c;为开发人员提供了一种简单而强大的方式来定义和运行多个容器化应用。本文将介绍 Docker Compose 的使用背景、优劣势以及利用 Docker Compose 简化应用程序的部署和管理。 目录 一、Docker Compose 简…

闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子

前言 一个在实际应用中 EF Core 集成 FluentValidation 进行数据校验的例子。 Step By Step 步骤 创建一个 Asp.Net Core WebApi 项目 引用以下 Nuget 包 FluentValidation.AspNetCore Microsoft.AspNetCore.Identity.EntityFrameworkCore Microsoft.EntityFrameworkCore.Re…