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

2024-06-13 06:28

本文主要是介绍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分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。

这篇关于Vitis HLS 学习笔记--移除内存分配malloc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056517

相关文章

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.