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

news2024/12/22 23:04:10

目录

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.coloradmin.cn/o/1597915.html

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

相关文章

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型&#xff0c;用于访问控制功能。 通过本指南&#xff0c;我们会了解权限和角色在 Databend 中的基本概念&#xff0c;以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

气象观测站点数据下载与处理

一、下载途径 全国400多个气象站气候数据&#xff08;1942-2022&#xff09; 王晓磊&#xff1a;中国空气质量/气象历史数据 | 北京市空气质量历史数据 气象数据免费下载网站整理 中国气象站观测的气象数据怎么下载 二、R语言处理 2.1 提取站点文件 library(dplyr) library(…

4、XTuner 微调个人小助手(笔记)

视频地址&#xff1a; https://b23.tv/QUhT6ni 课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 1、Finetune 简介 两种Finetune范式 …

LeetCode_丑数

题目&#xff1a; 题解&#xff1a; 由题&#xff0c;我们知道丑数大于0&#xff0c;丑数都可以写成2*2*...*2*3*3...*3*5*5...*5&#xff0c;有了这个基础就很好写代码了。 用三个while循环将前面的2 3 5全部除掉如果这个数是丑数&#xff0c;最后n是等于1的&#xff0c;反之…

Leetcode-48-旋转图像

题目说明 给定一个 n n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明&#xff1a;你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入…

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

Day 14 Classfication (short version) 二分类的时候 用sigmoid 那不就是 logistic 回归嘛&#xff08;softmax 的二分类等价&#xff09; Loss 哦 今天刚学的 &#xff0c;KL散度 &#xff0c;看来cross-entropy 和KL散度是等价的咯~ 我感觉我的直觉没错 这里MSE离得很远的时候…

五、书架开发--5.书架分组功能开发

Dialog和ShelfGroupDialog的基本实现思路&#xff1a; 加入两个组件&#xff0c;一个是Dialog移出分组的弹窗&#xff0c;一个是ShelfGroupDialog&#xff0c;一个是create-api中加入这个ShelfGroupDialog 接下来我们看看这个移动书籍这个对话框的实现原理 如下&#xff0c;用…

Python 标准库functools高阶函数用法

目录 1. partial 用法示例 2. reduce 用法示例 3. total_ordering 用法示例 4. cmp_to_key 用法示例 5. lru_cache 用法示例 6. singledispatch 用法示例 7. update_wrapper 用法示例 8. partialmethod 用法示例 9. singledispatchmethod 用法示例 10. cache 用法示例…

HoloLens2开发时,VS2022的组件和模块配置

HoloLens2开发的时候&#xff0c;VS2022的安装和配置清单&#xff08;有的模块可能不是必须的模块&#xff09; 一、大的模块配置 二、各模块组件的配置

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例——日期类的…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓apk文件签名

一、环境准备 链接: https://pan.baidu.com/s/1D3WxIL5M5ewyFNTqJzARPw 提取码: pd6w 上篇博文编译的apk文件 1、docker build -t android-build:v1.0.1 . 直接制作镜像 2、docker run -it android-build:v1.0.1 /bin/bash 运行进入容器 指定sdk的路径&#xff0c;然后直接…

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,翻译: 一种柔软的粉红…

RESA 车道线检测模型-debug分析

车道线检测模型 RESA 该模型只有一个关键点就是resa模块&#xff0c;把这个想清楚就没什么了&#xff0c;下面看代码 class RESA(nn.Module):def __init__(self, cfg):super(RESA, self).__init__()# self.iter cfg.resa.iter# chan cfg.resa.input_channel# fea_stride c…

绝地求生:PUBG七周年:杜卡迪联动即将到来!

4.13号PUBG官博放出来一个图片让大家猜测是什么东西。 结合之前绝地求生的官方的公告&#xff0c;该载具皮肤毫无疑问就是著名摩托车品牌&#xff1a;杜卡迪。 这篇文章就来简单分析一下本次即将到来的摩托车联动的具体细节。 品牌介绍 杜卡迪&#xff08;Ducati Motor &…

【测试开发学习历程】python常用的模块(中)

目录 5 time模块 5.1、Python中的四种格式的时间&#xff1a; 5.2、time模块中的常用函数 6 I/O流操作 6.1 创建文件 6.2 读取一个文件存入到另外一个文件 6.3 with open as 结构 6.4 open和with open as的区别 7 Excel的操作模块-openpyxl 7.1、新建Excel文件进行读…

PTA 编程题(C语言)-- 判断素数

题目标题&#xff1a; 判断素数 题目作者 陈越 浙江大学 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于…

渗透测试实战——第一站

仅供交流学习使用&#xff0c;请勿用于非法用途 前言&#xff1a;刚学了sql注入&#xff0c;只听理论总感觉没啥用&#xff0c;今天花了一半个多小时&#xff0c;去尝试寻找有漏洞的网站&#xff0c;最终找到了一个&#xff1b;实践是检验真理的唯一标准。 我是通过黑客常用语法…