Vivado HLS优化指令使用方法总结

目录

1.内核优化(Kernel Optimization)

2.循环优化(Loop Optimization)

3.数组优化(Array Optimization)

4.其他优化指令


       Vivado HLS是Xilinx公司推出的一款高层次综合工具,用于将C、C++或OpenCL代码转换为可综合的RTL代码。以下是一些常见的Vivado HLS优化指令详解。

1.内核优化(Kernel Optimization)

       PIPELINE:该指令用于对函数或循环进行流水线操作。作用于函数时,可使函数的多个实例在不同的时钟周期内并行执行,从而提高吞吐量。作用于循环时,将循环体中的操作分解到多个时钟周期中执行,允许下一次循环的部分操作在前一次循环尚未完全结束时就开始,大大提高了循环的执行速度。例如在一个数据处理的循环中,使用#pragma HLS PIPELINE可以让数据在流水线中逐个处理,每个时钟周期都能处理新的数据。当作用于循环时有个rewind选项,若设置为true,则在循环结束后会自动将流水线复位到初始状态,以便下一次循环使用相同的硬件资源。

使用方法:

#pragma HLS PIPELINE II=<int> enable_flush=<bool> rewind=<bool>

       INLINE:用于去除函数的层次化,将被调用函数的代码直接嵌入到调用函数中。对于小函数,Vivado HLS通常会自动进行内联处理,这样可以减少函数调用的开销,改善资源消耗,因为内联后不再需要调用函数的相关逻辑,如保存和恢复寄存器等操作。如果不希望某个函数自动内联,可以使用INLINE -off选项来禁止自动内联。

使用方法:

#pragma HLS INLINE off|recursive

        ALLOCATION:定义了函数和相应的RTL module之间的关系,主要用于在相同函数被多次调用时,使能创建多个实例,让这些实例能够并行执行,从而提高系统的性能。例如,在一个有多个数据处理任务的系统中,每个任务都可以通过ALLOCATION创建独立的实例,并行处理不同的数据,提高整体的数据处理速度。

使用方法:

#pragma HLS ALLOCATION instances=<name> limit=<int> function

2.循环优化(Loop Optimization)

UNROLL:将循环体展开为并行操作,通过复制循环体中的电路来实现多个循环迭代的同时执行,从而减少循环的执行时间,提高吞吐量。可以使用factor选项来控制循环被复制成几个并行的部分。例如,#pragma HLS UNROLL factor=4表示将循环展开为 4 个并行的部分,每个部分处理不同的数据,原本需要多个时钟周期完成的循环,现在可以在较少的时钟周期内完成。不过,过度展开可能会导致资源消耗增加。

使用方法:

#pragma HLS UNROLL factor=<N> skip_exit_check=<bool>

LOOP_MERGE:用于将顺序的循环合并在一起。在默认情况下,for 循环会创建额外的状态机,而额外的状态机会占用额外的时钟周期以及额外的资源。通过LOOP_MERGE将相邻的循环合并,可以减少状态机的数量,从而在一定程度上降低延迟,提高性能。例如,有两个相邻的循环,它们操作的数据相关且可以合并为一个循环进行处理,使用LOOP_MERGE指令就可以将它们合并,减少总的时钟周期数。

使用方法:

#pragma HLS LOOP_TRIPCOUNT min=<int> max=<int> avg=<int>

3.数组优化(Array Optimization)

ARRAY_PARTITION:用于将数组分割成不同的部分,以提高数组的访问效率和并行性。有三种分割方式,分别是block、cyclic和complete。
block:将数组按照指定的块大小进行分割,每个块可以独立访问,适用于需要对数组进行分块处理的情况,例如在矩阵运算中,将矩阵按块分割后可以并行处理不同的块。
cyclic:将数组元素循环地分配到不同的块中,分割为指定块数,这种方式可以实现更均匀的数据分布,提高数组的并行访问能力,常用于需要对数组进行随机访问或流水线操作的场景。
complete:将数组的每个元素都分割成独立的部分,每个元素都可以单独进行访问和操作,适用于需要对数组元素进行高度并行处理的情况,但可能会消耗较多的资源。

使用方法:

#pragma HLS ARRAY_PARTITION variable=<name> type=<type> factor=<int> dim=<int>

ARRAY_RESHAPE:将数组的分割与纵向的映射结合在一起,它可以改变数组的结构和布局,以适应硬件实现的需求,提高数据的吞吐量。例如,在一些数据处理算法中,需要将二维数组重新排列成一维数组,或者将数组的维度进行调整,以便更好地利用硬件资源进行并行处理。

使用方法:

#pragma HLS ARRAY_RESHAPE variable=<name> type=<type> factor=<int> dim=<int>

4.其他优化指令

DATAFLOW:可以作用于函数和循环,是一种乒乓操作的方式,它允许顺序执行的任务(如函数、循环等)在数据准备好时就开始执行,而不必等待前一个任务完全完成,从而实现任务之间的交叠执行,提高系统的吞吐量,降低延迟。例如,在一个数据处理流程中,有多个函数依次对数据进行处理,使用DATAFLOW可以让每个函数在有输入数据时就开始处理,而不需要等待上一个函数处理完所有数据,实现数据的流水式处理。

