当前位置: 首页 > news >正文

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_MALLOClong long *out_accum = malloc(sizeof(long long));int *array_local = malloc(64 * sizeof(int));
#elselong long _out_accum;long long *out_accum = &_out_accum;int _array_local[64];int *array_local = &_array_local[0];
#endifint 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分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。

相关文章:

  • 活久见!谁想的这种办法让大模型PK
  • 最新下载:Paragon NTFS for Mac 15【软件附加安装教程】
  • RK3588开发笔记-100M网口自协商成1000M网口
  • pdf压缩到指定大小的简单方法
  • 《Foundation CSS 参考手册》
  • 探索微软Edge
  • bugku---misc---赛博朋克
  • 2024年第三届数据统计与分析竞赛(B题)数学建模完整思路+完整代码全解全析
  • ArrayList浅析
  • Linux系统 DM8安装 达梦数据库
  • window系统下为django自动绘制模型类关系图
  • 【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——上
  • stm32_HAL_CAN(特点:广播试,检测线路是否空,id有优先级)
  • java数组ArrayList迭代修改的ConcurrentModificationException错误
  • linux-awk分析指令
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Apache Pulsar 2.1 重磅发布
  •  D - 粉碎叛乱F - 其他起义
  • ES6 学习笔记(一)let,const和解构赋值
  • Java IO学习笔记一
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • mysql 5.6 原生Online DDL解析
  • Redis中的lru算法实现
  • Spring Boot快速入门(一):Hello Spring Boot
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 收藏好这篇,别再只说“数据劫持”了
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • $ git push -u origin master 推送到远程库出错
  • (10)ATF MMU转换表
  • (70min)字节暑假实习二面(已挂)
  • (BFS)hdoj2377-Bus Pass
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Linux下编译安装log4cxx
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .bat批处理(一):@echo off
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • /3GB和/USERVA开关
  • /etc/motd and /etc/issue
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @RunWith注解作用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [20180224]expdp query 写法问题.txt
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [APIO2015]巴厘岛的雕塑
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [iHooya]2023年1月30日作业解析