Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录

1. 前文回顾

1.1 简单背后的复杂

1.2 复杂性的来源

2. 关键代码

2.1 功能概述

2.2 关系梳理

2.3 理解构造函数二

2.4 理解HLS_CONSTEXPR

2.5 理解const volatile

3. 探究ap_int<8>  c;经历了什么

4. 在调试中查看


1. 前文回顾

在《Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(1)》一篇中,我已经对ap_int.h / ap_fixed.h中定义的数据类型、用法示例以及它们的重要性和基本应用进行了初步的讲解。继此基础上,本文将深入分析和探索这些数据类型的实现机制。

1.1 简单背后的复杂

ap_int数据类型,虽然在其实现功能上非常简单——即定义FPGA中某个变量的大小所占的位宽——但其基于C++的实现和应用背后蕴含着高效和灵活的设计理念。这种数据类型是为了满足硬件设计中对精确位宽控制的需求而设计的,特别是在使用高级综合工具(如Vitis HLS)进行FPGA开发时,精确的位宽控制可以显著影响生成硬件的性能和资源利用率。

为了实现精确的位宽控制和高效的硬件映射,ap_int.h和ap_fixed.h在其实现代码中确实展现了相当的复杂性。

1.2 复杂性的来源

ap_int.h / ap_fixed.h之所以复杂,主要是因为它们需要在提供强大功能的同时,确保能够有效地映射到硬件实现:

任意位宽的支持:支持从1位到几千位的任意位宽,这在标准的C++数据类型中是无法实现的。

高效的硬件操作:提供了一系列优化的运算符和函数,以确保生成的硬件既高效又节省资源。

精确的资源控制:允许开发者精确控制硬件实现的资源使用情况,对于满足严格的资源约束条件非常关键。

模拟和综合的兼容性:确保代码在模拟(软件仿真)和综合(硬件实现)时都能正确工作,涉及到复杂的底层实现细节。

这篇文章的目的,正是要揭开ap_int.h和ap_fixed.h这两个强大工具的神秘面纱,更好地理解其背后的原理和应用方式。

2. 关键代码

2.1 功能概述

template <int _AP_W>
struct ap_int : ap_int_base<_AP_W, true>
{typedef ap_int_base<_AP_W, true> Base; //重命名,方便后续引用INLINE ap_int() {} // 构造函数一:参数为空,执行为空template <int _AP_W2>HLS_CONSTEXPR INLINE ap_int(const ap_int<_AP_W2>& op): Base((ap_int_base<_AP_W2, true>)op){op.checkOverflowCsim(_AP_W, true);Base::V = op.V;}template <int _AP_W2>INLINE ap_int(const volatile ap_int<_AP_W2>& op) {const_cast<const ap_int<_AP_W2>& >(op).checkOverflowCsim(_AP_W, true);Base::V = op.V;}
…

这段代码是ap_int结构体的一部分,展示了其构造函数的定义。ap_int是一个模板结构体,用于表示固定宽度的整数类型,其中模板参数_AP_W指定了整数的位宽。这个结构体继承自ap_int_base,后者提供了整数类型的基本操作和属性。

2.2 关系梳理

  • 在调用构造函数时,编译器会根据传递给它的参数类型自动选择合适的构造函数。
  • 如果传递一个 const ap_int<_AP_W2>&             类型的参数,编译器将调用第二个构造函数。
  • 如果传递一个 const volatile ap_int<_AP_W2>& 类型的参数,编译器将调用第三个构造函数。
  • 通过这种方式,编译器可以根据不同的参数类型自动选择正确的构造函数。

2.3 理解构造函数二

HLS_CONSTEXPR INLINE ap_int(const ap_int<_AP_W2>& op)  :  Base((ap_int_base<_AP_W2, true>)op)

这里的冒号是 C++ 中的构造函数初始化列表语法,表示在构造函数中先初始化基类 Base,再执行构造函数的函数体。
在该语句中,构造函数初始化列表的部分为 Base((ap_int_base<_AP_W2, true>)op),表示调用 Base 的构造函数,并将 (ap_int_base<_AP_W2, true>)op 强制转换为 _AP_W2 位宽的有符号整数类型作为参数传递给该构造函数,从而实现了将 op 转换为当前对象的初始化过程。
该构造函数初始化列表中的语句执行完成后,才会执行构造函数的函数体。

2.4 理解HLS_CONSTEXPR

它是一个 C++ 关键字,表示在编译时可以计算的常量表达式。
表明该构造函数ap_int可以在编译时进行计算,并且返回的结果是常量,不会在运行时进行计算。
使用 HLS_CONSTEXPR 关键字提可以帮助编译器对代码进行更好的优化,提高程序的执行效率。
HLS_CONSTEXPR 关键字只能用于满足特定条件的函数和变量,函数只包含常量表达式、仅依赖于常量等条件,否则会导致编译错误。

2.5 理解const volatile

INLINE ap_int(const volatile ap_int<_AP_W2>& op) //参数op在函数内部不会被修改,但在外部可能会被修改。
  • const 修饰常量引用,修饰后的对象op在函数内部不会被修改。
  • volatile 修饰易变对象,它可能在函数外被其他代码(如中断服务程序)修改。编译器不应优化访问该对象的代码,以防止在读取它时获取过时的值。volatile 关键字通常用于处理硬件寄存器和多线程编程中的共享变量。

3. 探究ap_int<8>  c;经历了什么

废话不多说,直接上关系图:

详解:

