Vitis HLS 学习笔记--移除内存分配malloc

目录

1. 简介

2. 示例解析

2.1 源码解释

2.2 malloc 分析

2.3 替代方案分析

3. 总结


1. 简介

Vitis HLS 也不支持动态创建或删除 C/C++ 对象(用于综合)。

本文探究如何在C/C++代码中避免使用显式的malloc函数来分配内存。在硬件设计和FPGA开发中,避免动态内存分配是一个常见的实践。

通过一个例子,了解 malloc 被用于动态分配内存,但是在 USE_MALLOC 未定义的情况下,代码使用了栈上的局部变量来代替。

2. 示例解析

2.1 源码解释

#include <stdlib.h>

long long example(int din[32], int width) {

#ifdef USE_MALLOC
    long long *out_accum = malloc(sizeof(long long));
    int *array_local = malloc(64 * sizeof(int));
#else
    long long _out_accum;
    long long *out_accum = &_out_accum;
    int _array_local[64];
    int *array_local = &_array_local[0];
#endif
    int i, j;

LOOP_SHIFT:
    for (i = 0; i < 31; i++) {
        if (i < width)
            *(array_local + i) = din[i];
        else
            *(array_local + i) = din[i] >> 2;
    }
    *out_accum = 0;

LOOP_ACCUM:
    for (j = 0; j < 31; j++) {
        *out_accum += *(array_local + j);
    }

  return *out_accum;
}

函数 example 接受一个整数数组 din 和一个选择宽度 width 作为参数。它通过两个循环处理数组:第一个循环 LOOP_SHIFT 根据 width 值对数组元素进行移位操作,第二个循环 LOOP_ACCUM 累加处理后的数组元素到 out_accum。最终,函数返回累加的结果。

2.2 malloc 分析

首先了解 malloc 的用途:

long long *out_accum = malloc(sizeof(long long));

这句代码声明了一个指向long long类型的指针out_accum,并使用malloc函数为它分配了足够存储一个long long类型数据的内存空间。sizeof(long long)是计算long long类型数据大小的操作,确保分配的内存正好可以存放一个long long类型的值。

int *array_local = malloc(64 * sizeof(int));

这句代码声明了一个指向int类型的指针array_local,并使用malloc函数为它分配了足够存储64个int类型数据的内存空间。64 * sizeof(int)是计算64个int类型数据总大小的操作,确保分配的内存可以存放一个包含64个整数的数组。

2.3 替代方案分析

本质上是使用栈内存(stack memory)来替代malloc函数动态分配的堆内存(heap memory)。

  • long long _out_accum; 这行代码在栈上声明了一个long long类型的变量_out_accum。这意味着不需要动态分配内存,因为_out_accum的大小在编译时就已经确定了。
  • long long *out_accum = &_out_accum; 这行代码创建了一个指向_out_accum的指针out_accum。这样,我们就可以像使用动态分配的内存那样使用_out_accum,但实际上它是在栈上分配的,这使得内存的分配和释放更加高效。
  • int _array_local[64]; 这行代码在栈上声明了一个包含64个整数的数组_array_local。与malloc不同,这里不需要在程序运行时分配内存,因为数组的大小在编译时就已经确定了。
  • int *array_local = &_array_local[0]; 这行代码创建了一个指向数组第一个元素的指针array_local。这允许我们通过指针来访问和操作数组,就像它是通过malloc动态分配的一样。

3. 总结

Vitis HLS不支持动态创建或删除C/C++对象,因此开发者必须寻找替代方案。本文通过一个例子展示了如何在不定义USE_MALLOC的情况下,使用栈内存代替堆内存进行内存分配。示例中的函数example通过两个循环处理输入数组,使用栈上的局部变量而非malloc分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

b站视频下载到电脑本地mp4格式,b站视频下载到手机相册

