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

news/2024/5/21 9:49:55

目录

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.mrgr.cn/p/38312007

相关文章

项目7-音乐播放器1+BCrypt加密

1.创建项目 1.1 引入依赖 1.2 yml相关配置 application.yml spring:profiles:active: prod mybatis:mapper-locations: classpath:mapper/**Mapper.xmlconfiguration:map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdO…

牛客Linux高并发服务器开发学习第一天

Linux开发环境搭建 安装Xshell 7远程连接虚拟机的Ubuntu 安装Xftp 7可以传输文件(暂时还没使用) 安装VMware Tools可以直接从Windows系统向虚拟机Linux系统拖拽文件实现文件交互。 安装CScode可以远程连接Linux系统进行代码的编写。&#xff08;Windows系统与Linxu系统公钥…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

云正在使 IT 受益,但对业务却没有好处

云具有巨大的商业价值&#xff01;这是云提供商及其盟友在每次云计算会议上高喊的战斗口号。 您永远不会听到我说“云”始终是正确的解决方案&#xff0c;或者就此而言&#xff0c;是错误的解决方案。 在作为云专家 20 多年的时间里&#xff0c;从来没有盲目追随云计算先驱或…

Python学习从0开始——项目一day01爬虫(二)

Python学习从0开始——项目一day01爬虫&#xff08;二&#xff09; 一、解析response数据二、json转换三、文件保存四、存储json对象五、完整代码 上一篇 一、解析response数据 在已经知道我们获取图片的最终URL存在于请求响应response中&#xff0c;下一步的重点就放在解析re…

[lesson35]函数对象分析

函数对象分析 客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 存在的问题 函数一旦开始调用就无法重来 静态局部变量处于函数内部&#xff0c;外界无法改变函数为全局函数&#xff0c;是唯一的&#xff0c;无法多次独…

【YOLOv9】使用yolov9训练自己的数据集/验证 /推理 /参数分析

完胜V8的SOTA模型Yolov9(论文阅读笔记)内容 点击即可跳转 当今的YOLO系列武林盟主YOLOV9&#xff1a; YOLOv9的优秀表现&#xff1a; 环境&#xff1a; ubuntu20.04&#xff0c;无GPU&#xff0c;使用anaconda3创建的虚拟环境yolov9。 环境安装&#xff1a; conda create -n …

FlinkSQL 实时同步 MySQL

本文主要介绍了使用 FlinkSQL 实现 MySQL 数据的实时同步。准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 fli…

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑 多线程的问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&#xff0c;因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…

FlinkSQL 实时数据同步

准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 flink-connector-jdbc-1.15.4.jar 和 flink-sql-connector-mys…

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后&#xff0c;在解决方案管理器中有五个项目&#xff0c;分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目&#xff0c;除PlantsVsZombies外&#xff0c;其他四个…

FFmpeg: 自实现ijkplayer播放器--06封装打开和关闭stream

文章目录 流程图stream openstream close流程图 stream open 初始化SDL以允许⾳频输出;初始化帧Frame队列初始化包Packet队列初始化时钟Clock初始化音量创建解复用读取线程read_thread创建视频刷新线程video_refresh_threadint FFPlayer::stream_open(const char

3、Git之常用命令

3.1、速查表命令 作用git config --global user.name 用户名 设置用户签名(昵称)git config --global user.email 邮箱 设置用户签名(邮箱)git init 初始化本地库git status 查看本地库状态git add 文件名 添加到暂存区git commit -m "日志信息" 文件名 提交到本…

2024 EasyRecovery三分钟帮你恢复 电脑硬盘格式化

随着数字化时代的到来&#xff0c;我们的生活和工作中越来越依赖于电子设备。然而&#xff0c;电子设备中的数据丢失问题也随之而来。数据丢失可能是由各种原因引起的&#xff0c;如硬盘故障、病毒感染、误删除等。面对这种情况&#xff0c;一个高效、可靠的数据恢复工具变得尤…

codeforce #925 (div3) 题解

D. Divisible Pairs 给出数组 a a a&#xff0c;如果二元组 ( i , j ) (i,j) (i,j)满足 a i a j m o d x 0 & & a i − a j m o d y 0 a_i a_j mod x 0 \&\& a_i - a_j mod y 0 ai​aj​modx0&&ai​−aj​mody0&#xff0c;则beauty。其中 i &…

ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

原文链接&#xff1a;ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601336&idx2&sn10329c394c1d9fb0a4cedec6782e7997&chksmfa820d5fcdf58449bdebaefedbc96eb8c01845e12db5f2d6d5da…

读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试

读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试1. 创造力 1.1. 创造力是一种原动力,它驱使人们产生新的、令人惊讶的、有价值的想法,并积极地将这些想法付诸实践 1.2. 创造出在表面上看似新的东西相对容易 1.3. 在遇到偶然间的创造性行…

计算机网络:数据链路层 - CSMA/CA协议

计算机网络&#xff1a;数据链路层 - CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听…

面试题总结:HashMap底层原理

不仅仅是一道题&#xff0c;之后的某一天&#xff0c;它可能是破局的关键。 关于HashMap的知识点有哪些呢&#xff1f;分层次展示 1.基础知识&#xff1a; 存储键值对结构、底层数据结构、红黑树和链表 2.位运算与实现 位运算、put、get方法的实现 3.关于锁 segment锁和桶锁、线…