使用方法:

#pragma HLS DATAFLOW disable_start_propagation=<bool>

LATENCY:用于指定完成函数、循环或区域的延迟。通过明确指定延迟要求,可以让编译器根据这个约束来优化设计,例如调整流水线的级数、资源的分配等,以满足特定的延迟指标。例如,对于一个实时性要求较高的系统,需要限制某个函数的执行时间,就可以使用LATENCY指令来指定最大允许的延迟时间,让编译器生成满足该要求的硬件设计。

使用方法:

#pragma HLS LATENCY min=<int> max=<int>

此外,Vivado HLS还提供了一些其他的优化指令,如INTERFACE指令用于将数组具体化为RAM 或者FIFO接口;RESOURCE指令可将数组具体化为单个或双管脚RAM,并能规定RAM的 latency 等。这些优化指令可以根据具体的设计需求和性能目标来灵活使用,以实现高效的硬件设计。在使用Vivado HLS优化指令时,需要综合考虑设计的性能、资源消耗、延迟等多个方面的因素,通过不断地试验和调整,找到最适合具体应用场景的优化方案。

视频课程源:http://xilinx.eetop.cn/category-83 目录 1 从软件工程师的角度来看 FPGA 架构 3 2 Vivado HLS的工作机制 5 3-4 HLS设计流程基本概念 9 5 任意精度数据类型 15 5.1 C语言支持的数据类型 15 5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的定义和初始化 17 6.2 定点数据类型 18 6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示数据类型转换 19 7 Vivado HLS中的复合数据类型 20 7.1 结构体 20 7.2 枚举类型 22 8 Vivado HLS中的C++基本运算 23 9 测试平台的基本架构 25 9.1 Test Bench 25 9.2 C Test Bench 26 10 测试激励 28 11 测试输出检测与格式控制 28 11.1 Scoreboard 28 11.2 输出格式控制 30 12 接口综合基本介绍 33 12.1 接口综合概述 33 12.2 block-level interface protocol和port-level interface protocol 34 13 接口综合之数组 35 14 接口综合案例演示 37 14.1 添加寄存器 37 14.2 添加时钟使能信号 38 14.3 指令优化 38 15 for循环优化-基本性能指标 40 15.1 基本衡量指标 40 15.2 for循环pipeline 41 15.3 for循环UNROLL展开 41 15.4 for循环变量i 42 16 for循环优化-循环合并 42 17 for循环优化-数据流 46 18 for循环优化-嵌套的for循环优化 54 18.1 循环嵌套类型 54 18.2 Perfect loop nest示例 55 18.3 Imperfect loop nest示例 56 19 for循环优化-其他优化方法 59 19.1 for循环的并行性 59 19.2 for循环pipeline时的rewind选项 61 19.3 for循环的循环边界是变量时处理方法 64 20 数组优化-数组分割 67 20.1 数组接口 67 20.2 数组分割 67 21 数组优化-数组映射和重组 69 21.1 数组的映射 69 21.2 数组的重组 72 21.3 综合对比 72 22 数组优化-其他优化方法 72 22.1 定义ROM 72 22.2 数组的初始化 74 23 函数层面优化 75 23.1 代码风格 75 23.2 Inline 75 23.3 Allocation 75 23.3 Dataflow 75 24 总结分析 77 24.1 改善吞吐率(Throughput) 77 24.2 改善时延(Latency) 78 24.3 改善资源(Area) 79
内容概要:本文将金属腐蚀现象比作游戏角色受到持续伤害(debuff),并采用浓度迁移和损伤方程来建模这一过程。文中首先介绍了浓度迁移的概念,将其比喻为游戏中使角色持续掉血的毒雾效果,并展示了如何利用Numpy矩阵存储浓度场以及通过卷积操作实现浓度扩散。接着引入了损伤方程,用于评估材料随时间累积的损伤程度,同时考虑到材料自身的抗性特性。作者还提供了完整的Python代码示例,演示了如何在一个二维网格环境中模拟24小时内金属表面发生的腐蚀变化,最终得到类似珊瑚状分形结构的腐蚀形态。此外,文章提到可以通过调整模型参数如腐蚀速率、材料抗性等,使得模拟更加贴近实际情况。 适合人群:对材料科学、物理化学感兴趣的科研工作者和技术爱好者,尤其是那些希望通过编程手段深入理解金属腐蚀机制的人群。 使用场景及目标:适用于希望借助数值模拟方法研究金属腐蚀行为的研究人员;可用于教学目的,帮助学生更好地掌握相关理论知识;也可作为工程项目前期评估工具,预测不同条件下金属构件可能遭受的腐蚀损害。 阅读建议:由于文中涉及较多数学公式和编程细节,建议读者具备一定的Python编程基础以及对线性代数有一定了解。对于想要进一步探索该领域的学者来说,可以尝试修改现有代码中的参数设置或者扩展模型维度,从而获得更丰富的研究成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值