有时候我们想把网站上的视频下载到电脑或手机&#xff0c;其实有多种方法可供选择。本文将详细介绍几种常见的下载方式&#xff0c;并探讨它们的优缺点&#xff0c;帮助读者根据自己的需求选择最适合的下载方法。 方法一&#xff1a; 1、使用 "小白兔视频格式在线转换网站…

LogicFlow 学习笔记——3. LogicFlow 基础 节点 Node

节点 Node LogicFlow 内置了一些基础节点&#xff0c;开发者在实际应用场景中&#xff0c;可以基于这些基础节点&#xff0c;定义符合自己业务逻辑的节点。 认识基础节点 LogicFlow是基于svg做的流程图编辑框架&#xff0c;所以我们的节点和连线都是svg基本形状&#xff0c;…

中电联系列四:rocket手把手教你理解中电联协议!

分享《慧哥的充电桩开源SAAS系统&#xff0c;支持汽车充电桩、二轮自行车充电桩。》 电动汽车充换电服务信息交换 第4部分&#xff1a;数据传输与安全 Interactive of charging and battery swap service information for electric vehicle Part 4:Data transmission and secu…

nosql数据库的特点

NoSQL简介 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守ACID约束。因此…

Redis高性能原理:Redis为什么这么快?

目录 前言&#xff1a; 一、Redis知识系统观 二、Redis为什么这么快&#xff1f; 三、Redis 唯快不破的原理总结 四、Redis6.x的多线程 前言&#xff1a; Redis 为了高性能&#xff0c;从各方各面都进行了优化。学习一门技术&#xff0c;通常只接触了零散的技术点&#xff…

用ChatGPT 4o画漂亮的燃尽图代码

把代码给ChatGPT&#xff0c;然后他就会帮我生成出来了。 而且图是动态的&#xff0c;可以调整颜色文字之类的内容 # Given data for Sprint 5 Progress data_sprint_5 {User Story: [BEAN-40, BEAN-42, BEAN-41, BEAN-22, BEAN-33, BEAN-44, BEAN-10, BEAN-26, BEAN-37, BEA…

【学术小白成长之路】03三方演化博弈(基于复制动态方程)均衡点与稳定性分析

从本专栏开始&#xff0c;笔者正式研究演化博弈分析&#xff0c;其中涉及到双方演化博弈分析&#xff0c;三方演化博弈分析&#xff0c;复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献&#xff0c;总结了现有的研究常用的研究流程&#xff0c;针对每个流程进行拆解。…

Sqlite3入门和c/c++下使用

