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

目录

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://xiahunao.cn/news/2998748.html

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

相关文章

一、初识Django

简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。 版本对应 不同版本的django框架是基于特定的不同的python版本开发的&#xff0c;所以不同版本的django框架要正常执行功能只能安装特定的python版本 Django安装 安装 Django # 全局安装 pip install dj…

第一个Cython程序-helloworld

Cython是Python的一个模块&#xff0c;可以将python语言“翻译”成C语言。 如何安装&#xff1f; python -m pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/ 新建两个文件helloworld.pyx和setup.py。 helloworld.pyx print("hello world")setu…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

【触摸案例-事件的产生和传递 Objective-C语言】

一、事件的产生和传递 1.事件的产生和传递 1)涉及到的两个方法 2)响应者链条 这个东西呢,比较绕,然后我们接下来一块儿来看一下啊, 我们把上午最后的一份代码,复制粘贴一下,改个名字,叫做“05-事件的产生和传递”, 首先,我们上午说了一下,这个hit test这个方法,…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

Git中单独的功能特性分支是什么含义

在Git中&#xff0c;一个"功能特性分支"&#xff08;通常简称为“特性分支”&#xff09;是指从主开发分支&#xff08;比如main或master&#xff09;独立出来的分支&#xff0c;专门用于开发一个新功能、修复一个bug&#xff0c;或者进行实验性的尝试。使用特性分支…

LT9611单/双端口 MIPI CSI/DSI 转 HDMI 1.4 发射器,龙迅方案

1. 描述LT9611 MIPI DSI/CSI 至 HDMI1.4 桥接器具有双端口 MIPI D-PHY 接收器前端配置&#xff0c;每个端口有 4 个数据通道&#xff0c;每个数据通道以 2Gbps 的速度工作&#xff0c;最大输入带宽为 16Gbps。该桥接器提供一个 HDMI 数据输出&#xff0c;具有可选的 SPDIF 或 8…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

Java将文件目录转成树结构

在实际开发中经常会遇到返回树形结构的场景&#xff0c;特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中&#xff0c;将List<String>转换成树状结构&#xff0c;需要定义一个树节点类&#xff08;TreeNode&#…

【前端】表格合并如何实现?

简言 介绍实现表格合并的一种方法。 表格合并 表格合并操作是一个比较复杂的操作&#xff0c;它主要分为以下步骤&#xff1a; 获取选中区域选择合并显示的单元格实现合并操作。 我们就逐一实现这三步&#xff0c;最后实现一个较完整的合并操作。&#xff08;不考虑边界情…

《ElementPlus 与 ElementUI 差异集合》el-dialog 显示属性有差异

ElementPlus 用属性 v-model ElementUI 用属性 visible 其实也是 Vue2/Vue3 的差异&#xff1a;v-model 指令在组件上的使用已经被重新设计&#xff0c;替换掉了 v-bind.sync

【酱浦菌-爬虫项目】爬取学术堂论文信息

1. 首先&#xff0c;代码定义了一个名为 url 的变量&#xff0c;它是一个包含三个网址的集合&#xff08;或者说是一个集合的字典&#xff09;。这些网址分别是&#xff1a; - ‘http://www.xueshut.com/lwtimu/127966.html’ - ‘http://www.xueshut.com/lwtimu/12…

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

【AIGC调研系列】LLaVA++整合Phi-3和Llama-3能够实现什么

LLaVA能够为Phi-3和Llama-3带来的主要好处包括&#xff1a; 视觉处理能力的增强&#xff1a;通过整合Phi-3和Llama-3模型&#xff0c;创建了具备视觉处理能力的Phi-3-V和Llama-3-V版本&#xff0c;这意味着这些模型现在能够理解和生成与图像相关的内容[1]。这种能力的增加&…

天冕科技亮相第十七届深圳国际金融博览会!

第十七届深圳国际金融博览会在深圳会展中心正式开幕&#xff0c;天冕科技跟随南山区组团集体亮相&#xff0c;充分展现金融活力。此次金博会&#xff0c;南山区政府共遴选了包括天冕科技在内的三家优秀金融科技企业组团参展&#xff0c;以特色与创新的案例展示了辖区金融业发展…

Eclipse:-Dmaven.multiModuleProjectDirectory system propery is not set.

eclipse中使用maven插件的时候&#xff0c;运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 可以设一个环境变量M2_HOME指向你的maven安装目录 M2_HOMED:\Apps\…

python数据可视化:雷达图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 雷达图 选择题 关于以下代码输出的雷达图中&#xff0c;以下说法正确的是&#xff1f; import numpy as np import matplotlib.pyplot as plt from pylab impor…

Linux环境下的编译和调试

本文目录 一、编译1. gcc/g编译器2. gcc安装3. 代码编译过程4. gcc编译 二、调试1. 下载gdb调试器2. gdb 调试器使用步骤 一、编译 1. gcc/g编译器 对于.c 格式的 C 文件&#xff0c;可以采用 gcc 或 g编译。 对于.cc、.cpp 格式的 C文件&#xff0c;应该采用 g进行编译。 2…

【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…