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://www.rhkb.cn/news/319633.html

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

相关文章

【C++】详解STL的容器之一:list

目录 简介 初识list 模型 list容器的优缺点 list的迭代器 常用接口介绍 获取迭代器 begin end empty size front back insert push_front pop_front push_back pop_back clear 源代码思路 节点设计 迭代器的设计 list的设计 begin() end() 空构造 ins…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…

Mybatis进阶2

Mybatis进阶1-CSDN博客 Mybatis入门-CSDN博客 Mybatis入门2-CSDN博客 我们接下来要学习Mybatis的高级查询 我们先在数据库中准备我们需要的数据表 teacher表 课程表&#xff1a;与教师表是一对多的关系&#xff0c;所以有一个外键字段 学生表 由于学生表和课程表是多对多的…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习四

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

支付宝支付流程

第一步前端&#xff1a;点击去结算&#xff0c;前端将商品的信息传递给后端&#xff0c;后端返回一个商品的订单号给到前端&#xff0c;前端将商品的订单号进行存储。 对应的前端代码&#xff1a;然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

【JavaEE 初阶(一)】初识线程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.进程3.线程4.线程和进程的区别5.Thread创建线程5.1继承Thread创建线程5.2实现R…

从零开始:Django项目的创建与配置指南

title: 从零开始&#xff1a;Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tags: DjangoWebDevPythonORMSecurityDeploymentOptimization Django简介&#xff1a; Django是一个开源的高级Python Web框架&#xff…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

Delta lake with Java--使用stream同步数据

今天继续学习Delta lake Up and Running 的第8章&#xff0c;处理流数据&#xff0c;要实现的效果就是在一个delta表&#xff08;名为&#xff1a;YellowTaxiStreamSource&#xff09;插入一条数据&#xff0c;然后通过流的方式能同步到另外一个delta表 &#xff08;名为&#…

LeetCode题练习与总结:分隔链表--86

一、题目描述 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2]…

神经网络的优化器

神经网络的优化器是用于训练神经网络的一类算法&#xff0c;它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用&#xff1a; 参数更新&#xff1a;优化器通过计算损失函数相对于权重参数的…

ngrinder项目-本地调试遇到的坑

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

从零开始学AI绘画,万字Stable Diffusion终极教程(二)

【第2期】关键词 欢迎来到SD的终极教程&#xff0c;这是我们的第二节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在第一节课里面&#xff0c;我们…

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

总分420+专业140+哈工大哈尔滨工业大学803信号与系统和数字逻辑电路考研电子信息与通信工程,真题,大纲,参考书。

考研复习一路走来&#xff0c;成绩还是令人满意&#xff0c;专业803信号和数电140&#xff0c;总分420&#xff0c;顺利上岸&#xff0c;总结一下自己这一年复习经历&#xff0c;希望大家可以所有参考&#xff0c;这一年复习跌跌拌拌&#xff0c;有时面对压力也会焦虑&#xff…

【iOS】KVC

文章目录 前言一、KVC常用方法二、key与keypath区别key用法keypath用法 三、批量存值操作四、字典与模型相互转化五、KVC底层原理KVC设值底层原理KVC取值底层原理 前言 KVC的全称是Key-Value Coding&#xff0c;翻译成中文叫做键值编码 KVC提供了一种间接访问属性方法或成员变…

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

杭电acm2018 母牛的故事 Java解法 经典递归

标准递归题 先模拟 接着找递归出口 再找递归通式 想想看 今天的母牛等于前一天的母牛数加上今天出生的母牛 而三天前的母牛所有母牛都能生一头 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);l…