1. SQLite3基本介绍 1.1 数据库的数据类型 1.2 基本语法 1. 创建数据表格 create table 表名(字段名 数据类型&#xff0c; 字段名 数据类型)&#xff1b; create table student(id int, name varchar(256), address text, QQ char(32)); 2. 插入数据 insert into 表名 valu…

手机流畅运行470亿参数大模型,上交大发布PowerInfer-2推理框架,性能提升29倍

苹果一出手&#xff0c;在手机等移动设备上部署大模型迅速成为行业焦点。 目前&#xff0c;移动设备上运行的模型相对较小&#xff08;苹果的是3B&#xff0c;谷歌的是2B&#xff09;&#xff0c;并且消耗大量内存&#xff0c;这在很大程度上限制了其应用场景。 即使是苹果&…

运营商二要素核验-手机号机主姓名核验接口-运营商二要素核验接口

通过电信运营商验证手机号码与姓名是否一致。广泛用于实名注册、风控审核等场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景。支持携号转网核验。 更新周期&#xff1a;联通T1 电信T3 移动T3~5 均为工作日 接口地址&#xff1a; https://www.wapi.cn/api_de…

RabbitMQ系列-rabbitmq无法重新加入集群,启动失败的问题

当前存在3个节点&#xff1a;rabbitmq5672、rabbitmq5673、rabbitmq5674 当rabbitmq5673节点掉线之后&#xff0c;重启失败 重启的时候5672节点报错如下&#xff1a; 解决方案 在集群中取消失败节点 rabbitmqctl forget_cluster_node rabbitrabbitmq5673删除失败节点5673的…

木头姐预测:2029年特斯拉股价将达2600美元,市值8.2万亿美元

ARK预计特斯拉将在未来两年内推出robotaxi服务&#xff0c;并估计到2029年特斯拉近90%的市值和盈利将归功于robotaxi业务。此外研究表明&#xff0c;FSD模式下的特斯拉比人类驾驶的特斯拉安全约5倍&#xff0c;比道路上的普通汽车安全约16倍。 北京时间12日晚&#xff0c;木头姐…

【课程总结】Day9(上):深度学习基本流程

前言 在上一篇课程《【课程总结】Day7&#xff1a;深度学习概述》中&#xff0c;我们了解到&#xff1a; 模型训练过程→本质上是固定w和b参数的过程&#xff1b;让模型更好→本质上就是让模型的损失值loss变小&#xff1b;让loss变小→本质上就是求loss函数的最小值&#xf…

Java中ArrayList(顺序表)的自我实现(如果想知道Java中怎么自我实现ArrayList,那么只看这一篇就足够了!)

前言&#xff1a;在 Java 编程中&#xff0c;ArrayList 是一种非常常用的数据结构&#xff0c;它提供了动态数组的实现方式&#xff0c;可以方便地存储和操作数据。相比于传统的数组&#xff0c;ArrayList 具有更多的灵活性和便利性&#xff0c;可以根据需要动态地调整大小&…

构建 deno/fresh 的 docker 镜像

众所周知, 最近 docker 镜像的使用又出现了新的困难. 但是不怕, 窝们可以使用曲线救国的方法: 自己制作容器镜像 ! 下面以 deno/fresh 举栗, 部署一个简单的应用. 目录 1 创建 deno/fresh 项目2 构建 docker 镜像3 部署和测试4 总结与展望 1 创建 deno/fresh 项目 执行命令…

嵌套查询(一)-谓词IN、量词ANY、量词ALL

一、在多个表之间进行数据查询&#xff0c;除了可以使用连接查询之外&#xff0c;也可以使用嵌套查询&#xff0c;那么什么是嵌套查询呢&#xff1f;如何使用嵌套查询呢&#xff1f; 1、将一个SELECT-FROM查询&#xff0c;嵌套在另一个SELECT查询语句中&#xff0c;那么这个SE…

响应式企业网站建站系统源码 模版丰富+一站式建站 全开源可二次开发 带源码包+搭建部署教程

系统概述 在数字化转型的浪潮中&#xff0c;企业官网作为品牌展示、产品推广及客户服务的重要窗口&#xff0c;其建设质量直接影响着企业的线上形象与市场竞争力。响应式企业网站建站系统源码的出现&#xff0c;为企业提供了一种高效、灵活且成本可控的建站解决方案。 代码示…

【安装笔记-20240612-Linux-内网穿透服务之cpolar极点云】

安装笔记-系列文章目录 安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 文章目录 安装笔记-系列文章目录安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 前言一、软件介绍名称&#xff1a;cpolar极点云主页官方介绍 二、安装步骤测试版本&#xff1a;openwrt-…

日本旅游回忆录Day1-02三千院

中午回到京都站吃拉面啦&#xff0c;这边的图片由小宝补充&#xff0c;整体味道是不错的啦。时间关系&#xff0c;我不展开了&#xff0c;由小宝补充。 拉面&#xff1a; 下午目的地是三千院。 我们是坐公交车去的&#xff0c;刚刚上车就坐到了靠窗的位置&#xff0c;往深山里…

华为防火墙技术

防火墙技术综合介绍1 时代的认知&#xff1a;这是一个快鱼吃慢鱼的时代&#xff0c;是技术能够成就梦想是时代。 防火墙的认知&#xff1a;网络安全产品&#xff1b;位于网络的边界&#xff08;企事业单位的出口位置与ISP运营商进行连接并接入外网&#xff08;公网的&#xff…