  • 在文件<ap_int.h>中,找到ap_int最顶层的调用
  • 顺藤摸瓜,找到ap_int的基类实现,<ap_int_base.h>中的ap_int_base
  • ap_int_base又是继承自_AP_ROOT_TYPE
  • <ap_common.h>中,宏定义#define _AP_ROOT_TYPE ssdm_int_sim表明两者等效
  • 通过ssdm_int_sim,可以找到class ap_private;为其成员变量
  • ap_private为“最基本”的类,在<ap_private.h>中

注:ssdm_int_sim, System-Level Synthesis Design and Modeling Integer Simulation

4. 在调试中查看

ap_int.h / ap_fixed.h中定义的结构体非常复杂,可以在单步调试中查看某个变量的数值。

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

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

相关文章

使用 npm 工具高效更新项目依赖包

团队内部会用工具定时检查包的最新版本并通知&#xff0c;以便我们及时跟进社区进展&#xff0c;避免和技术栈出现版本脱节导致无法使用最新特性和优化内容 这里只说明手动查看和更新包的主要几个命令。 npm outdated&#xff1a;检查项目中过时的依赖包及其最新版本。 npm i…

基于Canvas实现的简历编辑器

基于Canvas实现的简历编辑器 大概一个月前&#xff0c;我发现社区老是给我推荐Canvas相关的内容&#xff0c;比如很多 小游戏、流程图编辑器、图片编辑器 等等各种各样的项目&#xff0c;不知道是不是因为我某一天点击了相关内容触发了推荐机制&#xff0c;还是因为现在Canvas…

计算机网络 Cisco路由器基本配置

一、实验内容 1、按照下表配置好PC机IP地址和路由器端口IP地址 2、配置好路由器特权密文密码“abcd&#xff0b;两位班内序号”和远程登录密码“star” 3、验证测试 a.验证各个接口的IP地址是否正确配置和开启 b.PC1 和 PC2 互ping c.验证PC1通过远程登陆到路由器上&#…

【深度学习】深度学习md笔记总结第5篇:神经网络与tf.keras,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

数字乡村创新实践推动农业现代化发展:科技赋能农业产业升级、提升农民收入水平与乡村治理效能

随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;数字乡村创新实践已成为推动农业现代化发展的重要引擎。数字技术的广泛应用不仅提升了农业生产的智能化水平&#xff0c;也带动了农民收入的增加和乡村治理的现代化。本文旨在探讨数字乡村创新实践如何科技赋能农业产…

2016NOIP普及组真题 4. 魔法阵

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1976 本题作为第四题&#xff0c;想拿满分有难度。但是暴力拿些分还是做得到的。 满分需要用 前缀和 来化简for循环。 核心语句&#xff1a; $ x_a < x_b < x_c < x_d $ ① $ …

vue webpack打包配置生成的源映射文件不包含源代码内容、加密混淆压缩

前言&#xff1a;此案例使用的是vue-cli5 一、webpack源码泄露造成的安全问题 我们在打包后部署到服务器上时&#xff0c;能直接在webpack文件下看到我们项目源码&#xff0c;代码检测出来是不安全的。如下两种配置解决方案&#xff1a; 1、直接在项目的vue.config.js文件中加…

Android 使用ping命令判断当前网络状态

一. 介绍 ping命令是用来测试和诊断网络连接问题的基本命令&#xff0c;当然我们的终端设备&#xff08;手机/平板/车机&#xff09;都可以用这个命令来判断当前网络是否有流量的状态&#xff0c;本篇文章主要介绍Linux的ping命令&#xff0c;因为Android系统也是使用了Linux内…

OpenAI官宣位于东京的首个亚洲办公室,并将发布专为日语优化的GPT-4定制模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半&#xff0c;AI大模型标志性的应用相继出现&#xff0c;从ChatGPT到Sora一次次刷新人们的认知。震撼的背后&#xff0c;是大模型参数指数级的增长。 这种数据暴涨的压力&#xff0c;快速传导到了大模…

Unity 3D定点数物理引擎实战系列:BEPU物理引擎碰撞计算与碰撞规则的架构与设计

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时&#xff0c;如何灵活的控制物理碰撞&#xff0c;本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个…

HTML的超链接

前言&#xff1a; 如图&#xff0c;我们在浏览网页时经常可以看到这样的字体&#xff08;点击便跳转到了别的地方了&#xff09;&#xff0c;今日就和各位一起学习一下超链接的相关知识。 相关知识1&#xff1a; 超链接的标签为&#xff1a;a ~使用格式为&#xff1a; <a h…

node.js服务器静态资源处理

前言&#xff1a;node.js服务器动态资源处理见 http://t.csdnimg.cn/9D8WN 一、什么是node.js服务器静态资源&#xff1f; 静态资源服务器指的是不会被服务器的动态运行所改变或者生成的文件. 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平…

单元测试四大过程

单元测试四大过程&#xff08;蓝桥课学习笔记&#xff09; 单元测试过程 单元测试是软件测试过程中的一个关键环节&#xff0c;它与集成测试、系统测试一样&#xff0c;分为测试策划、测试设计、测试执行和测试总结几个阶段。 单元测试过程中每个阶段需要完成的主要工作如下&…

数据结构排序算法

排序也称排序算法(SortAlgorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 分类 内部排序【使用内存】 指将需要处理的所有数据都加载到内部存储器中进行排序插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 交换排序 冒泡排序快速…

用html写文本变形动画

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文本变形动画</title><link rel"stylesheet" href"./style.css"> </head> <body> <!-- 两个文本部分…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

记录flume运行时报NullPointerException异常

【背景说明】 我要起一个将kafka上的topic_log主题中的数据上传到hdfs上的flume进程。 这是我的flume配置文件脚本&#xff1a; #定义组件 a1.sourcesr1 a1.channelsc1 a1.sinksk1#配置source1 a1.sources.r1.type org.apache.flume.source.kafka.KafkaSource a1.sources.r…